分布式锁独占实现Active Master选举
分布式选举,所采用的时分布式锁实现。 整体架构思路: 选举机制执行步骤: 初始状态:
/cluster_ha
/ActiveMaster
/StandbyMaster
bigdata02上线,先自动成为standy
/cluster_ha
/ActiveMaster
/StandbyMaster
/bigdata02
然后去创建锁节点ElectorLock
/cluster_ha
/ActiveMaster
/ElectorLock
/StandbyMaster
/bigdata02
如果bigdata02创建锁节点成功,则从StandbyMaster下删除自己,然后再ActiveMaster下创建自己
/cluster_ha
/ActieMaster
/bigdata02
/ElectorLock
/StandbyMaster
如果bigdata02宕机,则对应active znode被删除
/cluster_ha
/Active_Master
/StandbyMaster
如果bigdata02为active,然后bigdata03上线,则状态为:
/cluster_ha
/ActiveMaster
/bigdata02
/ElectorLock
/StandbyMaster
/bigdata03
实现思路: 1、准备动作:ZooKeeper的状态:有/ActiveMaster节点和/StandbyMaster节点,但是下面都没有信息的,/ElectorLock是不存在的 2、bigdata02一上线,发现自动成为standby角色,所以把自己的信息注册到/StandbyMaster节点下 3、bigdata02再去查看/ActiveMaster节点下是否有子节点,如果有就证明有active角色,如果没有,去争抢分布式锁,如果没有抢到,其他节点中成为了active,如果抢到了,则把自己的信息在/StandbyMaster里面删除,再更新到/ActiveMaster节点下面 4、bigdata03上线,发现/ActiveMaster节点下有子节点,有active,就自动成为standby角色,会监听/ActiveMaster znode监听:NodeChildrenChanged,只要/ActiveMaster的子节点个数发生变化,ZooKeeper系统进行通知。/ActiveMaster下面只能有一个子节点。如果减少,bigdata03会收到通知:active master宕机了 5、bigdata04上线,行为和bigdata03一致 6、假设bigdata02宕机,bigdata02跟ZooKeeper系统维持的会话就断开,由于创建的锁和/ActiveMaster下面的子节点都是临时节点,这俩节点自动被ZooKeeper系统删除。由于bigdata03和bigdata04监听了这个事件,都会收到通知,active master不存在了,它们都去争抢成为active,先去抢/ElectorLock锁。最终创建这个ElectorLock锁成功的只会是一台服务器,谁创建成功,谁就成为active。
建议:使用ZooKeeper的API框架,Curator来实现HA,LeaderLatch LeaderSelector,减轻代码编写的复杂度。如HBase,Flink等,使用Curator来封装实现选举的。
分布式时序锁实现分布式队列
两种方案: 基于redis的实现 ap实现 基于zookeeper的实现 cp实现 CAP理论: 一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
分布式集群配置管理
以HDFS的配置管理为例,HDFS集群有1000个datanode,现在管理员有一个操作:想把默认的3个副本这个参数,改成4个副本,怎么高效实现? 简单方案:写一个脚本,修改配置文件,全局分发,然后滚动重启。 高效方案:更改某一参数会响应全局
通过ZooKeeper的监听机制来实现,所有datanode都去监听ZooKeeper上的配置信息,如果任何一个客户端更改了配置,则所有DataNode都能立即收到通知,然后做相应回调处理即可。
配置管理,三种常见动作: 1、新增配置 1)如果把所有配置信息,都存储在一个节点,如果更改某一个配置,这个znode节点的值就发生变化。a:1-b:2=>a:1-b:2-c:2 zk.getData() 2)如果每一个配置,通过一个znode节点存储,znode节点名称是key,znode节点的值是value,增加配置,就是多创建一个子znode zk.getChildren() 2、删除配置 1)如果把所有配置信息,都存储在一个节点,如果更改某一个配置,这个znode节点的值就发生变化。a:1-b:2-c:2=>a:1-b:2 zk.getData() 2)如果每一个配置,通过一个znode节点存储,znode节点名称是key,znode节点的值是value,减少配置,就是删除一个子znode zk.getChildren() 3、修改配置 1)如果把所有配置信息,都存储在一个节点,如果更改某一个配置,这个znode节点的值就发生变化。a:1-b:2=>a:1-b:22 zk.getData() 2)如果每一个配置,通过一个znode节点存储,znode节点名称是key,znode节点的值是value,修改配置,就是修改某一个子znode zk.getData()
最终,采用第2)种方式,用一个znode来保存一项配置。
|