美文网首页
ZooKeeper初探

ZooKeeper初探

作者: yuanzicheng | 来源:发表于2017-06-21 00:55 被阅读67次

    1. ZooKeeper是什么

    ZooKeeper是一个开源的高性能(3主机的ZooKeeper集群可以达到12万左右的QPS)的分布式协调服务,它是一个分布式数据一致性解决方案。

    ZooKeeper能解决的分布式数据一致性问题包括:

    • 顺序一致性
      从一个客户端发起事务请求,最终会严重按照其发起的顺序应用到ZooKeeper中。
    • 原子性
      所有事务的执行结果在ZooKeeper集群的所有主机上是一致的。
    • 单一视图
      无论客户端连接到哪个ZooKeeper服务器,它看到的数据都是一致的。
    • 可靠性
      服务端完成了一个事务并完成了对客户的响应,这个事务引起的服务端状态的变更会一致保留下来,除非另外的事务对此状态进行了变更。
    • 实时性
      ZooKeeper保证在一定时间内,客户端最终一定能从服务端读取到最新的数据状态。

    2. 为什么要使用Zookeeper

    Zookeeper可以解决很多分布式系统遇到的问题,如分布式锁、分布式协调、分布式消息队列等。

    3. Zookeeper应用场景

    3.1 数据发布/订阅

    3.2 负载均衡

    3.3 命名服务
    如:生成数据库表主键

    3.4 分布式协调/通知
    如:心跳检测

    4. ZooKeeper中的基本概念

    4.1 集群角色

    Leader:ZooKeeper集群工作中的核心
    Follower:ZooKeeper集群状态的跟随者
    Observer:充当一个观察者角色

    4.2 会话

    会话(Session)是指客户的和ZooKeeper服务器的连接,客户与服务器之间通过建立一个TCP长连接来维持Session,通过这个连接,客户端能够通过心跳检测与服务器保持有效会话,也能向服务器发送请求并获得响应。

    4.3 数据节点

    ZooKeeper中的节点有两类:
    集群中的一台主机称为一个节点;
    数据模型中的数据单元称为Znode,Znode又分为持久节点和临时节点。

    4.4 版本
    ZooKeeper中的版本类型如下:
    version:当前数据节点数据内容的版本号;
    cversion:当前数据节点子节点的版本号;
    aversion:当前数据节点ACL变更版本号。

    4.5 watcher
    即事件监听,ZooKeeper允许用户在指定节点上注册一些Watcher,当数据节点发生变化时,ZooKeeper服务器会把这个变化通知给感兴趣的客户端。

    4.6 ACL权限控制
    即Access Control Lists的简写,ZooKeeper采用ACL策略来进行权限控制:
    CREATE:创建子节点
    READ:获取节点数据及子节点列表
    WRITE:更新节点数据
    DELETE:删除子节点
    ADMIN:设置节点的ACL

    5. Zookeeper安装启动

    系统环境:CentOS 7.3

    5.1 单机

    1.准备Java运行环境(zookeeper依赖于Java环境)
    2.下载zookeeper到/opt目录

    wget -P /opt http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
    

    3.进入/opt目录,解压下载的zookeeper包

    tar -zxvf zookeeper-3.4.10.tar.gz
    

    4.进入zookeeper的conf目录,复制配置文件

    cp zoo_sample.cfg zoo.cfg
    

    5.启动zookeeper

    [root@localhost bin]# ./zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    

    6.检查默认端口2181是否处于监听状态

    [root@localhost bin]# netstat -tnl | grep 2181
    tcp6       0      0 :::2181                 :::*                    LISTEN  
    

    7.使用telnet查看zookeeper状态信息

    [root@zookeeper1 bin]# telnet localhost 2181
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    stat
    Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
    Clients:
     /0:0:0:0:0:0:0:1:59402[0](queued=0,recved=1,sent=0)
    
    Latency min/avg/max: 0/0/0
    Received: 1
    Sent: 0
    Connections: 1
    Outstanding: 0
    Zxid: 0x0
    Mode: standalone
    Node count: 4
    Connection closed by foreign host.
    

    8.停止zookeeper

    [root@localhost bin]# ./zkServer.sh stop
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Stopping zookeeper ... STOPPED
    
    5.2 集群

    系统环境:CentOS 7.3
    主机:192.168.101.130、192.168.101.131、192.168.101.132
    禁用firewalld
    禁用selinux

    1.准备Java运行环境(zookeeper依赖于Java环境)
    2.下载zookeeper到/opt目录

    wget -P /opt http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
    

    3.进入/opt目录,解压下载的zookeeper包

    tar -zxvf zookeeper-3.4.10.tar.gz
    

    4.进入zookeeper的conf目录,复制配置文件

    cp zoo_sample.cfg zoo.cfg
    

    5.在所有主机上编辑配置文件zoo.cfg

    cat << EOF > zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/var/zookeeper
    clientPort=2181
    server.1=192.168.1.111:2222:3333
    server.2=192.168.1.112:2222:3333
    server.3=192.168.1.113:2222:3333
    EOF
    

    6.创建配置文件中的dataDir指定的目录

    mkdir -p /var/zookeeper
    

    7.分别在3台主机的/var/zookeeper目录中创建myid文件,写入server id

    # 192.168.1.111
    echo "1" > /var/zookeeper/myid
    # 192.168.1.112
    echo "2" > /var/zookeeper/myid
    # 192.168.1.113
    echo "3" > /var/zookeeper/myid
    

    8.在3台主机上启动zookeeper

    [root@localhost bin]# ./zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    

    9.查看zookeeper状态,leader、follower与上面提到的zookeeper角色对应

    # 192.168.1.111
    [root@localhost bin]# ./zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    # 192.168.1.112
    [root@localhost bin]# ./zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: leader
    # 192.168.1.113
    [root@localhost bin]# ./zkServer.sh status
    ZooKeeper JMX enabled by default
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg
    Mode: follower
    

    10.使用telnet进一步查看zookeeper集群的状态

    [root@zookeeper1 bin]# telnet localhost 2181
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    stat
    Zookeeper version: 3.4.10-39d3a4f269333c922ed3db283be479f9deacaa0f, built on 03/23/2017 10:13 GMT
    Clients:
     /0:0:0:0:0:0:0:1:59400[0](queued=0,recved=1,sent=0)
    
    Latency min/avg/max: 0/0/0
    Received: 2
    Sent: 1
    Connections: 1
    Outstanding: 0
    Zxid: 0x0
    Mode: follower
    Node count: 4
    Connection closed by foreign host.
    
    5.3 伪集群

    伪集群与集群是类似的,只不过是在同一主机上运行多个zookeeper实例,配置和操作几乎一致,只需要将端口号设置为不一致即可。

    相关文章

      网友评论

          本文标题:ZooKeeper初探

          本文链接:https://www.haomeiwen.com/subject/zhquqxtx.html