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

一,租约机制介绍

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

如下图,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

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

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即可。

三,参考资料

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

租约机制简单介绍

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

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

时间: 2024-08-27 12:48:34

分布式系统理论之租约机制学习的相关文章

分布式系统理论之Quorum机制

一,Quorum机制介绍 在分布式系统中有个CAP理论,对于P(分区容忍性)而言,是实际存在 从而无法避免的.因为,分布系统中的处理不是在本机,而是网络中的许多机器相互通信,故网络分区.网络通信故障问题无法避免.因此,只能尽量地在C 和 A 之间寻求平衡.对于数据存储而言,为了提高可用性(Availability),采用了副本备份,比如对于HDFS,默认每块数据存三份.某数据块所在的机器宕机了,就去该数据块副本所在的机器上读取(从这可以看出,数据分布方式是按“数据块”为单位分布的) 但是,问题来

后端技术:分布式系统理论 - 从放弃到入门

分布式系统理论 - 从放弃到入门随承载用户数量的增加和容灾的需要,越来越多互联网后台系统从单机模式切换到分布式集群.回顾自己毕业五年来的工作内容,同样有这样的转变. 毕业头两年负责维护运行在刀片机上的业务,在机房里拔插单板的日子是我逝去的青春.设备之间通过VCS组成冷备,但即使有双机软件保护,宕机.网络丢包等问题发生时业务仍会受影响.这样的系统架构下为保证SLA,有时候需要深入 Linux系统内核或硬件层面分析机器重启的原因. 接下来负责维护承载在分布式集群上的业务,相比前面的工作,这个阶段主要

分布式系统理论进阶 - Raft、Zab

引言 <分布式系统理论进阶 - Paxos>介绍了一致性协议Paxos,今天我们来学习另外两个常见的一致性协议——Raft和Zab.通过与Paxos对比,了解Raft和Zab的核心思想.加深对一致性协议的认识. Raft Paxos偏向于理论.对如何应用到工程实践提及较少.理解的难度加上现实的骨感,在生产环境中基于Paxos实现一个正确的分布式系统非常难[1]: There are significant gaps between the description of the Paxos al

租约机制

背景和介绍 缓存是计算机里广泛使用的一种技术,对降低读取延迟.网络流量和服务器负载都非常有效,但也带来了一致性(Consistency)的问题.所谓一致就是客户端总能读到最新的数据,使用缓存后有可能服务器端的数据已经被修改,但客户端仍然从缓存中读取陈旧的数据.为了保证一致性,有两种常见的解决办法,第一种是轮询(Polling),即每次读取数据时都先询问服务器数据是不是最新的,如果不是就从服务器传输新数据,这种方法需要每次读取数据时都与服务器通信.另一种方法就是回调(Callback)或者无效化(

租约机制简介

背景和介绍 缓存是计算机里广泛使用的一种技术,对降低读取延迟.网络流量和服务器负载都非常有效,但也带来了一致性(Consistency)的问题.所谓一致就是客户端总能读到最新的数据,使用缓存后有可能服务器端的数据已经被修改,但客户端仍然从缓存中读取陈旧的数据.为了保证一致性,有两种常见的解决办法,第一种是轮询(Polling),即每次读取数据时都先询问服务器数据是不是最新的,如果不是就从服务器传输新数据,这种方法需要每次读取数据时都与服务器通信.另一种方法就是回调(Callback)或者无效化(

分布式系统理论(二):一致性协议Paxos

摘要: 分布式系统理论第二章,此系列主要以理论为主. Paxos算法 Paxos算法是莱斯利·兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递的一致性算法. Paxos 算法是一个解决分布式系统中,多个节点之间就某个值(注意是某一个值,不是一系列值)达成一致的通信协议.能够处理在少数派离线的情况下,剩余的多数派节点仍然能够达成一致. Lamport是通过故事的方式提出Paxos 问题:希腊岛屿Paxon 上的执法者在议会大厅中表决通过法律(一次paxos过程),并通过服务

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

舌尖上的安卓(android触控事件机制学习笔记录)

对于一个"我们从来不生产代码,我们只是大自然代码的搬运工"的码农来说.对android的触控机制一直是模棱两可的状态,特别是当要求一些自定义的控件和androide的自带控件(比如ViewPager,ListView,ScrollView)高度嵌套在一起使用时. 花了点时间梳理了下,做个笔记.对于一个触控的事件从用户输入到传递到Actigvity到最外层的Viewgroup在到子View,中间过程还可能穿插多个Viewgroup,android在ViewGroup提供了3个方法来控制流

JAVA反射机制—学习总结

最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象. 什么是反射机制? "JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制."我们通过一些例子,更好理解反射机制.Class类 我们知道Java是一门面向对象