Chubby架构


一个Chubby的cell一般由5个节点组成,并利用Paxos算法选举出一个master节点,客户端通过chubby库和master节点通信。Chubby内部维护了一个文件系统,文件系统中的每个文件都可以看成一个锁。其它服务利用Chubby选主时,谁先获得文件的锁,谁就master节点。

(1) 客户端利用Chubby选主

   chubby提供了一系列操作文件系统的接口,利用chubby进行选主时,所有的节点调用Open()和Acquire()加锁,加锁成功的节点成为主节点,其它节点成为从节点。所有的节点都能打开文件成功,并获得一个handle。主节点将其标识写入到锁文件(告诉其它节点,我现在是主节点),其它节点既可以通过GetContentsAndStat()接口主动获取内容,或者由文件更改事件机制通知给从节点。

(2) 文件系统维护

   论文提到Chubby最开始使用Berkeley DB维护文件系统,路径名作为key,文件内容作为value。Berkeley DB使用分布式一致性协议将数据块复制到其它节点上。后期,Chubby开发人员使用write ahead log和快照机制实现了一个简单的数据块。(但是用数据库实现文件系统,遇到追加的情况,难道需要把value先读取出来,在内容中拼接在一起,然后再写到磁盘中吗?)

(3) Chubby 重新选主后,客户端如何知道新的master节点?

   客户端通过向DNS中列出的副本发送master位置查询请求,来获得master位置信息。如果有任何一个副本故障,新加入的节点都会更新DNS列表,用新节点的IP地址代替故障的节点。master服务器会周期性地轮询DNS列表,因此会很快感知服务器地址的变更,然后Master就会将集群数据库中的地址列表做相应的变更,集群内部的其他副本服务器通过复制方式就可以获取到最新的服务器地址列表了。

(4) 一个客户端节点占有锁L,并发出请求R,还没等R到达服务器,客户端就故障了,然后另一个节点占有锁L,并执行一些操作,随后先前的请求R又到达,会使数据产生不一致的状态,Chubby如何处理这种情况?

   在任何时候,锁持有者都可以请求一个序列器,一个不透明的描述锁在获取后的状态的字符串,不同锁的持有者的锁序列器是不同的。它包含锁的名称、获取锁的模式(独占或共享)和锁的生成号。如果期望操作被锁保护,则客户端应当发送序列器给服务器,服务器会检查序列器,如果不匹配就拒绝请求。
   同时,Chubby也提供了一个不太完美,但是更容易减少延迟或者重新排序的请求到达服务器的问题。如果客户端正常释放一个锁,则该锁可以立即被其它客户端获取,然而如果一个锁因为持有者故障或不可访问而被释放,则锁服务器会在一段时间内阻止其它客户端获得该锁,这段时间叫做锁延迟时间,通常是1分钟。

(5) Chubby事件通知机制

   Chubby客户端创建handle时能够订阅一些事件,这些事件可以由锁服务器异步的发送给客户端,主要包括:

  • 文件内容更改
  • 子节点增加、移除、梗概
  • Chubby master故障
  • handle无效
  • 加锁成功
  • 锁冲突
    事件通知可以避免客户端不断询问服务器,减少了网络的压力。但是事件通知仅仅是通知事件的发生,比如,客户端收到文件内容更改事件后,仍然需要发起读请求去读取新的内容。文件内容更改的一个应用场景是获得主节点,当所有客户端进行选主时,都会订阅一个文件,主节点会向该文件写入本节点的标识,随后备节点都能知道该文件被更改,并主动读取该文件获得主节点的信息。

(6) 缓存

  为了减少读传输量,Chubby客户端会缓存文件数据和节点元数据。客户端缓存依靠租约机制维护,并靠master发送的无效标志保持一致性,master保存了可能缓存的客户端列表。当文件数据或者元数据改变时,更改操作暂时阻塞住,master发送无效标志给缓存数据的客户端,满足以下两个条件,操作才会继续执行,(1) 客户端收到了所有带有缓存数据的客户端的回应,(2) 如果一个不能收到部分客户端的回应,就等待缓存租约过期。master发送的无效标志会搭载在keepalives消息上。

(7) 会话和keepalives

  一个Chubby会话是Chubby单元和Chubby客户端之间的一种关系,它存在于么某个时间间隔内,并由称做KeepAlives的间歇性地握手来维持。客户端第一次和链接Chubby的master节点时会创建一个会话。每个会话都会有一个租约超时时间,租约超时时间内master不会单方面终止会话。
  master在以下三个场景中会延长租约超时时间:(1) 会话创建时,(2) master故障,(3) 恢复客户端的KeepAlive时。master收到客户端的KeepAlive时,不会立马返回回应,而是阻塞这个RPC请求,直到客户端的上一个租约快过期时才返回回应。客户端收到master的回应后,要立马发送下一个KeepAlive,保证在master段总阻塞了一个KeepAlive请求(这有利于master通知事件给客户端)。
  因为master端常常阻塞了一个KeepAlive请求,因此可以利用KeepAlive,向客户端传输事件和缓存无效标志。master允许搭载这些事件的KeepAlive回应消息立马返回给客户端,而不用等到租约快过期。
  客户端本地也会维护一个本地的租约超时时间,小于但接近于master租约超时时间,因为客户端必须考虑KeepAlive回应消息的传播时间和master时钟前进的速度。为了保持一致性,要求服务器的时钟前进速度不能快于已知的常数因子,也不能快于客户机的常数因子。如果客户端的本地租约超时时间过期了,客户端会禁止缓存,这时会话处于危险期,客户端等待grace period时间(45s),如果这段时间内客户端和master重新交换了KeepAlive,客户端重新开启缓存,否则客户端认为会话已经过期。

