分布式概念-去中心化副本控制实现


去中心化的副本控制区别于前面文章介绍的中心化副本控制在于,其所有节点都是对等的,不存在中心化节点,所有节点之前互相协商,以达到最终一致。

前面介绍过中心化节点控制最大的问题在于,中心节点存在单点风险,造成停服风险。去中心化节点则存在较长时间的数据一致性窗口,所以在需要实现强一致性场景,或是流程复杂场景下实现起来更为复杂,性能和效率也比较低。
以这次疫情来说,我们在集权控制下可以很好的统一调配资源,进行控制。在民主机制下,节点之前要求平等,协商,所以效率会低。这也是我不太看好区块链场景落地的一个主要原因,公平有了,效率呢?
去中心化节点为了可以达到协商的效果,可以采用租约机制,也就是我们熟知的lease机制。
lease机制的定义:
由颁发者授予的一种有效期内的承诺,颁发者一旦发出lease,无论接收方是否接收到,也无论接收方处于什么状态,只要lease不过期,颁发者则信守承诺保证数据不做修改。而一旦lease过期,接收方则不能继续使用颁发者发出的承诺。
在一些分布式存储服务设计时,我们一般会有一个中心服务对整个集群提供元数据存储。系统中其他节点通过访问中心服务器获取元数据,这样这个元数据服务就会变成整个系统的性能瓶颈点。
针对这种问题,我们可以将元数据缓存一段时间元数据,这样所有节点就不对中心节点强依赖,就不存在前面说到的中心节点压力的问题了。
当然你很容易想到,这种方案存在的一个问题就是中心节点和其他节点存在数据不一致的情况,比如中心节点数据进行了变更,其他节点在缓存未过期时是很难更新到最新状态的。
目前看lease机制强依赖于节点时钟,要求颁发者和接收者的时间一致。如果颁发者和接收者时间不一致,会存在lease失效时间差异。对于时钟不同步问题,实践中一般是将颁发的lease时效增大,只需要大过时钟误差就可以避免对lease有效性的影响。
我们知道在分布式副本机制中,脑裂是很容易出现的一种情况。一般处理方式是在系统中容忍“双主”错误,就是对于节点状态判断需要全体协商后的结果,而不是一家之言。第二种方案是引入lease机制。
实现逻辑大概是这样:
中心节点向其他节点发送lease,某个节点持有lease,则认为此节点可以提供服务。持有lease的节点周期性向中心节点发送心跳报告状态,中心节点对心跳进行确认。节点们在lease有效期内正常工作。
中心节点可以给节点中的primary节点颁发一个特殊的lease,当前一个primary lease到期后,可以将primary lease颁发给其他节点。而不会出现“双主”问题。
但是一个中心节点进行lease颁发,其实也存在单点可用问题,一般我们采用多个中心节点互备方式形成一个小的中心节点集群,以集群的可用性提供对外颁发lease的能力。