Paxos工程实践

Overview

  • 是不是感觉看了这篇 Paxos算法 感觉完全没看懂?2333我也是
  • 之前Paxos算法在工程实现的过程中,会遇到非常多的问题。

Chubby

  • Google Chubby是一个大名鼎鼎的分布式锁服务
  • GFS和Big Table等大型系统都用它来解决分布式协作、元数据存储和Master选举等一系列与分布式锁服务相关的问题。
  • Chubby的底层一致性实现就是以Paxos算法为基础的。

Overview

  • Chubby是一个面向松耦合分布式系统的锁服务,通常用于一个由大量小型计算机构成的松耦合分布式系统提供高可用的分布式锁服务。
  • 一个分布式锁服务的目的是允许它的客户端进程同步彼此的操作,并对当前所处环境的基本状态信息达成一致。
  • 针对这个目的,Chubby提供了粗粒度的分布式锁服务,开发人员不需要使用复杂的同步协议,而是直接调用Chubby的锁服务接口即可实现分布式系统中多个进程之间粗粒度的同步控制,从而保证分布式数据的一致性。
  • Chubby的客户端接口设计非常类似UNIX文件系统结构,应用程序通过Chubby的客户端接口,不仅可以对Chubby服务器上的整个文件进行读写操作,还能够添加对文件节点的锁控制,并且能订阅Chubby服务端发出的一系列文件变动的事件通知。

应用场景

  • 最典型的就是Master选举啦。
  • 借助Chubby,master能够非常方便地感知到其所控制的那些服务器。同时,BigTable的客户端还能够很方便地定位到当前集群的master服务器。此外,在GFS和BigTable中,都使用Chubby来进行系统运行时元数据的存储。

设计目标

  • Chubby设计上不同于Paxos的一点在于:Chubby被设计成一个需要访问中心化节点的分布式锁服务。而不是一个包含Paxos算法的协议库。
  • 锁服务相比于传统算法库的优点:
    • 对上层应用程序的侵入性更小
    • 便于提供数据的发布和订阅
    • ....

Chubby技术架构

系统结构

  • Chubby的整个系统结构主要由服务端和客户端两部分组成。
  • 客户端通过RPC调用与服务端进行通信。
  • 一个典型的Chubby集群,或称为Chubby cell,通常由5台服务器组成。
  • 这些副本服务采用Paxos协议,通过投票的方式来选举产生一个获得过半投票的服务器作为master。

Master

  • 一旦某台服务器称为了master,Chubby就会保证在一段时间内不会再有其他服务器称为master。该端时间被称为master租期(Master lease). 而Master会不断续租来延长租期。而若master服务器出现故障,则余下服务器会进行新一轮的master选举。
  • 集群中的每个服务器都维护着一份服务器数据库的副本,但在实际运行过程中,只有master服务器才能对数据库进行写操作。其他服务器都是使用Paxos协议从master服务器上同步更新。
  • 针对写请求,master会采用一致性协议将其广播给集群中所有副本服务器,并且在过半的服务器接受了该请求后,再响应给客户端正确的应答。
  • 对于读请求,则不需要广播,直接由master单独处理即可。

Client

  • 那么还有一个问题是,Chubby的客户端如何定位到master服务器的。Chubby客户端向记录有Chubby服务器列表的DNS来请求获取所有的Chubby服务器列表,然后逐个发起请求询问。而非Master服务器则会反馈当前master所在的服务器标识给client。

故障

  • 若当前master崩溃,则集群中其他服务器会在Master续租到期后,重新开启新一轮的Master选举。通常master选举需花费几秒钟。(DownTime)
  • 若非master崩溃,则集群不会停止工作,而该崩溃的服务器会在恢复之后自动加入到Chubby集群。新加入的服务器首先需要同步Chubby最新的数据库数据,完成同步之后,新的服务器就可以加入到正常的Paxos运作流程。
  • 若某服务器发生崩溃并在几小时后仍无法恢复,则需要加入新的机器,同时更新DNS列表。
    • Chubby服务器的更换:启动Chubby服务端程序,然后更新DNS上的机器列表即可。在Chubby运行过程中,master会周期性地轮训DNS列表,从而服务器地址变更会很快被master感应。从而集群内其他副本服务器通过复制即可。

