Zookeeper:集群和zab协议
一.集群搭建
分别搭建zookeeper环境和jdk环境。
配置文件的dataDir需要需改,并且要创建该目录。
server.A=B:C:D
A:是一个数字,表示服务器的编号
B:服务器ip地址
C:zookeeper的通信端口
D:Leader选举的端口
在上一步的dataDir指定目录下,创建myid文件,文件中加入A数字。
echo "1">myid
如果zookeeper服务启动不了,可以在zookeeper的bin目录下看到报错的日志
cat zookeeper.out
针对报错找到解决办法。
查看zookeeper状态:
./zkServer.sh status
登陆集群:
./zkCli.sh -server 192.168.10.132:2181
二.一致性协议:zab协议
zab协议:zookeeper atomic broadcast(zookeeper原子广播),zookeeper是通过zab协议保证事务的一致性。
基于zab协议,zookeeper集群中的角色主要有一下三类:
角色 | 描述 | |
领导者(Leader) | 领导者负责进行投票的发起和决议,更新系统状态 | |
学习者 | 跟随者(Follower) | Follower用于接收客户请求并向客户端返回结果,在选主过程中参与投票 |
观察者(ObServer) | Observer可以接收客户端连接,将写请求转发给leader节点,单Observer不参与投票过程,之同步leader状态。 | |
客户端(Client) | 请求发起方 |
zab广播模式工作原理(写请求):
3.observer角色及其配置
observer角色特点:
1.不参与集群的leader选举
2.不参与集群中写数据时的ack反馈
如果想要使用observer角色,在配置文件中配置
peerType=observer
并且在所有的server的配置文件中,配置成observer模式的server的那行配置追加:observer,例如:
server.3=192.168.10.135:2281:2381:observer
4.JavaApi连接Zookeeper集群
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
在connectString中:以逗号分隔开各个集群的ip端口号
代码:
public class ZKWatcher implements Watcher{
static CountDownLatch latch = new CountDownLatch(1);
static ZooKeeper zooKeeper;
public static void main(String[] args) throws Exception{
Watcher watcher;
zooKeeper = new ZooKeeper("192.168.10.132:2181,192.168.10.133:2181,192.168.10.135:2181", 5000, new ZKWatcher());
latch.await();
}
public void process(WatchedEvent event) {
if(event.getType() == Event.EventType.None){
if(event.getState() == Event.KeeperState.SyncConnected){
System.out.println("连接成功");
latch.countDown();
}else if(event.getState() == Event.KeeperState.Disconnected){
System.out.println("断开连接");
}else if(event.getState() == Event.KeeperState.Expired){
System.out.println("会话超时");
}else if(event.getState() == Event.KeeperState.AuthFailed){
System.out.println("认证失败");
}
}
}
}