准备三台机器:
192.168.0.104
192.168.0.105
192.168.0.106
分别在zoo.cfg配置文件中添加以下内容:
192.168.0.104:2888:3888
192.168.0.105:2888:3888
192.168.0.106:2888:3888
在data目录中添加myid,分别为1,2,3
关闭防火墙 systemctl stop firewalld
启动zk
./zkServer.sh start
./zkServer.sh status
data目录配置参考https://www.jianshu.com/p/db52e6945f0d
zookeeper集群扩展
在zoo.cfg配置文件中增加:
server.4=192.168.0.107:2888:3888:observer
zkClient连接集群:
public class Test {
private static final String ADDRES = "192.168.0.104:2181,192.168.0.105:2181,192.168.0.106:2181";
private static final int TIMEOUT = 5000;
public static void main(String[] args) {
ZkClient zkClient = new ZkClient(ADDRES, TIMEOUT);
String path = "/cluster-test";
zkClient.createPersistent(path);
zkClient.close();
}
}
Zookeeper中分为三种角色:
1、Leader(领导) Zookeeper集群中的主节点、负责写的请求操作;
2、Follower(跟随者) 是领导(Leader)角色根随着,出读取操作还可以实现对Leader提议与选举
3、Observer 如果后期当我们在扩展ZK集群节点时如果角色为Follower越来越多会导致选举的时间越来越长,所以Observer角色和Follower角色很相似,只是obServer不能够参与Leader角色选举;
增加obServer的作用主要不影响原来本身选举的时间效率、目的是提高客户端读的请求效率
Zookeeper核心是原子广播协议(ZAB原子广播协议),这种机制保证了各个节点的数据同步的问题
ZAB协议有有两种模式 分别为恢复模式(选主)、广播模式(同步)。
恢复模式也就是当我们leader的节点宕机之后,会从新在剩余节点选出新的leader,新的leader选出之后采用广播模式实现各个节点与新的leader同步。
ZooKeeper 选举实现原理
1、状态变更 服务器启动的时候 每个Server的状态都是为“选举状态”,如果当前的leader的角色宕机之后非ObServer角色的节点都会从新进入到选举
2、发起投票的时候,每个Server端都会产生(myid,zxid)投票选举,系统默认初始化的时候zxid为0,如果在运行期间每个Server的zxid可能不会不同,这取决于最后一次做更新的操作;
3、接受自己投票实现投票pk
1、先检查zxid,谁最大谁就是为leader
2、如果zxid都是一样的情况下时候,myid谁最大谁就是为leader
3、如果有过半机制已经选举出了leader,之后启动的节点不会加入选举