Paxos在大型系统中常见的应用场景

在分布式算法领域,有个很是重要的算法叫Paxos, 它的重要性有多高呢,Google的Chubby [1]中提到程序员

all working protocols for asynchronous consensus we have so far encountered have Paxos at their core.web

关于Paxos算法的详述在维基百科中有更多介绍,中文版介绍的是choose value的规则[2],英文版介绍的是Paxos 3 phase commit的流程[3],中文版不是从英文版翻译而是独立写的,因此很是具备互补性。Paxos算法是由Leslie Lamport提出的,他在Paxos Made Simple[4]中写道算法

The Paxos algorithm, when presented in plain English, is very simple.数据库

当你研究了很长一段时间Paxos算法仍是有点迷糊的时候,看到上面这句话可能会有点沮丧。可是公认的它的算法仍是比较繁琐的,尤为是要用程序员严谨的思惟将全部细节理清的时候,你的脑壳里更是会充满了问号。Leslie Lamport也是用了长达9年的时间来完善这个算法的理论。apache

实际上对于通常的开发人员,咱们并不须要了解Paxos全部细节及如何实现,只须要知道Paxos是一个分布式选举算法就够了。本文主要介绍一下Paxos经常使用的应用场合,或许有一天当你的系统增大到必定规模,你知道有这样一个技术,能够帮助你正确及优雅的解决技术架构上一些难题。编程

1. database replication, log replication等, 如bdb的数据复制就是使用paxos兼容的算法。Paxos最大的用途就是保持多个节点数据的一致性。服务器

2. naming service, 如大型系统内部一般存在多个接口服务相互调用。
1) 一般的实现是将服务的ip/hostname写死在配置中,当service发生故障时候,经过手工更改配置文件或者修改DNS指向的方法来解决。缺点是可维护性差,内部的单元越多,故障率越大。
2) LVS双机冗余的方式,缺点是全部单元须要双倍的资源投入。
经过Paxos算法来管理全部的naming服务,则可保证high available分配可用的service给client。象ZooKeeper还提供watch功能,即watch的对象发生了改变会自动发notification, 这样全部的client就可使用一致的,高可用的接口。架构

3.config配置管理
1) 一般手工修改配置文件的方法,这样容易出错,也须要人工干预才能生效,因此节点的状态没法同时达到一致。
2) 大规模的应用都会实现本身的配置服务,好比用http web服务来实现配置中心化。它的缺点是更新后全部client没法当即得知,各节点加载的顺序没法保证,形成系统中的配置不是同一状态。async

4.membership用户角色/access control list, 好比在权限设置中,用户一旦设置某项权限好比由管理员变成普通身份,这时应在全部的服务器上全部远程CDN当即生效,不然就会致使不能接受的后果。分布式

5. 号码分配。一般简单的解决方法是用数据库自增ID, 这致使数据库切分困难,或程序生成GUID, 这一般致使ID过长。更优雅的作法是利用paxos算法在多台replicas之间选择一个做为master, 经过master来分配号码。当master发生故障时,再用paxos选择另一个master。

这里列举了一些常见的Paxos应用场合,对于相似上述的场合,若是用其它解决方案,一方面不能提供自动的高可用性方案,同时也远远没有Paxos实现简单及优雅。

Yahoo!开源的ZooKeeper [5]是一个开源的类Paxos实现。它的编程接口看起来很像一个可提供强一致性保证的分布式小文件系统。对上面全部的场合均可以适用。但惋惜的是,ZooKeeper并非遵循Paxos协议,而是基于自身设计并优化的一个2 phase commit的协议,所以它的理论[6]并未通过彻底证实。但因为ZooKeeper在Yahoo!内部已经成功应用在HBase, Yahoo! Message Broker, Fetch Service of Yahoo! crawler等系统上,所以彻底能够放心采用。

另外选择Paxos made live [7]中一段实现体会做为结尾。

*  There are significant gaps between the description of the Paxos algorithm and the needs of a real-world system. In order to build a real-world system, an expert needs to use numerous ideas scattered in the literature and make several relatively small protocol extensions. The cumulative effort will be substantial and the final system will be based on an unproven protocol.
* 因为chubby填补了Paxos论文中未说起的一些细节,因此最终的实现系统不是一个理论上彻底通过验证的系统

* The fault-tolerance computing community has not developed the tools to make it easy to implement their algorithms.
* 分布式容错算法领域缺少帮助算法实现的的配套工具, 好比编译领域尽管复杂,可是yacc, ANTLR等工具已经将这个领域的难度降到最低。

* The fault-tolerance computing community has not paid enough attention to testing, a key ingredient for building fault-tolerant systems.
* 分布式容错算法领域缺少测试手段

这里要补充一个背景,就是要证实分布式容错算法的正确性一般比实现算法还困难,Google无法证实Chubby是可靠的,Yahoo!也不敢保证它的ZooKeeper理论正确性。大部分系统都是靠在实践中运行很长一段时间才能谨慎的表示,目前系统已经基本没有发现大的问题了。

Resources
[1] The Chubby lock service for loosely-coupled distributed systems (PDF)
[2] http://zh.wikipedia.org/wiki/Paxos算法
[3] http://en.wikipedia.org/wiki/Paxos_algorithm
[4] Paxos Made Simple (PDF)
[5] ZooKeeper
[6] The life and times of a zookeeper
[7] Paxos Made Live – An Engineering Perspective (PDF)

相关文章
相关标签/搜索