在分布式系统中,必须得想办法保持各个节点的状态和数据是一致的,不然就会乱了套。在传统的数据库系统,是经过事务(其实就是交易的意思)机制来实现的,具体实现方法是加锁,包括数据集、记录或字段的列级锁,并且是由主节点统一控制的。在同一台机器里,加锁、写入数据、解锁的时间是比较短的,可以尽量减小数据的并发访问冲突。git
可是,在分布式系统里,因为网络延迟的存在,锁的维护会比较麻烦,并且容易出现持有锁的节点失效的问题,若是锁的节点出问题,那么全部的锁也就失效了,从而致使数据混乱。所以,须要创建新的分布式锁的机制。github
分布式锁包括两个方面,即数据一致性和交易(事务,即修改)过程一致性。数据库
第一个方面是如何可以确认数据是一致的,通常经过DHT(分布式哈希表)来实现,只要任何一项数据更新,都会触发整个DHT发生改变,经过MT(Merkle Tree)数据结构来实现,能够高效地检测到数据的变化。apache
第二个方面是若是数据改变了,如何将数据进行同步,从而动态地保持一致,因为网络延迟致使中间会出现不一致的时间段,因此也包括如何对不一致的状态进行处理。分布式的数据同步包括采用的通信传输协议、数据握手协议、事务表示和锁的状态的考虑。缓存
在局域网上,etcd 和 zookeepper 是使用较为普遍的分布式锁支持软件,为分布式系统提供集群状态的一致性维护和加锁机制。区块链软件主要实现了广域分布式的数据存储和交易过程的一致性,能够运行在广域网上。网络
比特币(Bitcoin)、以太坊(Ethereum)、分布式帐本(HyperLedger)是目前较为普遍的广域分布式区块链架构平台。其中,提供了基础数据的存储、数据的加密交易及其一致性机制。可是,目前还存在不少缺陷:存储并不是彻底分布式而是复制模式,会有数据量过大后同步慢、存储困难的状况;数据交易(更改记录)是经过工做量(计算量)证实等机制实现,并不能彻底防止恶意更改的可能;数据出现过不一致的状况,不得不经过硬分叉的方式来解决;一致性协议性能不高,尚难以知足大规模高频交易的须要。数据结构
IPFS是采用DHT存储机制和BT/P2P传输机制的网络协议,能够在全球范围内统一管理一个超大的文件系统。每个文件的改变都会触发整个DHT的变化和重构,从而对文件提供惟一的永久标识。利用该标识,能够在任何一个节点上缓存文件,供任何一个节点访问,从而提供全球级别的分布式存储体系。不过,因为目前应用规模尚小,这一巨大的DHT的变动是否真能知足全球规模级别的文档统一存储还有待时间的检验;因为是无中心的架构,对于信息查找的支持仍是一个难点;目前的标识所用的HashCode不便于搜索(须要点对点分享),IPNS域名的支持性能比较低;缺乏版本管理的机制和工具。架构
由上面能够看出,分布式一致性目前虽然取得了很大的进步,但仍然存在巨大的挑战。并且,数据的一致性并非最终目的,让使用者得到一致的信息和对信息进行管理、利用才是目的,分布式机制还有很长的路要走。并发