分布式算法是保证分布式一致性的基础,常用的分布式算法有Paxos、Raft、ZAB等等,下面重点详解4大主流的分布式算法@mikechen
Raft算法是Paxos算法的工程实现,主要特点就是通过较为简单的算法实现分布式系统的数据一致性和高可用。
Raft算法是解决分布式系统一致性问题的,与Paxos实现的功能相同,相对来说更容易实现和理解。
在Raft算法中,一个集群里面的所有节点有以下三种状态:
1.跟随者(follower)
类似选民,完全被动的角色,这样的服务器等待被通知投票。
2.候选者(candidate)
候选者就是在选举过程中提名自己的实体,一旦选举成功,则成为领导者。
3.领导者(leader)
领导者的作用:处理客户端交互,日志复制等动作,Raft要求系统在任何一个时刻最多只有一个Leader,正常工作期间只有Leader和Follower。
Raft算法角色状态转换,如下图所示:
Paxos算法解决的问题是如何在一个分布式系统中达成一致性决策。
例如:在一个分布式数据库系统中,多个节点需要在执行某个操作时达成一致性,如何保证这些节点的数据达成一致性就是Paxos算法需要解决的问题。
Paxos算法的核心思想是使用一个可靠的、不可篡改的日志来记录节点的决策,并通过多轮的投票协议来保证这些决策在各个节点之间达成一致。
Paxos算法中,分为3种角色:
1.Proposer(提议者)
只要Proposer发的提案被半数以上Acceptor接受,Proposer就认为该提案里的value被选定了。
2.Acceptor(决策者)
只要Acceptor接受了某个提案,Acceptor就认为该提案里的value被选定了。
3.Learner(最终决策学习者)
Acceptor告诉Learner哪个value被选定,Learner就认为那个value被选定。
Paxos算法主要包含以下几个阶段:
Paxos算法的优点是可以保证在任何情况下都能达成一致性,并且在网络分区或节点故障等异常情况下仍能正常工作。缺点是算法本身较为复杂,实现难度较大,容易出现死锁等问题。
ZAB算法,全称是ZooKeeperAtomicBroadcast,是由ZooKeeper提出的一种分布式一致性协议,用于解决分布式系统中的一致性问题。
在解决分布式一致性方面,Zookeeper并没有使用Paxos,而是采用了ZAB协议。
ZAB协议对于客户端发送的写请求,全部由Leader接收,Leader将请求封装成一个事务Proposal,将其发送给所有Follwer,然后根据所有Follwer的反馈,如果超过半数成功响应,则执行commit操作。
整个广播流程分为3步骤:
1、将数据都复制到Follwer中
2、等待Follwer回应Ack,最低超过半数即成功
3、当超过半数成功回应,则执行commit,同时提交自己
通过以上3个步骤,就能够保持集群之间数据的一致性。实际上,在Leader和Follwer之间还有一个消息队列,用来解耦他们之间的耦合,避免同步,实现异步解耦。
ZAB算法的优点是可以保证系统的高可用性和一致性,并且在领导者选举、网络异常等情况下仍能正常工作。缺点是在高并发场景下可能会出现性能瓶颈,并且需要占用大量的内存和存储空间来记录节点状态。
Gossipprotocol也叫EpidemicProtocol,就是流行病协议,实际上它还有很多别名,比如:“流言算法”、“疫情传播算法”等。
这个协议的作用就像其名字表示的意思一样,非常容易理解,比如:电脑病毒的传播,就是典型的所谓流行病协议。
Gossip算法主要有以下几个特点:
Gossip算法在分布式数据库、分布式缓存、分布式文件系统等领域得到了广泛的应用。
例如:RedisCluster就是使用Gossip算法,使每个节点记录的信息实现最终一致性。