分布式系统理论之租约机制学习

一,租约机制介绍

在分布式系统中,往往会有一个中心服务器节点。该节点负责存储、维护系统中的元数据。如果系统中的各种操作都依赖于中心服务器上的元数据,那么中心服务器很容易成为性能瓶颈及存在单点故障。而通过租约机制,可以将中心服务器的“权力”下放给其他机器,就可以减轻中心服务器的压力。当然,租约机制还有许多其他的用途:比如,确定集群中结点的状态,还可以实现分布式下的读写锁……

如下图,GFS master颁发租约给某个chunk server,让它成为Primary 副本,当有多个client并发更新数据块时,由Primary副本确定并发更新该数据块的顺序。GFS master 将权力下放给 chunk server,缓解了一定的压力。

当然,也可以将中心服务器(元数据服务器)设计成集群的形式。这样,也避免了中心服务器成为瓶颈问题。比如,消息服务器:RocketMQ。其中生产者和消费者都需要NameServer来确定订阅关系,将NameServer做成无状态的集群,这里就不需要租约机制了。

对于租约而言,就有发布租约方 和 接收租约方。租约规定的内容可以多种多样(这也是租约具有各种应用场景的原因)。发布租约方一般为上面提到的中心服务器,中心服务器保证在租约的有效期内承诺租约规定的内容的保持不变。

比如,分布式缓存系统,元数据服务器(中心服务器)给各个Client发布租约,承诺在租约有效期内不会更改元数据。这样,各个Client只要检查它的租约未过期,就可以直接从本地读取缓存的元数据,而不是每次都访问元数据服务器获得元数据。

二,租约机制分析

①租约机制保证缓存的一致性

服务器发出Lease后,会保证在Lease的有效期内不改变数据。这样,收到Lease的Client在有效期内可以放心地使用数据。在这个有效期内,Client 缓存的数据和 服务器上的数据是一致的。

存在的问题:

1)服务器修改元数据时,需要 阻塞所有的读请求,此时服务器不能发出新的Lease。以防止新发出的Lease保证的数据与服务器刚才修改的数据不一致。

解决方法:读请求到来时,直接返回数据,不颁发Lease

2)服务器需要等待直至所有的Client的Lease都过期后,再才颁发新“修改”后的Lease。因此,此时服务器上的数据修改了,生成了一个新的Lease版本,需要等到Client上所有的老Lease过期后,该新Lease版本才能颁布给Client。

解决方法:服务器主动通知持久Lease的Client放弃当前的Lease,并请求新Lease

另一种缓存一致性的保证方法类似于“租约机制”,当Client请求Server的数据时,Server为Client提供一个“回调承诺”,用于保证当其他Client修改此数据时通知该Client。回调承诺 和 请求的数据都保存在Client端,回调承诺有两种状态:有效和取消。

当Server执行了一个更新数据请求时,它会通知它发送了回调承诺的所有Client,即给Client的端的进程发一个回调(server到client的一个远程过程调用)

,当Client进程收到回调时,它将相关数据的回调承诺标识设置为“取消”。

②租约机制能够很好地容纳网络错误异常

1)Lease颁发过程只依赖于单向的网络通信

服务器颁发Lease后,即使Client没有收到(Client宕机、网络异常),服务器只要等到Lease超时,就可以保证Client不再cache数据,从而可以放心地修改数据而不会破坏cache的一致性。

2)一旦Lease被Client接收,后续Lease机制不再依赖于网络通信。

3)对宕机节点有很好的容错性

颁发Lease的节点宕机了,宕机的颁发者改变不了已经颁发出的Lease的约定,不会影响Lease的正确性。

拥有Lease的节点宕机了,颁发者也不需要做容错处理,只需要等待Lease到期了,就可以收回承诺进行下一步处理。

③租约机制确定节点的状态

在网络中,如何确定某个节点的状态呢?由于网络故障(网络分化)的存在,采用“心跳”机制确定节点的状态会有一些不足。

比如,A、B、C三个节点互为副本,A为primary,Q负责判断A、 B 、C的状态。如果A正常工作,但是A 、Q之间的网络异常,Q也会认为A出现了问题了,于是 Q 重新选择B作为primary,这里会导致“双主”问题。

这里的本质是:Q认为A异常了,但是A自己不认为自己异常。即,由于网络分化造成系统对于“节点状态”认知的不一致。

解决方法有两个:1)可以使用全体协商确定谁为primary(Paxos算法) ,这是一种去中心化协议

