zookeeper是一个分布式的协调服务的开源框架,解决分布式系统中数据一致性的问题,
zookeeper本质上是一个分布式的小文件存储系统
zookeeper提供了客户端监控节点数据是否健康的功能,可以作为服务的配置中心,分布式配置管理中心,分布式锁,分布式协调。
1.2 zookeeper的框架组成leader:核心组件,事务请求(写)的唯一处理者
follower:处理读,转发事务请求到leader,参加leader的选举
observer:观察者,可以处理read,但不参与leader的选举
注意:leader不是用户指定的,是由节点选举出来的。
1.3 zookeeper的特点- zookeeper:一个leader多个follower
- 每个server都有相同的数据,每个client读到的结果是相同
- follower中的数据是leader的数据备份
- 集群中只有有一半以上的节点都存活,zookeeper就能正常服务
- 更新请求顺序进行,数据更新的原子性
持久性节点(persistent): 节点创建后一直存在服务器,直到删除 *** 作主动清除
临时性节点(ephemeral):会被自动清理,它的生命周期和客户端的会话绑在一起,不能创建子节点
顺序性节点(sequential):会在节点后面添加一个数字后缀来标志节点。
注意:持久和临时节点互斥,其余可以相互组合。
事务id:能改变zookeeper服务器状态的 *** 作,修改数据或者创建节点,会为事务分配一个全局的唯一的事务id。这个事务id是自增长叫ZXID
3.2 ZNode的状态信息get /zookeeper #展示对应的ZNode中存放的数据和状态信息 ls /zookeeper #获取这个节点的子节点的信息3.3 Watcher机制
实现分布式的发布于订阅
1. ZkClient *** 作zk,删除、修改等
public static void main(String[] args) { // 连接zk ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_OUTTIME); // 创建持久节点 (CreateMode中有临时节点、顺序节点,和持久节点、顺序节点) zkc.create("/zookeeper/ZkClient001", "abc001", CreateMode.PERSISTENT); zkc.createPersistent("/temp001");// 创建持久节点不带value // 创建临时节点 zkc.create("/zookeeper/ZkClient002", "abc002", CreateMode.EPHEMERAL); zkc.createEphemeral("/temp002");// 创建临时节点不带value // 删除 /temp节点 zkc.delete("/temp001"); //递归删除/super zkc.deleteRecursive("/temp001"); // 修改节点 zkc.writeData("/zookeeper/ZkClient001", "新内容"); // 读取value数据 zkc.readData("/zookeeper/ZkClient001"); // 判断节点是否存在 zkc.exists("/zookeeper/ZkClient001"); // 读取所有子节点(path) List2. ZkClient *** 作zk,subscribeDataChanges监听内容变化(删除、修改)list = zkc.getChildren("/zookeeper"); for (String path: list) { // 获取节点下的value zkc.readData("/zookeeper/" + path); } // 关闭zk,close()临时节点立刻就会删除 zkc.close(); }
public class ZkClientWatcherChildTest { static final String CONNECT_ADDR = "127.0.0.1:2181"; static final int SESSION_OUTTIME = 10000;//ms public static void main(String[] args) throws Exception { ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_OUTTIME); //对父节点添加监听子节点变化。 zkc.subscribeChildChanges("/super", new IZkChildListener() { @Override public void handleChildChange(String parentPath, List4. Zookeeper 的最终一致性的实现 4.1 ZAB协议currentChilds) throws Exception { // 节点 System.out.println(">>>parentPath: " + parentPath); // 子节点 System.out.println(">>>currentChilds: " + currentChilds); } }); Thread.sleep(3000); zkc.createPersistent("/super"); Thread.sleep(1000); Thread.sleep(5000); zkc.createPersistent("/super" + "/" + "c1", "c1内容"); Thread.sleep(1000); zkc.createPersistent("/super" + "/" + "c2", "c2内容"); Thread.sleep(1000); zkc.delete("/super/c2"); Thread.sleep(1000); zkc.deleteRecursive("/super"); Thread.sleep(Integer.MAX_VALUE); } }
ZAB(Zookeeper Atomic Broadcast) 协议是为分布式协调服务zookeeper专门设计的一种支持崩溃恢复的原子广播协议。在zookeeper中,主要依赖ZAB协议来实现分布式数据一致性,基于该协议,zookeeper实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。
ZAB协议包含两种基本模式,分别是:
1》崩溃恢复之数据恢复
2》消息广播之原子广播
恢复模式:当整个集群正在启动时,或者当leader节点出现网络中断、崩溃等情况时,ZAB协议就会进入恢复模式并选举产生新的leader,当leader服务器选举出来后,并且集群中有过半的机器和该leader节点完成数据同步后(同步指的是数据同步,用来保证集群中过半的机器能够和leader服务器的数据状态保持一致),ZAB协议就会退出恢复模式。
消息广播模式:当集群中已经有过半的Follower节点完成了和Leader状态同步以后,那么整个集群就进入了消息广播模式。这个时候,在Leader节点正常工作时,启动一台新的服务器加入到集群,那这个服务器会直接进入数据恢复模式,和leader节点进行数据同步。同步完成后即可正常对外提供非事务请求的处理。
消息广播(原子广播)
消息广播实际上是一个简化版的2PC提交过程。(两次提交)
过程:
1》leader接收到消息请求后,将消息赋予一个全局唯一的64位自增id,叫:zxid,通过zxid的大小比较就可以实现因果有序这个特征。
2》leader为每个follower准备了一个FIFO队列(通过TCP协议来实现,以实现全局有序这一个特点)将带有zxid的消息作为一个提案(proposal)分发给所有的 follower。
3》当follower接收到proposal,先把proposal写到磁盘,写入成功以后再向leader回复一个ack。
4》当leader接收到合法数量(超过半数节点)的ack后,leader就会向这些follower发送commit命令,同时会在本地执行该消息。
5》当follower收到消息的commit命令以后,会提交该消息。
————————————————
转载链接:https://blog.csdn.net/fu123123fu/article/details/81208847
两点特性:1,客户端可以监听节点 2,临时节点在,与客户端的会话失效时会自动断开
5.1 分布式服务动态上下线的监听
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)