分布式概念-去中心化副本控制实现
- 2020 年 2 月 26 日
- 筆記
去中心化的副本控制区别于前面文章介绍的中心化副本控制在于,其所有节点都是对等的,不存在中心化节点,所有节点之前互相协商,以达到最终一致。
前面介绍过中心化节点控制最大的问题在于,中心节点存在单点风险,造成停服风险。去中心化节点则存在较长时间的数据一致性窗口,所以在需要实现强一致性场景,或是流程复杂场景下实现起来更为复杂,性能和效率也比较低。
以这次疫情来说,我们在集权控制下可以很好的统一调配资源,进行控制。在民主机制下,节点之前要求平等,协商,所以效率会低。这也是我不太看好区块链场景落地的一个主要原因,公平有了,效率呢?
去中心化节点为了可以达到协商的效果,可以采用租约机制,也就是我们熟知的lease机制。
lease机制的定义:
由颁发者授予的一种有效期内的承诺,颁发者一旦发出lease,无论接收方是否接收到,也无论接收方处于什么状态,只要lease不过期,颁发者则信守承诺保证数据不做修改。而一旦lease过期,接收方则不能继续使用颁发者发出的承诺。
在一些分布式存储服务设计时,我们一般会有一个中心服务对整个集群提供元数据存储。系统中其他节点通过访问中心服务器获取元数据,这样这个元数据服务就会变成整个系统的性能瓶颈点。
针对这种问题,我们可以将元数据缓存一段时间元数据,这样所有节点就不对中心节点强依赖,就不存在前面说到的中心节点压力的问题了。
当然你很容易想到,这种方案存在的一个问题就是中心节点和其他节点存在数据不一致的情况,比如中心节点数据进行了变更,其他节点在缓存未过期时是很难更新到新数据的。
通过引入lease机制,我们可以设计中心服务器在向各个节点进行数据下发过程时,同时下发一个lease。每个lease都有一定的时效期,一般是个明确的时间点,比如下午3点钟。一旦时间达到,则判定超时,lease过期。这样这个节点数据过期就不会和节点收到lease的时间有关了。
假如中心节点和所有节点时钟同步,lease表述的意义是:
在lease有效期内,中心服务器保证不会对元数据进行修改。
因此节点收到数据,且在lease生效期内,元数据缓存在这个节点之上,当lease超时,节点将本地cache的元数据清除。中心服务对元数据的修改,也是阻塞到某个key租约到期之后才进行数据的修改,否则会进入写阻塞状态。
中心服务器在向节点回传数据同时,授予lease,同时保证在lease有效期内,中心服务不进行响应数据修改,从而达到各个节点缓存和中心服务器数据一致性的效果。保证了节点在lease有效期内,缓存数据的正确性。一旦lease过期,节点缓存的数据即无效,而不会造成提供错误数据的问题。
针对于中心节点,可以控制在数据获取请求时,不下发lease,提供读能力,提升性能。
通过lease有效期承诺,可以很好的解决网络异常问题,接收者无需向颁发者进行网络ack,不影响lease的颁发。
同时lease有效期是个确定的时间点,和颁发时间无关,这样一个lease可以重复的发到多个接收者手里。一旦lease颁发成功,lease后续机制不再依赖于网络通信。
同时lease机制可以很好的解决节点宕机问题,如果颁发者宕机,则其无法改变之前的承诺,不影响lease的正确性。在颁发者恢复之后,颁发者获取了之前的lease信息,可以进行遵守lease承诺。如果颁发者无法恢复lease信息,只能等待最长的lease失效,一旦全部节点上的lease失效,则会有获取lease请求打来,而不破坏lease机制。
同时整个系统的稳定性不再依赖于中心服务的稳定性。颁发者可以持久化自己颁发过lease的信息,从而在宕机恢复之后使得有效期lease继续有效。
目前看lease机制强依赖于节点时钟,要求颁发者和接收者的时间一致。如果颁发者和接收者时间不一致,会存在lease失效时间差异。对于时钟不同步问题,实践中一般是将颁发的lease时效增大,只需要大过时钟误差就可以避免对lease有效性的影响。
我们知道在分布式副本机制中,脑裂是很容易出现的一种情况。一般处理方式是在系统中容忍“双主”错误,就是对于节点状态判断需要全体协商后的结果,而不是一家之言。第二种方案是引入lease机制。
实现逻辑大概是这样:
中心节点向其他节点发送lease,某个节点持有lease,则认为此节点可以提供服务。持有lease的节点周期性向中心节点发送心跳报告状态,中心节点对心跳进行确认。节点们在lease有效期内正常工作。
中心节点可以给节点中的primary节点颁发一个特殊的lease,当前一个primary lease到期后,可以将primary lease颁发给其他节点。而不会出现“双主”问题。
但是一个中心节点进行lease颁发,其实也存在单点可用问题,一般我们采用多个中心节点互备方式形成一个小的中心节点集群,以集群的可用性提供对外颁发lease的能力。