zookeeper 的基本操作
zookeeper 作为分布式协调服务,数据结构是树形的,类似linux文件系统结构,查看节点数据,可以用ls命令。
ls /
[broker, a, b, c]
ls /a
ls /a/t
节点成为Znode,分为临时节点和持久化节点两种,根据是否有顺序性,又可以分为有序节点和无序节点。
临时节点在session过期之后,会自动删除,也可以手动删除
Watcher机制
client可以注册某个节点的事件监听,监听只通知一次,如果需要的话需要通知后继续注册。
数据同步
zookeeper集群中,写入数据会先写到leader节点,然后同步到follower节点,同步成功一把一上就算成功了,会持久化,所以集群数量为奇数。这点与kafka不同。
更新操作会先写日志,Write Ahead Log(WAL机制),日志写完才会更新内存数据,然后通知client结果。同时也会定时保存快照,持久化到磁盘,加快恢复速度。快照恢复是快于重新执行日志的。
应用场景
监控,命名服务,配置中心,分布式锁,leader选举,屏障,负载均衡等。
1.最简单的例子,a程序监听某个节点,发送消息到消息队列,b取消息处理,处理结束修改节点信息,a得到通知在做相应的处理。
2.配置中心,client都监听某个节点的状态变化,配置修改时同时修改状态,可以同步更新配置
3.简单的锁
某一个临时节点,/lock/mylock/,程序争夺这个节点的创建权,创建成功的,获取锁,否则监听这个节点的删除事件,删除后在争夺一次。达到简单的分布式锁的目的。
4.高级一点的锁
上述情况,当竞争的程序过多的时候,会有羊群效应,监控同一个节点的程序太多,锁释放后,同时争夺资源,可能导致系统性能下降。
可以修改节点会临时有序节点,/lock/lock-000001之类的,争夺锁的时候,创建临时有序节点,最点序列最小的获得锁,一开始000001获得锁,此时创建的0000002的程序监控000001,000003监控000002,当000001释放时候,0000002获得锁,以此类推。leader选举也是类似的操作。
5.屏障
当一个事情,需要多个条件达到才能解锁。此时可以创建一个节点做为屏障,a处理完后,发现没有达到条件,监听等待,b处理完,也监听等待。。。。直到x处理完,发现达到条件了,删除屏障,程序继续往下执行。