2)采用Lease机制

Q收到 A 、B 、C 的heart beat后,给它们颁发一个Lease,表示已经知道了它们的状态,这样 A 、B 、C 可以在有效期内正常工作。同时,Q 可以给 A一个特殊的Lease,表示A可以作为primary工作。当需要切换primary时,只需要等到A的Lease过期,Q给另外节点颁发表示 primary的Lease即可。

三,租约机制在 GFS 的写操作中的作用

  1. We designed the system to minimize the masters involvement in all operations.
    ....
    A mutation is an operation that changes the contents or metadata of a chunksuch as a write or an append operation.
    Each mutation is performed at all the chunks replicas.
  2. We use leases to maintain a consistent mutation order across replicas.
    The master grants a chunk lease to one of the replicas, which we call the primary. The primary picks a serial
  3. order for all mutations to the chunk. All replicas follow this order when applying mutations.

为了减小 master 的负载,master 给某个chunk server 颁发lease,使之成为primary,然后由primary确定 mutation order。

  1. The master may sometimes try to revoke a lease before it expires (e.g., when the master wants to disable mutations on a file that is being renamed).
  2. Even if the master loses communication with a primary, it can safely grant a new lease to another replica after the old lease expires.

这里也采用 “租约机制分析”中讲到的:①master可以在租约还未过期之前 try to revoke a lease。②也可以等到租约过期后,向其他chunk server颁发primary租约(更换primary)。

  1. The lease mechanism is designed to minimize management overhead at the master. A lease has an initial timeout of 60 seconds.

这句话表明,租约减少了master的负载,租约的有效期限是60s

写操作的步骤如下:

1)The client asks the master which chunkserver holds the current lease for the chunk and the locations of the other replicas.

Client向master 请求primary地址和其他chunk server地址

2)The master replies with the identity of the primary and the locations of the other (secondary) replicas.

master返回primary地址及其他chunk server地址。Client可在Lease的有效期内缓存这些信息。

3)The client pushes the data to all the replicas

Client把待修改的数据发给各个chunk server(replicas),这里实现了控制流与数据流的分离(Client在第二步时获得了控制信息)。

4)Once all the replicas have acknowledged receiving the data, the client sends a write request to the primary.

Client先把待写入的数据发给各个 chunk server,等到所有的chunk server都收到这些数据后,向 primary 发起写请求。

5)The primary forwards the write request to all secondary replicas.

由primary制定写请求的顺序。所有的replicas都按照这个顺序写数据。看,采用“中心化”的方式制定写请求的顺序,这样很容易保证顺序的唯一性。

6)The secondaries all reply to the primary indicating that they have completed the operation

所有的replicas(secondaries)都按照相同的顺序写入数据后,向primary发送完成报告。

7)The primary replies to the client.

由primary向Client报告此次写操作的结果。

从上面的整个流程看,上面的操作很少涉及到master。大部分由master 颁发给Lease的primary来完成。

其实,个人感觉对于 mutation operation,这里的核心是两个:❶降低master的负载   ❷保证修改顺序的一致性。而通过Lease机制,解决了这两个问题。

master给某台chunk server颁发Lease,使之成为Primary。由Primary接收Client的写请求,由Primary负责其他replicas的写操作是否完成……这都有效地降低了master的负载;其次,由primary制定写操作的序列号,顺序的确定是由primary确定的,不是协商确定的,这种“中心化”的机制容易保证顺序的一致性。

四,参考资料

《分布式系统原理介绍》--刘杰

租约机制简介

租约机制简单介绍

Lease 机制在分布式系统中的应用

分布式系统概念--第一篇 一致性协议、一致性模型、拜占庭问题、租约、副本协议

原文:http://www.cnblogs.com/hapjin/p/5620542.html

