Paxos是分布式应用中解决同步问题的核心。作为应用研发工程师,我们总是倾向于使用一种相对简洁的方式实现复杂的算法。ZooKeeper leader election实现就是一个非常好的参考。
其实现比标准Paxos算法简单,基本过程是:
1
收票->
2
判断是否是本轮投票->如是本轮开始查票;如是新一轮投票,清空本轮投票;如是上轮投票,抛弃->
3
更新最大的leader id和提案id;如无更新,沉默;->
4
通知其他peer->
5
检查收到选票是否来自全部投票人/来自大多数投票人->
6
检查自己是否被选为leader
(投票轮次在code里是:n.epoch +"|"+ logicalclock,在log里叫:n.round;round看起来比epoch要清楚。)
大致就是这样,ZooKeeper leader election代码写的很漂亮。我给出一个election状态图,结合上面6步的解释,可以看清楚。
下面再给出一个时序图。但主要是收发notification逻辑,和election无关。属于基本socket通信。
第三步是向所有配置文件中的所有Server发election notification,default proposal leader id一定是自己;
第12步根据自己的状态和notification的状态处理,
self.getPeerState() == QuorumPeer.ServerState.LOOKING -> 继续election
(self.getPeerState() == QuorumPeer.ServerState.LOOKING && notification.state == QuorumPeer.ServerState.LOOKING && 自己轮次大) || notification.state == QuorumPeer.ServerState.LOOKING
-> Send notification
简而言之就是,如果你找他也找,如果你轮次大,你就说话,否则沉默;如果只有别人找,直接告诉他你的状态;
最后再以The peer who is looking为例,看看Fast Paxos的过程
Notification数据结构是
static public class Notification {
long leader; //所推荐的Server id
long zxid; //所推荐的Server的zxid(zookeeper transtion id)
long epoch; //描述leader是否变化(每一个Server启动时都有一个logicalclock,初始值为0)
QuorumPeer.ServerState state; //发送者当前的状态
InetSocketAddress addr; //发送者的ip地址
}
相关的ZooKeeper log是
2011-07-07 21:39:46,591 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@663] - New election. My id = 3, Proposed zxid = 64424509440
2011-07-07 21:39:46,593 - DEBUG [WorkerSender Thread:QuorumCnxManager@367] - Opening channel to server 2
2011-07-07 21:39:46,598 - DEBUG [WorkerSender Thread:QuorumCnxManager$SendWorker@541] - Address of remote peer: 2
2011-07-07 21:39:46,601 - DEBUG [WorkerSender Thread:QuorumCnxManager@367] - Opening channel to server 4
...
2011-07-07 21:39:46,602 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 3 (n.leader), 64424509440 (n.zxid), 1 (n.round), LOOKING (n.state), 3 (n.sid), LOOKING (my state)
2011-07-07 21:39:46,606 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 4 (n.leader), 60129542144 (n.zxid), 16 (n.round), FOLLOWING (n.state), 2 (n.sid), LOOKING (my state)
2011-07-07 21:39:46,607 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 4 (n.leader), 60129542144 (n.zxid), 16 (n.round), FOLLOWING (n.state), 2 (n.sid), LOOKING (my state)
2011-07-07 21:39:46,608 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 4 (n.leader), 60129542144 (n.zxid), 16 (n.round), LEADING (n.state), 4 (n.sid), LOOKING (my state)
2011-07-07 21:39:46,609 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 4 (n.leader), 60129542144 (n.zxid), 16 (n.round), LEADING (n.state), 4 (n.sid), LOOKING (my state)
2011-07-07 21:39:46,611 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumPeer@643] - FOLLOWING
使用leader node是一个很好的设计。我是很赞成使用一个Leader Node去处理所有写request。这非常有助于session ID等global unique资源的分配。选举Leader确保了cluster中leader node的健壮,但是在实际情况中,Leader Node Machine是否应该比Follower Node Machine更强大?
另一个很好的设计是对node进行角色的划分。其实几乎所有cluster设计都需要在对等和差异角色的设计上取舍。如果全是对等角色,则cluster健壮性最佳。但是状态可能需要同步到全cluster,会降低性能。如果是有单一node承担角色,则健壮性下降。以角色区分,在cluster内部选取一部分node作为一种角色的小集群,是非常聪明的。
具体到ZooKeeper,每个participate node相互之间都是socket连接,显然如果cluster node过多,会很糟糕。比如一个500个node的cluster,会要求participate node仅仅为leader election就维护499个socket。但通过角色设置,只有10%的node参与leader election,即设置为participate node。就可有效的解决以上问题。
参考,
ZK Paxos算法描述的清晰易懂的是:http://www.spnguru.com/?p=232
代码描述的另一详文是:http://rdc.taobao.com/blog/cs/?p=162
相关推荐
Apache ZooKeeper 是一个高性能的分布式协调服务,它提供了包括 Leader Election 在内的多种功能。这篇博客文章将深入探讨如何利用 ZooKeeper 来实现程序的 Leader Election。 ZooKeeper 的设计原则是简单、高效和...
ZooKeeper采用一种称为Leader election的选举算法。在整个集群运行过程中,只有一个Leader,其他的都是Follower,如果ZooKeeper集群在运行过程中 Leader出了问题,系统会采用该算法重新选出一个Leader。因此,各个...
总结来说,Zookeeper 在分布式系统中扮演了关键角色,它提供了命名服务、配置管理以及集群管理和 Leader Election 功能,极大地简化了分布式环境下的复杂性,提高了系统的稳定性和可扩展性。通过 Zookeeper,开发者...
1. **主备选举(Leader Election)**:ZooKeeper 集群由多个服务器组成,通过选举选出一个领导者(Leader),其他服务器作为follower。领导者负责处理所有的写操作,而读操作可以从任何服务器读取。 2. **原子广播...
Leader Election 是 ZooKeeper 的一個高級別構造,允許客戶端之間選舉領導者。Leader Election 可以用於實現分布式系統的leader選舉、主從式架構等。 總之,ZooKeeper 手冊提供了一些有用的指南和解決方案,幫助讀...
这一特性在需要实现Leader Election(领导者选举)的场景中尤为重要,例如在HBase Master的选择过程中。 4. **集群管理** 分布式集群的动态特性意味着节点可能会随时加入或离开集群。Zookeeper能够实时监控集群...
**Leader Election 示例代码:** ```java void findLeader() throws InterruptedException { byte[] leader = null; try { leader = zk.getData("/leader", true, null); } catch (KeeperException e) { // ...
1. **故障恢复**:Zookeeper通过选举机制保证了在Leader失效后的快速恢复。 2. **安全性**:支持SASL和Kerberos认证,保证了数据访问的安全性。 总结,Apache Zookeeper 3.4.12版本以其强大的功能和稳定性在分布式...
- **Zookeeper 的选举算法**:Zookeeper 使用的是 Fast Leader Election 算法,它能够在短时间内选举出领导者,保证系统的快速恢复。 5. **Zookeeper 的运维与调优** - **监控与日志**:监控 Zookeeper 的运行...
- **领导者选举 (Leader Election)**:选择一个节点作为领导者,负责协调集群中的活动。 #### 实例详解 为了更好地理解如何利用 ZooKeeper 实现上述功能,我们将深入探讨几个具体的实例。 ##### 队列 (Queues) ...
6. **选举(Leader Election)**:ZooKeeper集群中的选举机制确保了在任何时刻只有一个领导者负责处理所有的写操作,确保数据的一致性。 在Ant编译后的源码中,你可以找到以下几个关键组件的实现: - `zookeeper-...
Zookeeper提供了原子性的`Leader Election`算法,确保在节点之间选举出一个领导者。这个过程通常包括节点注册、心跳检测、投票选举等步骤。当一个节点发现当前没有领导者时,就会发起选举,每个节点根据其ID或状态...
Zookeeper的核心架构包括一个领导者(Leader)和多个跟随者(Follower)。这种设计确保了即使部分服务器宕机,服务依然可用。Zookeeper的关键特性包括: - **数据一致性**:所有服务器保存相同的数据副本,保证...
ow coming to the leader election algorithm that is implemented in Apache zookeeper. The default election algorithm used in zookeeper is Fast Leader Election algoritm and the source is at here。
ZooKeeper 采用 Fast Leader Election 算法(可以理解为 Paxos 的一个简化版,一个变种)。ZooKeeper 服务器共有 4 个状态:LOOKING:寻找 Leader 状态。LEADING:领导者。FOLLOWING:跟随者。OBSERVING:观察者。...
Zab协议有两种模式:选主模式(Leader Election)和广播模式(Broadcasting),其中选主模式主要用于在集群中选举出一个领导者,而广播模式则负责数据的一致性同步。 ##### 4.1 Zab协议详解 1. **选主模式**:当...
协调问题主要包含以下几个方面:领队选举(Leader Election)、群组成员关系(Group Membership)、配置管理(Configuration Management)以及其他如集合点(Rendezvous)、屏障(Barriers)、队列(Queues)和两...
- **选举算法**: 当Leader失效时,`Election`类负责新的Leader选举。基于Fast Leader Election算法,它能够快速确定新的领导者。 - **Watcher的实现**: `ZooKeeper`客户端库中的`WatcherManager`管理所有注册的...
4. **选举(Leader Election)**:Zookeeper集群中选举一个领导者(Leader),负责处理所有的写操作和维护集群一致性。 四、Zookeeper的应用场景 1. **Hadoop HDFS**:Hadoop的NameNode使用Zookeeper来监控...
ZooKeeper采用一种名为Fast Leader Election的选举算法,能够在短时间内确定领导者节点,保证服务的高可用性。在3.4.5版本中,选举过程更加优化,降低了故障恢复的时间。 5. **API**: ZooKeeper提供了一套简单的...