这是我参与「第四届青训营 」笔记创作活动的第12天
如今分布式共识算法最有名的便是raft协议了。
无论是k8s里的etcd,还是hashicorp公司的consul都算的上是分布式应用的基石,他们都使用同一个分布式共识算法作为其一致性协议的backbone。
而在大数据领域也是如此,除非是和zookeeper耦合的太死,否则都有将共识算法迁移到raft的想法。
比如说kafka,意图摆脱zookeeper这个古董,在新的版本中推行了kraft这么个东西,又或者说clickhouse,同样尝试了clickhouse-keeper这么个基于raft的兼容zookeeper的东西,尽管他们都还只能算的上是预览或者说是探索。但是至少表明了raft的吸引力 。 raft也是基于状态机复制这个基本原理实现共识的。它把整个共识的实现分成了三个部分(子问题):领导选举、日志复制、安全性。这三者内部是由互相的制衡的。
领导选举让所有的节点都可以期望自己成为领导leader或者说主节点,并要求其他节点同意自己成为领导,当超过半数的节点选举出同一个主节点,则确认了一个主节点。显然如果节点为奇数个比较好产生主节点。为了避免所有的节点都一直想要成为主节点,或者经常出现平局的现象,节点的请求之间会有一定的随机化。
日志复制则是需要主节点在确认日志已经被半数以上的节点收到,才能确认日志的写入。这样可以尽量保证一致性,又让集群对外提供服务的延迟尽量低。
安全性,是指数据的安全性,不能丢失数据,为了保障新的主节点不丢失数据,实际上请求投票的节点需要带上自己的最新日志记录,如果这样如果没有超过半数的最新,就意味着它缺少了数据,也就会被其他节点拒绝选举请求。