AmazonDynamo是一个分布式的key-value系统。最近看了Dynamo的原论文《Dynamo: Amazon's Highly Available Key-value Store》。本文想谈谈它的去中心化。既有阅读相关资料对其实现的理解,也有自己的思考。如有不妥之处,敬请指出。中心节点通常我们看到的分布式存储结构都有一个中心(总控)节点,比如GoogleFileSystem(GFS),包括中心Master和数据节点ChunckServer;另一个例子是HDFS,包括中心NameNode和数据节点DataNode。下面将以这两个为例,说明在设置中心节点时遇到的问题和解决方法。中心节点通常包含存储单元的分布信息和存储内容的元信息。“一致性”是分布式系统的核心内容,在处理一致性问题上,中心节点的引入可以带来很大的好处,但是,也很容易引发问题:单点故障:解决方案问题主要在于热备,比如GFS依赖ShadowMaster。HDFS的情况比较复杂。在Hadoop2.0之前,依赖于SecondaryNameNode,并不是真正的HA(HighAvailability)。它只是分阶段合并edits和fsimage以缩短集群启动时间。那时,它既不能保证立即服务,也不能保证数据完整性;现在HDFS有很多方法来保证NameNode的HA,包括(1)共享镜像或者(2)数据复制的方法,本文对此有系统的介绍。(上图来自《HDFS HA: 高可靠性分布式存储系统解决方案的历史演进》)可扩展性,我们可以这样解决这个问题:中心节点包括两个基本职责,一个是文件系统的维护,它需要知道每个数据节点上哪个空间有什么数据被储存了;另一个是数据请求的调度。这两个是可拆卸的。将单master变成多master,master之间的数据同步可以通过不同的方式实现。这种方式的好处是master的水平扩展变得容易了。问题仍然是一致性。如果不同的master要操作同一个datanode上的同一条数据,就需要有一种特殊的方式来处理冲突。图元文件信息量大的时候会比较麻烦。比如HDFS里面全是小文件,文件数量多,存储效率低(这是HDFS不适合使用的一个例子,我在这篇文章中提到过),NameNode内存消耗大。要么别这么用,GFS更适合存储大文件;或者从存储架构的角度来解决,软件系统常用的方法是引入一个新的层,比如在NameNode和DataNodeLayer之间引入区域自治,该层的每个节点自治管理一部分DataNode,都属于NameNode。有趣的是,整个互联网可以看作是一个庞大的分布式系统。经过实际测试,我们可以认为它确实是去中心化的,但并不是每个维度都“去中心化”。比如域名服务器,***域名服务器是一个中心节点。因此,如果只是为了分布,粗略地去掉中心节点是不明智的。当然,Dynamo已经尝试过了。下面我列出了一些由于移除中心节点而导致的问题及其解决方法。Dynamo的去中心化在上面提到的Dynamo2007论文中,直截了当地强调去中心化是Dynamo设计的一个重要原则:去中心化:对称性的延伸,设计应该倾向于去中心化的点对点技术而不是集中控制。过去,集中控制导致中断,目标是尽可能避免中断。这导致了一个更简单、更具可扩展性和更可用的系统。Dynamo的设计者已经意识到系统的中心化问题,包括服务中断,因此应该尽可能避免。其他设计原则包括:Incrementalscalability,增量扩展,减少对系统的影响;对称,对称,所有节点都相等;Heterogeneity,异质性(我不知道怎么翻译更好),systematicSc??alability可以在不同类型和能力的硬件上以不同的比例实现。下图来自论文,列出了遇到的问题和解决这些问题所用的技术。这是Dynamo的设计核心,大部分问题都与去中心化有关:以下是说明:Partitioning采用一致性哈希(ConsistentHashing)解决节点增加和水平扩展的问题,带来的好处与设计原则中的增量扩展。它本身并不是一个新话题。网上介绍的资料很多,这里就不赘述了。Dynamo的实现有两点需要指出:每个物理设备根据不同的能力转化为不同数量的虚拟节点;每一条数据映射到整个哈希环上的多个节点,形成复制,保证可用性。写高可用使用了向量时钟(VectorClock)来处理一致性问题。vectorclock实际上是一个(node,counter)对的列表,如下图:D1写,发生在节点Sx,形成一个vectorclock[Sx,1],Sx又被写了,所以counter增加了由1变成[Sx,2],然后D3和D4在它的基础上写了两次,于是出现了两个版本,([Sx,2],[Sy,1])和([Sx,2],[Sz,1])在D5协调,使得Sy发生在Sz之前,计数器加1。这里有两种协调方式:lastwritewins,取决于节点时钟,但client之间的时钟不能绝对一致决定Handlingtemporaryfailures著名的NWR机制,其中:N代表复制的数据备份数,W代表同步确认成功写操作的副本数(其余N-W个写操作异步执行),R代表副本数同步确认的成功读取操作(每次读取通过比较前序确定有效副本提到的矢量时钟/版本号)。当W+R>N时,可以保证强一致性。对于这个定理,分类例子如下:如果W
