引子:
分布式系统中,如何确认一个节点是否工作正常?
 
如果有3副本A、B、C,并通过中心结点M来管理。其中A为主副本。
未接触过分布式的直观的处理方法是在每个副本与中心节点M中维护一个心跳,期望通过心跳是否存在而判断对方是否依旧存活。
心跳方法其实根本无法解决分布式下的这个问题。考虑如下场景:
M在某时刻未能预期收到主节点A的心跳,M认为A已经异常,于是从B、C中选取一个B作为主节点。但实际上A并未异常,而是由于网络瞬时阻塞、或是M本身出现异常使A这消息暂时未收到。这时,系统中出现A、B两个都是主节点的情况,称“双主”问题,从节点C可能同时从这两个主节点同步数据,这会引发很严重的数据错误。
因此,需要更合理的机制来判断节点是否正常工作。
 
 
主要思路有两种:一是设计能容忍双主的分布式协议,二是用lease机制。
一涉及去中心化,不讨论。
 
lease的原理:
lease的思想非常简单,既然中心节点需要获取目标节点是否异常的情况,同时又要考虑网络出问题等异常,那就干脆考虑各种异常情况在内,只单方面给对方一个期限,在这个期限内,我认为你是正常的,不正常也认为正常。超出这个期限,我就认为你异常了。由于网络延迟等原因,这个期限不能使用相对时间,而必须使用绝对时间。比如,1点之间,节点A就是主节点。这样就能避免双主问题。节点A为如果收到这个lease,即得到了中心节点的授权,1点前绝对只有自己是主。心跳依旧照发,只是每次中心节点都只根据lease是否有效来判断节点状况,不会出问题。
 
lease是一种颁发的带期限的承诺,有两方面的意义:颁发者在承诺期限内一定遵守承诺,被颁发者在承诺期限内可放心行使承诺的内容;期限过了以后,被颁发者一定不可再行使承诺。
 
lease与活锁
lease的颁发往往是被动的,比如A节点需要中心节点的某个承诺,比如读并缓存,则会向中心节点请求lease,中心节点回复最新可缓存的数据与一个lease,在此lease期限内,中心节点保证目标节点缓存内容与中心节点一致。
按lease方案,如果中心节点需要修改对应数据,必须等全部lease失效。问题是等lease失效的过程中,可能有新的请求元数据的请求到达,这时中心节点又会继续颁发新的lease,使得lease一直不结束,形成“活锁”,即修改请求等待lease失效,而又源源不断颁发新lease而一直无法完成。
解决活锁的办法:当有修改请求在等待着lease失效时,如果后续有读请求,则只返回请求数据而不颁发新lease,或者是只颁发目前最长的lease。
解决活锁后,修改请求仍然需要等待全部lease结束,写请求可能阻塞太久。可以在写请求到达时,中心节点主动给各节点发取消lease的消息。如果全部正确返回,则写可立即进行。如果有异常,那就正常等待lease结束。
 
lease的容错:
由于仅依赖于绝对时间,因此lease机制天生即可容忍网络、lease接收方的出错。
对于中心节点异常,比如宕机,只需要在颁发者恢复后,等待一个最大lease期限就可保证所有lease失效;另一方面,颁发者宕机可能使得全部节点没有lease,系统处于不可用状态,解决的方法就是使用一个小集群而不是单一节点作为颁发者。
颁发者与被颁发者之间的时钟可能也存在误差,只需要颁发者考虑时钟误差即可。
lease时间长短一般取经验值10秒。太短网络压力大,太长则收回承诺时间过长影响可用性。
 
应用:
GFS中,Master通过lease机制决定哪个是主副本,lease在给各节点的心跳响应消息中携带。收不到心跳时,则等待lease过期,再颁发给其他节点。
Niobe中,主副本持有从副本颁发的lease,当lease过期时,主从分别会在中心节点上标记对方不可用,而中心节点是全局一致的,两者只有一个会成功。如果主成功了,从不可用,需要重新与主同步才能可用;如果从成功了,则自己成为新主。
chubby中,paxos选主后,从节点会给主颁发lease,在期限内不选其他节点为主。另一方面,主节点给每个client节点发送lease,用于判断client死活。
zookeeper中,选主不用lease,而是直接发现没有主则选主。其余和chubby一致。

