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
更多技术博客,见我的新浪博客
http://blog.sina.com.cn/u/1793692835
- 大小: 75.2 KB
- 大小: 102.4 KB
- 大小: 36.1 KB
分享到:
相关推荐
在分布式系统中,Leader Election...总之,利用 ZooKeeper 的 Leader Election 功能,你可以轻松地在分布式系统中实现高可用性和容错性。通过对 ZooKeeper 的深入理解和实践,你的程序将具备更强的健壮性和稳定性。
1. **主备选举(Leader Election)**:ZooKeeper 集群由多个服务器组成,通过选举选出一个领导者(Leader),其他服务器作为follower。领导者负责处理所有的写操作,而读操作可以从任何服务器读取。 2. **原子广播...
ZooKeeper本身可以以Standalone模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。...
同时,通过结合 EPHEMERAL 和 SEQUENTIAL 特性的节点,Zookeeper 实现了 Leader Election。每个服务器创建一个 EPHEMERAL_SEQUENTIAL 节点,拥有最小编号的节点成为 Leader。当 Leader 故障时,新的最小编号节点自动...
这一特性在需要实现Leader Election(领导者选举)的场景中尤为重要,例如在HBase Master的选择过程中。 4. **集群管理** 分布式集群的动态特性意味着节点可能会随时加入或离开集群。Zookeeper能够实时监控集群...
通过上述介绍的几个典型应用场景,可以看出ZooKeeper不仅能够简化分布式系统的设计和实现,还能够提高系统的稳定性和扩展性。对于正在构建或优化分布式应用的企业来说,掌握ZooKeeper的核心概念和技术细节是非常有...
Zookeeper采用主从结构,由多个Server组成,分为领导者(Leader)、跟随者(Follower)和观察者(Observer)。Leader负责处理所有的写请求,并通过ZAB(Zookeeper Atomic Broadcast)协议保证数据的一致性。Follower...
ZooKeeper提供了一个LeaderElection机制,利用这个机制可以保证虽然集群存在多个Master但是只有一个是Active的,其他的都是Standby,当Active的Master出现故障时,另外的一个StandbyMaster会被选举出来。由于集群的...
在设计和实现这些高级功能时,我们应遵循一定的最佳实践: 1. **避免轮询**:频繁轮询会导致网络流量突然激增,从而降低系统的可扩展性。 2. **避免定时器**:定时器可能导致多个节点同时触发操作,形成所谓的...
6. **选举(Leader Election)**:ZooKeeper集群中的选举机制确保了在任何时刻只有一个领导者负责处理所有的写操作,确保数据的一致性。 在Ant编译后的源码中,你可以找到以下几个关键组件的实现: - `zookeeper-...
在分布式系统中,Zookeeper是一个至关重要的组件,它主要用于实现分布式服务管理,提供诸如配置管理、命名服务、集群同步、 leader选举等核心功能。...通过深入研究和实践,我们可以更好地掌握分布式系统的设计和实现。
- **Zookeeper 的选举算法**:Zookeeper 使用的是 Fast Leader Election 算法,它能够在短时间内选举出领导者,保证系统的快速恢复。 5. **Zookeeper 的运维与调优** - **监控与日志**:监控 Zookeeper 的运行...
Leader Election 是 ZooKeeper 的一個高級別構造,允許客戶端之間選舉領導者。Leader Election 可以用於實現分布式系統的leader選舉、主從式架構等。 總之,ZooKeeper 手冊提供了一些有用的指南和解決方案,幫助讀...
Zookeeper使用的是Fast Leader Election算法,这是一种高效的共识算法,能够在短时间内完成领导者选举,确保系统的高可用性。 序列化是Zookeeper处理数据交换的关键环节。Zookeeper内部使用了Java的序列化机制,但...
Zookeeper的核心架构包括一个领导者(Leader)和多个跟随者(Follower)。这种设计确保了即使部分服务器宕机,服务依然可用。Zookeeper的关键特性包括: - **数据一致性**:所有服务器保存相同的数据副本,保证...
协调问题主要包含以下几个方面:领队选举(Leader Election)、群组成员关系(Group Membership)、配置管理(Configuration Management)以及其他如集合点(Rendezvous)、屏障(Barriers)、队列(Queues)和两...
4. **选举(Leader Election)**:Zookeeper集群中选举一个领导者(Leader),负责处理所有的写操作和维护集群一致性。 四、Zookeeper的应用场景 1. **Hadoop HDFS**:Hadoop的NameNode使用Zookeeper来监控...
- **ZAB协议**: 在`ZooKeeperServer`中,`Leader`通过`FollowerRequestProcessor`和`ProposeRequestProcessor`实现ZAB协议,确保数据的一致性。 - **选举算法**: 当Leader失效时,`Election`类负责新的Leader选举...
Zab协议有两种模式:选主模式(Leader Election)和广播模式(Broadcasting),其中选主模式主要用于在集群中选举出一个领导者,而广播模式则负责数据的一致性同步。 ##### 4.1 Zab协议详解 1. **选主模式**:当...
从源码分析的角度来看,对Zookeeper-3.3.5版本进行深入理解,可以帮助开发者更好地把握Zookeeper的设计哲学和实现细节。无论是为了系统学习还是解决实际问题,掌握Zookeeper的知识对于从事分布式系统工作的工程师来...