目录与文件

  • Chubby对外提供了一套与Unix文件系统非常相近但是更简单的访问接口。
  • Chubby的数据结构可以看做是一个由文件和目录组成的树。
  • 其中的每一个节点都可以表示为一个使用斜杠分割的字符串,典型的节点路径如下:
    /ls/foo/wombat/pouch
    • 其中,ls(Look service)是所有Chubby节点所共有的前缀,代表着锁服务;
    • foo则是指定了Chubby集群的名字,从DNS可以查到一个或多个服务器组成该Chubby集群;
    • 剩下部分的路径则是一个真正包含业务含义的节点名字,由Chubby内部解析并定位到数据节点。
  • Chubby的命名空间,包括文件和目录,被称为节点(nodes, 泛指Chubby的文件或目录)。
  • 同一个Chubby集群数据库中,每一个节点都是全局唯一的。
  • nodes分为持久节点和临时节点两大类:
    • 持久节点需要显式调用API进行删除;
    • 临时节点则会在client会话结束后被自动删除。因此,临时节点通常可被用作进行客户端会话有消息的判断依据。
  • 另外,Chubby上的每个数据节点都包含了少量的元数据信息,其中包括ACL信息。同时,每个节点的元数据中还包括4个单调递增的64位编号:
    • 实例编号:用于标识Chubby创建该数据节点的顺序。从而client可以方便地识别出是否是同一个数据节点。
    • 文件内容编号(only for file):用于标识文件内容的变化情况,会在文件内容被写入时增加。
    • 锁编号:用于标识节点锁状态变更情况,会在节点锁从free到held状态时增加。
    • ACL编号:用于标识节点的ACL信息变更情况,会在节点的ACL配置信息被写入时增加。

锁与锁序列器

  • 由于网络通信的不确定性,在分布式系统中,锁是一个非常复杂的问题。消息的延迟或是乱序都可能引发锁的失效。eg:
    客户端C1获取到了互斥锁L,并且在锁L的保护下发出请求R,但请求R迟迟没有到达服务端,这是应用程序会认为该客户端进程已经失败,于是会为另一个客户端C2分配锁L,然后再重新发起之前的请求R,并且成功应用到了服务器上。这时,不幸的事情发生了,客户端C1的请求最终到达了服务器端,从而可能覆盖了C2的操作,导致系统数据出现不一致。
    对于上述问题,典型的解决方案包括虚拟时间和虚拟同步(这并非Chubby中所涉及的方案)。
  • 在Chubby中,任意一个数据节点都可以充当一个读写锁来使用:一种是单个客户端以排他(写)模式持有这个锁,另一种则是任意数目的客户端以共享(读)模式持有这个锁。同时,在Chubby的锁机制中需注意的一点是,Chubby舍弃了严格的强制锁,client可以在没有获取锁的情况下访问Chubby的文件,也即
  • 在Chubby中,主要采用锁延迟和锁序列器两种策略
时间: 2024-07-30 05:18:48

Paxos工程实践的相关文章

c++ STL 工程实践的15条建议