分布式入门之1:Lease机制的更多相关文章

  1. Hey,man,are you ok? -- 关于心跳、故障监测、lease机制

    电话之于短信.微信的一个很大的不同点在于,前者更加及时,有更快速直接的反馈:而后面两个虽然称之为instant message,但经常时发出去了就得等对方回复,等多久是不确定的.打电话能明确知道对方在 ...

  2. 什么是lease机制?

    分布式系统理论之租约机制学习 一,租约机制介绍 在分布式系统中,往往会有一个中心服务器节点.该节点负责存储.维护系统中的元数据.如果系统中的各种操作都依赖于中心服务器上的元数据,那么中心服务器很容易成 ...

  3. ETCD分布式锁实现选主机制(Golang实现)

    ETCD分布式锁实现选主机制(Golang) 为什么要写这篇文章 做架构的时候,涉及到系统的一个功能,有一个服务必须在指定的节点执行,并且需要有个节点来做任务分发,想了半天,那就搞个主节点做这事呗,所 ...

  4. Spring入门5.事务管理机制

    Spring入门5.事务管理机制 20131126 代码下载 : 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 回顾之前的知识,Spring 最为核心的两个部分 ...

  5. erlang分布式入门(一)-ping pong

    erlang分布式入门(一)-ping pong 测试环境和http://willvvv.iteye.com/blog/1523918 一样,192.168.0.182(centos-182)和192 ...

  6. [源码解析] 并行分布式框架 Celery 之 容错机制

    [源码解析] 并行分布式框架 Celery 之 容错机制 目录 [源码解析] 并行分布式框架 Celery 之 容错机制 0x00 摘要 0x01 概述 1.1 错误种类 1.2 失败维度 1.3 应 ...

  7. 分布式入门之2:Quorum机制

    1.  全写读1(write all, read one) 全写读1是最直观的副本控制规则.写时,只有全部副本写成功,才算是写成功.这样,读取时只需要从其中一个副本上读数据,就能保证正确性. 这种规则 ...

  8. 自定义分布式RESTful API鉴权机制

    微软利用OAuth2为RESTful API提供了完整的鉴权机制,但是可能微软保姆做的太完整了,在这个机制中指定了数据持久化的方法是用EF,而且对于用户.权限等已经进行了封装,对于系统中已经有了自己的 ...

  9. DUBBO分布式入门

    Dubbox框架简介: Dubbox是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo,被国内电商及互联网项目广泛使用,但是后阿里巴巴对该项目停止维护了,当当网后来组建了一个团队一直维护Dubb ...

随机推荐

  1. linux常用命令(三)

    文件搜索命令 which 命令;可以用于查询某个命令所存在的路径,由此可知道谁可以使用它.附加可以看到命令的别名记录,就是在ls的时候会自动对文件夹上色.前面章节讲过. whereis 命令;可以找到 ...

  2. Android课程---添加黑名单的练习(课堂讲解)

    DBHelper.java package com.hanqi.test3; import android.content.Context; import android.database.sqlit ...

  3. [译] jQuery 3 有哪些新东西

    转自:https://github.com/cssmagic/blog/issues/59 jQuery 的横空出世,至今已有十个年头了,而它的长盛不衰显然不是没有理由的.jQuery 提供了极为友好 ...

  4. Ubuntu jdk安装

    1. 创建目录 sudo mkdir /usr/lib/jvm 2. 解压 sudo tar -zxvf jdk-7u60-linux-x64.gz -C /usr/lib/jvm 3. 修改环境变量 ...

  5. java容器collection的一些简单特点

    1.List ArrayList 可随机访问元素,但中间插入和一处元素较慢 LinkedList 在中间进行的插入和删除操作代价较小,随机访问比ArrayList较慢 特性集比ArrayList大 2 ...

  6. 「iOS造轮子」之UIButton 用Block响应事件

    俗语说 一个不懒的程序员不是好程序员 造轮子,也只是为了以后更好的coding. coding,简易明了的代码更是所有程序员都希望看到的 无论是看自己的代码,还是接手别人的代码 都希望一看都知道这代码 ...

  7. <把时间当做朋友>读书笔记

    这本书我早就看过,还想再来一遍 开始这一行动是看李萌在朋友圈晒101计划,每天健身,读书半小时之类的,我也想做点啥,那就每天睡前读书半小时吧,怎么坚持下去呢? 我不想晒到朋友圈里,那就晒给玉玉看吧, ...

  8. ncurses库的一些函数

    为了实现一个简单的聊天程序,如果使用普通的输入输出函数,会很凌乱.so,便想着能不能用下 ncurses这个字符图形库 总结一下,就是这样. 使用ncurses时,先需要初始化窗口,程序结束时,主动调 ...

  9. 记一次【求n以内的素数个数】的优化记录

    最近在leetCode上刷提,还是满锻炼人的,为以后面试打基础吧.不多说下面开始. 问题:求[2,n]之间的素数的个数. 来源:leetCode OJ 提示: Let's start with a i ...

  10. 4. Decision Tree

    一般的,一颗决策树包含一个根结点.若干内部结点和若干叶结点:叶节点对应于决策结果,其他每个结点则对应于一个属性测试:每个结点包含的样本集合根据属性测试的结果被划分到子结点中:根结点包含样本全集.从根结 ...