Zookeeper
Zookeeper怎么帮自己选主
帮自己选组是通过投票的,当票数过半的时候,这台服务器就会成为主;
如果是多台服务器一起启动的话,服务器id(myid)最大的就是主;
如果是一台一台服务器启动,当启动到第二台服务器的时候,第二台服务器就是主,不管后面启动多少台;
如果遇到了网络分区怎么办
如果选主的时候活锁了怎么办
使用有主(总统)模型解决
无主模型:
- 所有的服务器都是公平的,都可以发出提议
- 整个集群不能保证所有的服务器的记事本上的编号总是相同的,也就是事务的id
- 服务器如果宕机,重启后同步数据需要向多个节点进行同步
- 活锁问题
有主模型:
- 所有的事务必须有总统提出
- 集群同一时间只能有一个总统
- 总统节点的数据肯定是最全的
- 新的主产生后将自己的数据同步给其他服务器
有主模型
主怎么来的
帮自己选组是通过投票的,当票数过半的时候,这台服务器就会成为主;
如果是多台服务器一起启动的话,服务器id(myid)最大的就是主;
如果是一台一台服务器启动,当启动到第二台服务器的时候,第二台服务器就是主,不管后面启动多少台;
主宕机了怎么办
如果主宕机了,剩下的服务器会比较他们自己的事务id,看看是不是最新的事务id,然后选取满足条件的myid最大的服务器作为主。
如果是其他的follower服务器宕机了,就去找主同步数据
服务器太多了怎么办
集群初始化
- 加入投票机制–过半原则
- 无脑投票给myid最大的服务器–为了快速选主
- 加入主朝代标记–解决脑裂(多主)问题
多主问题:当主(朝代1)的服务器网络波动的时候,选出来了新的主(朝代2),当原来朝代1的主恢复网络之后,发现自己的朝代现在的主的朝代低,就会成为follewer ,同步数据。
额外总结:集群环境推荐使用奇数台服务器
Zookeeper存储模型
- zookeeper是一个树状结构,维护一个小型的数据节点znode
- 数据以keyvalue的方式存在,目录是数据的key
- 所有的数据访问都必须以绝对路径的方式呈现
分类:
- 持久化节点(PERSISTENT)
默认创建的就是持久化节点- 临时节点(Ephemral)
只要创建节点的会话有效,节点就不会失效
可以被所有的客户端所查看
事务编号和临时节点编号是一致的
create -e
一旦会话结束,临时节点也会被自动删除,一般这个功能用于判断节点和服务器是否保持连接- 序列化节点(Sequential)
在名字的后面添加一个序列号(有序)
create -s
ZooKeeper监听机制
语法格式: addWatch [-m mode] path # optional mode is one of [PERSISTENT,PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE 。
addWatch 的作用是针对指定节点添加事件监听,支持两种模式:
PERSISTENT :持久化订阅,针对当前节点的修改和删除事件,以及当前节点的子节点的新增和删除事件。
PERSISTENT_RECURSIVE :持久化递归订阅,在 PERSISTENT 的基础上,增加了子节点修改的事件触发,以及子节点的子节点的数据变化都会触发相关事件(满足递归订阅特性)。默认模式。
Zookeeper怎么帮别人选主
利用了zookeeper的分布式锁,谁跑得快 谁就是主
我们知道Zookeeper的临时节点可以用来实现分布式锁,多个客户端分别创建一个节点,创建成功即成功获取到了锁,创建失败的客户端们则会监听这个临时节点,获取锁的客户端释放锁(删除临时节点)或 与ZK服务端断开连接后(ZK会删除临时节点),其他客户端会收到Watch发来的通知,兄弟们,它释放锁了,你们过来抢占锁吧。这个临时节点只会有一个,当服务器断开,自动失效。