(8) 故障切换


  如图所示,客户端开启一个lease C1,并向master发生keepalive(1),master给该客户端再维护一个master lease M1,并当M1快结束时回复给客户端ACK(2),并开启mater lease M2。客户端接收到ACK(2)后,开启lease C2,并向master发送Keepalive(3)。此时master故障,并重新选举。客户端在选举期间一直没有收到master的ACK,于是进入grace period阶段。在客户端处于grace period期间,master选举成功,检查到原先存在的会话,给该客户端开启一个master lease M3,客户端查询到新master的地址,并发送keepalive(4)。随后新master检查客户端发过来的master版本号,不匹配,并发送拒绝消息(5)。客户端收到拒绝消息后,以新master的版本号发送keepalive(6),maser接收到keepalive后并不开启新的master lease,因此M3是一个保守值,足以在C3结束之前回复客户端ACK。随后客户端收到keepalive ACK(7),开启客户端lease C3,并发送keepalive(8)。
  新master在选举期间,客户端什么时候会向新master发送keepalive,是仅仅在grace period期间吗?这样的话如果还没进入grace period,选举就结束了,客户端不就白白等了一段时间。

《The Chubby lock service for loosely-coupled distributed systems》阅读笔记相关推荐

  1. trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

    一.代码结构概览 1.核心部分 configs:储存各种网络的yaml配置文件 datasets:存放数据集的地方 detectron2:运行代码的核心组件 tools:提供了运行代码的入口以及一切可 ...

  2. VoxelNet阅读笔记

    作者:Tom Hardy Date:2020-02-11 来源:VoxelNet阅读笔记

  3. Transformers包tokenizer.encode()方法源码阅读笔记

    Transformers包tokenizer.encode()方法源码阅读笔记_天才小呵呵的博客-CSDN博客_tokenizer.encode

  4. 源码阅读笔记 BiLSTM+CRF做NER任务 流程图

    源码阅读笔记 BiLSTM+CRF做NER任务(二) 源码地址:https://github.com/ZhixiuYe/NER-pytorch 本篇正式进入源码的阅读,按照流程顺序,一一解剖. 一.流 ...

  5. Mina源码阅读笔记(一)-整体解读

    2019独角兽企业重金招聘Python工程师标准>>> 今天的这一节,将从整体上对mina的源代码进行把握,网上已经有好多关于mina源码的阅读笔记,但好多都是列举了一下每个接口或者 ...

  6. “CoreCLR is now Open Source”阅读笔记

    英文原文:CoreCLR is now Open Source 阅读笔记如下: CoreCLR是.NET Core的执行引擎,功能包括GC(Garbage Collection), JIT(将CIL代 ...

  7. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  8. 05《软件需求模式》阅读笔记

    剩下的两个阅读笔记写第二部分.各类需求模式,共八个领域和它的需求模式,这一次写前四个. 基础需求模式,它是所有种类的系统都可能需要的一些东西.系统间接口需求模式使用系统间接口需求模式定义被定义的系统和 ...

  9. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  10. 大型网站技术架构:核心原理与案例分析阅读笔记二

    大型网站技术架构:核心原理与案例分析阅读笔记二 网站架构设计时可能会存在误区,其实不必一味追随大公司的解决方案,也不必为了技术而技术,要根据本公司的实际情况,制定适合本公司发展的网站架构设计,否则会变 ...

最新文章

  1. 2021年华为与小康-北汽-长安
  2. 《网站运维技术与实践》笔记
  3. String 的普通构造函数、拷贝构造函数、析构函数、赋值函数
  4. mac安装telnet 超简单 复制telnet文件即可
  5. Windows 7 VHD 启动
  6. python导入csv文件中特定列-如何使用标头完整的python导入csv文件,其中第一列为非数字...
  7. linux创建zip+函数,linux+shell基础知识
  8. [silverlight基础]仿文字连接跑马灯效果-高手绕道
  9. php webview,Android:控件WebView显示网页 – tinyphp – 博客园
  10. 支付宝小程序组件库开发之手写板组件
  11. vue-cli 中stylus写样式莫名报错?
  12. python面向对象编程(2)
  13. C Tricks(四)—— 从数组中随机选择一个元素
  14. [360优化]让360安全卫士比火绒还好用 #调教360
  15. python pandas 数据透视表_python 用pandas实现数据透视表功能
  16. 2020年携程校招开发方向第一题
  17. RTNETLINK answers: File exists的解决方案
  18. 3090显卡 爆显存调试
  19. Git Clone命令直接使用用户名密码Clone
  20. uoj problem 11 ydc的大树

热门文章

  1. censos7 安装yum (卸载)
  2. H5 挽留弹窗方案设计与实现
  3. Pyecharts V1全新版本使用教程
  4. 【华为机试真题Java】报数游戏
  5. NCD2019 A. Hasan the lazy judge 二分
  6. java8 collectors类_java8之collectors
  7. 阿里云Redis之:配置程序接入阿里云Redis集群缓存数据(十七)
  8. raid5 和raid50的区别
  9. cad尺寸标注快捷键_Auto CAD 尺寸标注快捷键
  10. Linux学习第九课、磁盘容量配额、RAID磁盘冗余阵列