zoukankan      html  css  js  c++  java
  • 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("认证失败");
                }
            }
    
        }
    }
    

      

  • 相关阅读:
    在仅有的一次生命里活出自己最大的可能
    每个人都渴望赞美
    历练领导力的八字要诀
    爱情语录
    Ps
    别跟我要钱,我是教授
    改变人生的五个问题
    纪晓岚妙用口才
    智慧和智商
    经典
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/12956117.html
Copyright © 2011-2022 走看看