STL是c++非常重要的一部分,它是很多大神的杰作,高效,稳定,可扩展性好,虽然STL确实存在难以调试,内存碎片的问题(现在机器的内存越来越大,内存碎片的问题基本不太可能成为系统瓶颈,但只要你使用恰当,它能显著提高生产力,并使代码更短,更易维护. 而在工程中,如果不养成好的使用习惯,也容易造成一些问题! 而自己在工程实践中,总结了一些建议 1.  vector, map, set, list, queue, dequeue, stack 等容器存放的对象必须是可拷贝的,尤其注意深拷贝的情况,必须

LDA工程实践之算法篇之(一)算法实现正确性验证(转)

研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiwang带领下,与孙振龙.严浩等一起实现了一套大规模并行的LDA训练系统——Peacock.受rick影响,决定把自己对LDA工程实践方面的一些理解整理出来,分享给大家,其中可能有一些疏漏和错误,还请批评指正. Rickjin在<LDA数学八卦>[1]一文中已经对LDA的数学模型以及基本算法介绍得比

Linux开源模块迁移概述暨交叉编译跨平台移植总结--从《嵌入式Linux驱动模板简洁和工程实践》

本文摘录<嵌入式Linux驱动模板简洁和工程实践>一本书"开发和调试技术". Linux强大的是,有那么多的开源项目可以使用.通常非常需要可以通过寻找相关的源模块被定义为高速的解决方案.使这些开源模块的嵌入.对开源项目进行交叉编译. 依据详细情况.下载的开源项目在组织上有非常多情况,在此对各种情况进行归类介绍. 1. 下载的开源软件包找不到Makefile 对于这样的开源包一般是採用configure的方式组织的,那么第一步就是使用软件包中的configure生成Makef

【140810】VC++数字图像模式识别技术及工程实践pdf电子书

VC++数字图像模式识别技术及工程实践pdf电子书,本书介绍模式识别和人工智能中的一些基本理论和相关模型,比如神经网络.聚类技术.线性差别函数等,同时结合了模式识别中的一些经典问题,比如人脸检测.车牌识别.印章识别等内容,从不同角度介绍了这些问题的解决思路. 源码: 电子书下载地址:点击下载 本书源码下载地址:点击下载 [140810]VC++数字图像模式识别技术及工程实践pdf电子书

《大话操作系统——做坚实的工程实践派》(2)

 <大话操作系统--做坚实的工程实践派>(2)

《大话操作系统——做坚实的工程实践派》(硬件篇)

 很多朋友需要PDF,经过这几天的辛苦校对,当然目前只校对了一部分,那就先发这一部分的PDF PDF:<大话操作系统--做坚实的工程实践派>(硬件篇)下面是一部分PDF的截图,可以先预览一下

Git工程实践(一)巧用commit message

摘要: 大家都知道所有的版本控制系统比如svn,git等设计的核心价值之一就是为了让代码变更有迹可循,而commit mesage的价值在于让有迹可循的代码对人类更加友好,通常一个恰如其分的commit message表达的信息往往先于代码. 背景 大家都知道所有的版本控制系统比如svn,git等设计的核心价值之一就是为了让代码变更有迹可循,而commit mesage的价值在于让有迹可循的代码对人类更加友好,通常一个恰如其分的commit message表达的信息往往先于代码. 而现实的工程实

Git工程开发实践(六)——Git工程实践扩展

Git工程开发实践(六)--Git工程实践扩展 一.Git提交日志规范 1.Git提交日志模板 Git支持对每次提交的日志信息进行规范,可以通过设置提交模板实现.建立一个gitCommitTemplate文件,内容为: #commit message包含三部分,header, body和footer,其中header必选,body和footer可选. # type(<scope>): <subject> #<body> #<footer> #type字段包含

PaddlePaddle应用于百度视觉技术的工程实践

深度学习的出现,某种程度上改变了我们对计算机视觉的定义.而PaddlePaddle是百度开源的深度学习框架,它是如何支持百度视觉技术,有哪些工程实践,这篇文章将由百度视觉技术部主任研发架构师刘国翌为大家解答. 以下为刘国翌老师演讲实录 百度AI视觉能力 百度内部大规模应用计算机视觉的技术分为四个方面,第一是图像识别,包含图像分类.文字识别.人脸识别等.第二是图像检索,包含图文.相同图片.相似图片和商品图片检索.第三是视频理解,主要涉及视频分类.目标追踪.人体姿态跟踪,应用在商业.监控.安全.新零