什么是lease机制?的更多相关文章

  1. 分布式入门之1:Lease机制

      引子: 分布式系统中,如何确认一个节点是否工作正常?   如果有3副本A.B.C,并通过中心结点M来管理.其中A为主副本. 未接触过分布式的直观的处理方法是在每个副本与中心节点M中维护一个心跳,期 ...

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

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

  3. 为 Raft 引入 leader lease 机制解决集群脑裂时的 stale read 问题

    问题:当 raft group 发生脑裂的情况下,老的 raft leader 可能在一段时间内并不知道新的 leader 已经被选举出来,这时候客户端在老的 leader 上可能会读取出陈旧的数据( ...

  4. 副本机制与副本同步------《Designing Data-Intensive Applications》读书笔记6

    进入到第五章了,来到了分布式系统之中最核心与复杂的内容:副本与一致性.通常分布式系统会通过网络连接的多台机器上保存相同数据的副本,所以在本篇之中,我们来展开看看如何去管理和维护这些副本,以及这个过程之 ...

  5. 分布式服务协调员zookeeper - 应用场景和监控

    zookeeper在分布式系统中作为协调员的角色,可应用于Leader选举.分布式锁.配置管理等服务的实现.以下我们从zookeeper提供的API.应用场景和监控三方面学习和了解zookeeper( ...

  6. 分布式一致性算法--Paxos

    Paxos算法是莱斯利·兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法.Paxos算法解决的问题是一个分布式系统如何就某个值(决议)达成一致.在工程实践意义上来说, ...

  7. 文件上传---普通文件fileupload.jar和url文件httpUrlConnection

    文件上传---普通文件和url文件 主要用来学习使用common-fileupload.jar和java.net.httpURLConnection 普通文件: //上传xls文件到临时目录 if ( ...

  8. 【转】PaxosLease算法--2PC看Paxos选主

    原文请参考[[置顶] Paxos master选举--PaxosLease算法] 众所周知,为了避免Paxos算法的活锁问题,必须选举唯一的proposor.偏偏在Paxos原论文中,作者L. Lam ...

  9. 【转载】架构师需要了解的Paxos原理、历程及实战

    原文链接,请参见:http://weibo.com/ttarticle/p/show?id=2309403952892003376258 数据库高可用性难题 数据库的数据一致和持续可用对电子商务和互联 ...

随机推荐

  1. 浏览器端-W3School-Browser:Window 对象

    ylbtech-浏览器端-W3School-Browser:Window 对象 1.返回顶部 1. Window 对象 Window 对象 Window 对象表示浏览器中打开的窗口. 如果文档包含框架 ...

  2. OpenStack RPM Sample 解析

    目录 文章目录 目录 前言 RPM 打包环境安装 RPM 打包流程 OpenStack RPM SPEC Sample RPM 升级/回退 前言 软件功能升级,尤其是 Python 这类解析型语言的软 ...

  3. Linux进程:管理和调度

    一:进程管理 进程.轻量级进程和线程 通常定义:进程是程序执行时的一个实例. 这个很像类和实例对象的关系.从内核来看:进程的目的就是担当分配系统资源(CPU,内存等)的实体. 当进程创建时,它几乎和父 ...

  4. Pytorch笔记 (3) 科学计算1

    一.张量 标量 可以看作是  零维张量 向量 可以看作是  一维张量 矩阵 可以看作是  二维张量 继续扩展数据的维度,可以得到更高维度的张量 ————>  张量又称 多维数组 给定一个张量数据 ...

  5. QA Issue: PN: startUp is upper case, this can result in unexpected behavior. [uppercase-pn]

    (借用一下) 该错误直接导致生成开机启动程序无法启动,既无法生成S99***快捷链接. 解决方法:仅仅将recpie lib-Test改成lib-test就可以了,即不要有大写字母. 附启动方法: S ...

  6. 【VS开发】免费打工仔:一个完善的ActiveX Web控件教程

    作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一个ActiveX控件.其中将要讲解关于ActiveX开发的一些基础概念,诸如方法(method).属性(prope ...

  7. Mac022-brew安装tool

    1.Mac上查看目录的树结构 Step1:安装tree命令 brew install tree Step2:某一目录下执行tree,会将该目录下的所有目录以树形结构显示 $ tree $ tree - ...

  8. Magic Potion(网络流)

    原题链接 2018南京的铜牌题,听说学长他们上来就A了,我这个图论选手也就上手做了做,结果一言难尽...... 发此篇博客希望自己能牢记自己的菜... 本题大意:有n个heros和m个monsters ...

  9. Objective-C中的自动释放池

    自动释放池块@autoreleasepool 自动释放池块在MRC和ARC下都可以使用.在MARC下,为了将自动释放池块内部的变量放入自动释放池,需要手动调用autorelease方法:在ARC下,只 ...

  10. C++中的异常处理(上)

    1,C++ 内置了异常处理的语法元素 try ... catch ...: 1,try 语句处理正常代码逻辑: 2,catch 语句处理异常情况: 3,try 语句中的异常由对应的 catch 语句处 ...