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. 浅入浅出 Android 安全:第三章 Android 本地用户空间层安全
  2. 新闻媒体的“社会热点事件”催发微博客的诞生
  3. 有关域名方面的相关问题
  4. 什么是DQL、DML、DDL、DCL
  5. CF908G. New Year and Original Order
  6. LwIP应用开发笔记之五:LwIP无操作系统TCP服务器
  7. 综述 | 卷积神经网络:从基础技术到研究前景
  8. conda 换成清华的源_conda/pip 使用国内镜像安装第三方库
  9. OLTP和OLAP的区别
  10. 游戏 mysql优化工具_MySQL 性能优化神器 Explain 使用分析
  11. Android界面绘制流程--------How Android Draws Views
  12. 使用SaltStack安装JBoss
  13. Intellij IDEA创建Scala项目
  14. JS 基础知识(自学篇)
  15. 纵向手风琴html,CSS3制作垂直手风琴
  16. 记:psd中图标转成svg并上传到iconfont制作成图标
  17. 微信小程序开发-微信支付之免密支付(自动扣费)一 小程序+java接口
  18. 批量下载coursera课程
  19. Flink on yarn集群HA配置
  20. 淘淘商城第77讲——实现商品详情页面展示

热门文章

  1. 1分钟学会在OneNote中插入代码块(不需要任何插件或软件直接插入像CSDN中一样的代码块)
  2. 这45个账号安全风险,你check了吗?
  3. Spark MLlib 源码学习---朴素贝叶斯模型(Naive Bayes)
  4. sql查询语句去除重复列(行)
  5. vlan的基本指令_CISCO交换机配置VLAN的具体命令
  6. WhatsApp的与众不同
  7. tomcat 本地测试war包启动总结
  8. 外企邮件回复模板_电子邮件回复模板
  9. 海外的 SEO 网站如何进行优化
  10. 数据结构课程设计——图书信息管理系统设计