我们在之前的系列文章《分布式系统架构的本质》中说过,分布式系统的一个关键技术是“数据调度”。因为我们需要扩充节点,提高系统的高可用性,所以必需冗余数据结点。
建立数据结点的副本看上去容易,但其中最大的难点就是分布式一致性的问题。下面,我会带你看看数据调度世界中的一些技术点以及相关的技术论文。
对于分布式的一致性问题,相信你在前面看过好几次下面这张图。从中,我们可以看出,Paxos算法的重要程度。还有人说,分布式下真正的一致性算法只有Paxos。
# Paxos算法
Paxos算法,是莱斯利·兰伯特(Lesile Lamport)于1990年提出来的一种基于消息传递且具有高度容错特性的一致性算法。但是这个算法太过于晦涩,所以,一直以来都属于理论上的论文性质的东西。
其进入工程圈的源头在于Google的Chubby lock——一个分布式的锁服务,用在了Bigtable中。直到Google发布了下面的这两篇论文,Paxos才进入到工程界的视野中来。
一旦选举出了一个Leader,它就开始负责服务客户端的请求。每个客户端的请求都包含一个要被复制状态机执行的指令。Leader首先要把这个指令追加到log中形成一个新的entry,然后通过AppendEntries RPC并行地把该entry发给其他服务器(server)。如果其他服务器没发现问题,复制成功后会给Leader一个表示成功的ACK。
Leader收到大多数ACK后应用该日志,返回客户端执行结果。如果Follower崩溃 (crash)或者丢包,Leader会不断重试AppendEntries RPC。
这里推荐几个不错的Raft算法的动画演示。
对于存储服务的设计,核心的原理就是latency一定要低,毕竟写6个copy是一件开销很大的事。所以,基本上来说,Aurora用的是异步模型,然后拼命地做并行处理,其中用到的也是Gossip协议。如下所示。
在上面这个图中,我们可以看到,完成前两步,就可以ACK回调用方。也就是说,只要数据在本地落地了,就可以返回成功了。然后,对于六个副本,这个log会同时发送到6个存储结点,只需要有大于4个成功ACK,就算写成功了。第4步我们可以看到用的是Gossip协议。然后,第5步产生cache 页,便于查询。第6步在S3做Snapshot,类似于Checkpoint。
第二篇比较有代表的论文是Google的 [Spanner: Google’s Globally-Distributed Database](http://static.googleusercontent.com/media/research.google.com/zh-CN//archive/spanner-osdi2012.pdf)。
我们可以看到,每个数据中心都会有一套Colossus,这是第二代的GFS。每个机器有100-1000个tablet,也就是相当数据库表中的行集,物理存储就是数据文件。比如,一张表有2000行,然后有20个tablet,那么每个tablet分别有100行数据。
在tablet上层通过Paxos协议进行分布式跨数据中心的一致性数据同步。Paxos会选出一个replica做Leader,这个Leader的寿命默认是10s,10s后重选。Leader就相当于复制数据的master,其他replica的数据都是从它那里复制的。读请求可以走任意的replica,但是写请求只有去Leader。这些replica统称为一个Paxos Group。
Group之间也有数据交互传输,Google定义了最小传输复制单元directory,是一些有共同前缀的key记录,这些key也有相同的replica配置属性。
目前,基于Spanner论文的开源实现有两个,一个是Google公司自己的人出来做的[CockroachDB](https://github.com/cockroachdb/cockroach),另一个是国人做的[TiDB](https://github.com/pingcap/tidb)。
# 小结
正如我在之前的分布式系统的本质文章里所说到的,分布式的服务的调度需要一个分布式的存储系统来支持服务的数据调度。而我们可以看到,各大公司都在分布式的数据库上做各种各样的创新,他们都在使用底层的分布式文件系统来做存储引擎,把存储和计算分离开来,然后使用分布式一致性的数据同步协议的算法来在上层提供高可用、高扩展的支持。
从这点来看,可以预见到,过去的分库分表并通过一个数据访问的代理服务的玩法,应该在不久就会过时就会成为历史。真正的现代化的分布式数据存储就是Aurora和Spanner这样的方式。
通过上面的这些论文和相关的工程实践以及开源项目,相信可以让你在细节方面对分布式中最难的一块——数据调度方面有更多的认识。
(**这篇文章中提到了大量的英文文章和论文,担心读者听音频时很难理解和对应,所以没有录制音频,敬望谅解。**)
《分布式系统架构的本质》系列文章的目录如下,方便你查找自己关注的内容。
- [分布式系统架构的冰与火](https://time.geekbang.org/column/article/1411)
- [从亚马逊的实践,谈分布式系统的难点](https://time.geekbang.org/column/article/1505)
- [分布式系统的技术栈](https://time.geekbang.org/column/article/1512)
- [分布式系统关键技术:全栈监控](https://time.geekbang.org/column/article/1513)
- [分布式系统关键技术:服务调度](https://time.geekbang.org/column/article/1604)
- [分布式系统关键技术:流量与数据调度](https://time.geekbang.org/column/article/1609)
- [洞悉PaaS平台的本质](https://time.geekbang.org/column/article/1610)
- [推荐阅读:分布式系统架构经典资料](https://time.geekbang.org/column/article/2080)
- [推荐阅读:分布式数据调度相关论文](https://time.geekbang.org/column/article/2421)