Loading

Zookeeper:集群和zab协议

一.集群搭建

分别搭建zookeeper环境和jdk环境。

配置文件的dataDir需要需改,并且要创建该目录。

 

 server.A=B:C:D

A:是一个数字,表示服务器的编号

B:服务器ip地址

C:zookeeper的通信端口

D:Leader选举的端口

在上一步的dataDir指定目录下,创建myid文件,文件中加入A数字。

1
echo "1">myid

如果zookeeper服务启动不了,可以在zookeeper的bin目录下看到报错的日志

1
cat zookeeper.out

 针对报错找到解决办法。

查看zookeeper状态:

1
./zkServer.sh status

 

登陆集群:

1
./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角色,在配置文件中配置

1
peerType=observer

 并且在所有的server的配置文件中,配置成observer模式的server的那行配置追加:observer,例如:

1
server.3=192.168.10.135:2281:2381:observer

4.JavaApi连接Zookeeper集群

1
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)

在connectString中:以逗号分隔开各个集群的ip端口号

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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("认证失败");
            }
        }
 
    }
}

  

posted @   秋风飒飒吹  阅读(257)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示