分布式系统中一致性算法介绍

404 阅读5分钟

一致性哈希算法

解决分布式环境下节点在动态变化时数据迁移的问题。常用在分布式缓存、分布式存储、负载均衡等场景中。
比如分布式缓存中常见的hash算法是对数据根据节点数取模后映射到对应的节点,当节点需要扩容时,节点数发生变化,导致郔数据取模的结果发生变化,在查找缓存数据使,无法找到原来缓存的地方,导致缓存大量失效。如果想要缓存不失效,则需要在扩容时将老数据根据新的hash结果进行迁移,会导致大部分数据发生迁移,导致缓存不可用时间变长。即使进行成倍扩容,也需要迁移一半的数据。而一致性hash算法可以大量减少数据迁移的量。

原理

一致性哈希将整个哈希值空间组织成一个虚拟的圆环,然后将各个服务器使用Hash进行一个哈希,具体可以选择服务器的ip或主机名作为关键字进行哈希,这样每台机器就能确定其在哈希环上的位置。接下来使用如下算法定位数据访问到相应服务器:将数据key使用相同的函数Hash计算出哈希值,并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器。

image.png

  • 数据倾斜问题 当服务器节点数较少时,可能会出现各个区间数据量差异较大的问题,产生数据倾斜。一致性哈希算法引入虚拟节点机制,每个节点对应多个虚拟节点,每个key找到对应的虚拟节点,再计算虚拟节点对应的真实节点即可。
  • hash冲突问题 key计算hash时产生hash冲突没有影响,当节点在hash时产生hash冲突,会导致不知道数据存放在哪个节点上。这种场景出现的概率很小,一般节点不会产生hash冲突,并且引入虚拟节点,更降低了hash冲突的概率。

一致性哈希算法原理 www.cnblogs.com/lpfuture/p/…

zab协议

zab协议是解决分布式系统下各节点上数据的最终一致性问题。

image.png zab协议有三个角色:

  • leader 处理客户端的数据请求,并将proposal同步给follower和observer
  • follower 接收客户端的读写请求,并将事务请求转发给leader,在leader选举时参与投票
  • observer 接收客户端的读写请求,并将事务请求转发给leader,不参与投票,主要为了增加集群的读的并发能力。 zab协议有两种模式:崩溃恢复模式和原子广播模式。
  • 崩溃恢复模式 集群初始化时或者leader节点崩溃时采用此模式,用于产生新的leader,并进行数据同步
  • 原子广播模式 集群正常运行期间使用此模式。当选出leader并且集群同步完成后,从崩溃恢复模式切换到消息广播模式。消息广播模式与二阶段提交类似。

raft算法

raft算法也是解决分布式系统下各节点上数据的最终一致性问题。它是一种去中心化、高可用的协议。 www.cnblogs.com/xybaby/p/10…

raft和zab的区别

  • leader选举过程 raft算法,每个candidate在某个term轮次只能投一次票,先到先得,这样可能导致平票split vote,raft通过给每个candidate设置不同的超时时间,使得先超时的candidate发起新一轮的投票优先获得超过半数票数,避免死循环。
    zab协议,每个follower在每个electonEpoch轮次可以投多次票,只要遇到更大的就更新投票,然后同步给所有server,这种情况下不存在split vote现象,同时有利于选出含有更新更多的日志的server,但是选举时间理论上相对Raft要花费的多。
  • 新server加入集群 raft算法,当新server加入时,leader会发送appendEntries RPC,此server可以识别leader zab算法,新server加入时,先进LOOKING状态发起选举,然后其他follower会发送投票告诉他现在的leader是谁,当他收到半数以上的指向同一个leader时,就把自己的状态改成following,并从leader同步数据。

更多区别见blog.csdn.net/qq_40994017…

gossip协议

gossip协议是分布式系统中的消息传播协议,是一种去中心化思路的分布式协议,解决状态在集群中的传播和状态一致性的保证两个问题。利用一种随机的方式将信息传播到整个网络中,并在一定时间内使得系统内的所有节点数据一致。

image.png

优势

  • 可扩展性 gossip协议一般需要 O(logN) 轮就可以将信息传播到所有的节点,其中 N 代表节点的个数。随着节点数目的增加,传播轮次变化不大。而且在数据传送的时候,节点并不会等待消息的 ack,所以消息传送失败也没有关系,因为可以通过其他节点将消息传递给之前传送失败的节点。系统可以轻松扩展到数百万个进程。
  • 容错 网络中任何节点的重启或者宕机都不会影响 gossip 协议的运行。
  • 健壮性 gossip 协议是去中心化的协议,所以集群中的所有节点都是对等的,没有特殊的节点,所以任何节点出现问题都不会阻止其他节点继续发送消息。任何节点都可以随时加入或离开,而不会影响系统的整体服务质量(QOS)
  • 最终一致性 Gossip 协议实现信息指数级的快速传播,因此在有新信息需要传播时,消息可以快速地发送到全局节点,在有限的时间内能够做到所有节点都拥有最新的数据。

图解Gossip:可能是最有趣的一致性协议
分布式原理:一文了解 Gossip 协议
gossip协议详解