• Zookeeper 全局设计+集群环境搭建


    zookeeper是什么?

    (分布式协调)通过分布式协调组件多节点顺序一致性,简单来说zookeeper=文件系统+监听通知机制

     

    Google Chubby(不开源产品)

      解决分布式一致性

     

     


    单机

    • 修改zoo.cfg

    • sh zkServer.sh start

    集群

     

    集群的角色:leader、follower、observer

    leader

    • 整个集群中的调度节点

    • 数据的同步

    follower

    • 高可用特性

    • 参与投票(leader选举的投票,数据达成一致的投票)

      • 过半提交(集群节点过多会影响整个集群性能的数据同步)

    • 处理客户端请求(提升集群性能)

    observer

    1. observer不参与投票。 只同步 leader的状态 ;

    2. observers 接受客户端的连接,并将写请求转发给 leader节点 ;

    3. 加入更多ObServer 节点,提高伸缩性,同时还不影响吞吐率。

    4. 2N+1台组成(过半提交决策)大于过半

    为什么在Zookeeper中Server 数目一般为奇数?

    我们知道在Zookeeper中 Leader 选举算法采用了Zab协议。Zab核心思想是当多数 Server 写成功,则任务数据写成功。

    安装部署/集群

    • 修改配置文件zoo.cfg,原配置文件,添加集群节点配置

    • $dataDir/myid 添加一个Myid文件

    ​
    /home/program/zookeeper-3.4.14/data
    ​
    如果需要增加observer节点
    同时在zoo.cfg中增加;peerType=observer
    Server.1=192.168.11.129:2888:3181    
    Server.2=192.168.11.135:2888:3181
    Server.3=192.168.11.136:2888:3181:observer

    # The number of milliseconds of each tick
    # 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。
      2 tickTime=2000   
      3 # The number of ticks that the initial 
      4 # synchronization phase can take    
      5 initLimit=10
      6 # The number of ticks that can pass between 
      7 # sending a request and getting an acknowledgement
    # 这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10秒
      8 syncLimit=5
      9 # the directory where the snapshot is stored.
     10 # do not use /tmp for storage, /tmp here is just 
     11 # example sakes.
    # 顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。
     12 dataDir=/home/program/zookeeper-3.4.14/data
     13 # the port at which the clients will connect
    # 这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。
     14 clientPort=2181
     15 # the maximum number of client connections.
     16 # increase this if you need to handle more clients
     17 #maxClientCnxns=60
     18 #
     19 # Be sure to read the maintenance section of the 
     20 # administrator guide before turning on autopurge.
     21 #
     22 # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
     23 #
     24 # The number of snapshots to retain in dataDir
     25 #autopurge.snapRetainCount=3
     26 # Purge task interval in hours
     27 # Set to "0" to disable auto purge feature
     28 #autopurge.purgeInterval=1
     29 server.1=192.168.1.102:2888:3181:observer
     30 server.2=192.168.1.115:2888:3181
     31 server.3=192.168.1.106:2888:3181

    配置说明

    • tickTime:这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

    • initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒

    • syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10秒

    • dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

    • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

    • server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

    远程访问

    sh zkCli.sh -server 192.168.1.102

     


    Zookeeper的数据模型


    节点特性

    临时节点(生命周期

    持久化节点,客户端与zookeeper断开连接后,该节点依旧存在 有序节点(递增序列号) 先有父节点,再有子节点 临时节点下不能存在子节点 同级节点下,节点名称必须是唯一

    有序节点使用场景

    • 有序节点:全局ID

    • 分布式锁

    • 分布式队列

    同级节点的唯一性

    • master选举

    • 分布式锁(锁用来解决安全性)

    zookeeper数据结构

    • 服务注册

    • 配置中心

    查询相关指令

    [zk: 192.168.1.102(CONNECTED) 18] ls /

    [zookeeper]

    查看节点状态

    [zk: 192.168.1.102(CONNECTED) 19] stat /zookeeper

     

    创建节点指令

    [zk: 192.168.1.102:2181(CONNECTED) 1] create /node1 123

    Created /node1

     

    如上:在根目录创建了node_1节点,携带数据 123

    · cZxid:创建节点时的事务id
    · pZxid:子节点列表最后一次被修改的事务id
    · cversion:节点版本号
    · dataCersion:数据版本号
    . aclVerson:acl权限版本号
    ----------------------------------------------------------------
    cZxid = 0x0        // 创建节点时的事务id
    ctime = Thu Jan 01 08:00:00 CST 1970
    mZxid = 0x0        // 修改的事务id
    mtime = Thu Jan 01 08:00:00 CST 1970
    pZxid = 0x200000002        // 子节点列表最后一次被修改的事务id
    cversion = 0            //节点版本号(乐观锁)
    dataVersion = 0            //数据版本号
    aclVersion = 0            //权限版本号
    ephemeralOwner = 0x0     // 临时节点所属会话
    dataLength = 0             // 数据的长度
    numChildren = 2             // 子节点梳理(当前节点)

    cversion=1->2 子节点的版本号

    dataVersion 表示当前节点

     

  • 相关阅读:
    在Arch上使用Fcitx5
    博客园图片居中
    冒泡排序算法
    检查字符串是否包含另一串字符串(c++)
    辗转相除法(求最大公约数或最小公倍数)
    二叉树等总结
    应用jfinal发送微信模板消息的一个bug
    线程中wait/notify/notifyAll的用法
    应用jfinal时要注意区分Db.query和Db.find
    从源码角度简单看StringBuilder和StringBuffer的异同
  • 原文地址:https://www.cnblogs.com/lwx57280/p/13760996.html
Copyright © 2020-2023  润新知