zookeeper集群

0,Zookeeper基本原理

  ZooKeeper集群由一组Server节点组成,这一组Server节点中存在一个角色为Leader的节点,其余节点都为Follower。当客户端Client链接到ZooKeeper集群,而且执行写请求时,这些请求会被发送到Leader节点上,而后Leader节点上数据变动会同步到集群中其余的Follower节点。html

  ZooKeeper采用一种称为Leader election的选举算法(也有称作:分布式选举算法-Paxos)的。在整个集群运行过程当中,只有一个Leader,其余的都是Follower,若是ZooKeeper集群在运行过程当中Leader出了问题,系统会采用该算法从新选出一个Leader,java

ZooKeeper用于三台以上的服务器集群之中,只要还有超过半数的服务器在线,ZooKeeper就可以正常提供服务,过半,意味着实际可以有效参与选举的节点数量是奇书个数,否者不能有效的过半linux

 

Zookeeper逻辑图以下,算法

  1. 客户端能够链接到每一个server,每一个server的数据彻底相同。
  2. 每一个follower都和leader有链接,接受leader的数据更新操做。
  3. Server记录事务日志和快照到持久存储。
  4. 大多数server可用,总体服务就可用。
  5. Leader节点在接收到数据变动请求后,首先将变动写入本地磁盘,以做恢复之用。当全部的写请求持久化到磁盘之后,才会将变动应用到内存中。
  6. ZooKeeper使用了一种自定义的原子消息协议,在消息层的这种原子特性,保证了整个协调系统中的节点数据或状态的一致性。Follower基于这种消息协议可以保证本地的ZooKeeper数据与Leader节点同步,而后基于本地的存储来独立地对外提供服务。
  7. 当一个Leader节点发生故障失效时,失败故障是快速响应的,消息层负责从新选择一个Leader,继续做为协调服务集群的中心,处理客户端写请求,并将ZooKeeper协调系统的数据变动同步(广播)到其余的Follower节点。

1,系统环境配置

 我这里使用的是在VMWare中安装centos7每一个虚拟机都选择桥接模式。便可在网络中独立分配一个IP,每台机器单独设定一个IP。apache

  •  配置hosts:vi /etc/hosts
    192.168.137.122 master
    192.168.137.123 slave1
    192.168.137.124 slave2
  • 关闭防火墙 (很重要,否则会出现No rout to host异常)
    systemctl status firewalld.service  #检查防火墙状态
    systemctl stop firewalld.service  #关闭防火墙
    systemctl disable firewalld.service  #禁止开机启动防火墙  
  • 关闭SELINUX:vi /etc/selinux/config
    #SELINUX=enforcing  #注释掉
    #SELINUXTYPE=targeted  #注释掉
    SELINUX=disabled  #增长
  •  4. 当即生效配置
    setenforce 0  #使配置当即生效

     

2,java安装环境变量配置

  略centos

3,配置无密钥的SSH访问

  在此处为了方便,我将全部网内的节点机器都互相能SSH无密钥登陆,能够理解为双向无密钥登陆。服务器

  • 使用下列命令在每一个虚拟机上都生成密钥
    ssh-keygen -t rsa  #生成密钥,一路回车便可,只适用于测试环境,正式环境请设定密码
    
  • 每一个节点机器的公钥传输到master机器上
    scp ~/.ssh/id_rsa.pub master:~/.ssh/slave1.id_rsa.pub #在slave1中,将公钥文件传输至master机器上,并修改文件名为slave1.id_rsa.pub
    scp ~/.ssh/id_rsa.pub master:~/.ssh/slave2.id_rsa.pub #在slave2中,将公钥文件传输至master机器上,并修改文件名为slave2.id_rsa.pub
    
  • 在master机器上生成统一的authorized_keys
    cd ~/.ssh
    cat id_rsa.pub >> authorized_keys #这个是master生成的公钥,就在本机
    cat slave1.id_rsa.pub >> authorized_keys 
    cat slave2.id_rsa.pub >> authorized_keys
    

    完成后可使用rm -f slave1.id_rsa.pub删除拷贝过来的秘钥文件网络

  •  将统一的authorized_keys分发至每一个节点
    scp authorized_keys root@master1:~/.ssh
    scp authorized_keys root@master2:~/.ssh

  authorized_keys是公钥的字典文件,这样下来全部的,全部节点的authorized_keys文件中记录的秘钥都相同了,由于能够实现每一个机器的ssh互通了。架构

4,Zookeeper集群安装

zookeeper安装很是简单,只要获取到 Zookeeper 的压缩包并解压到某个目录,修改一下配置便可。app

  • 下载zookeeper-3.4.8,使用下列命令解压到指定路径
    tar -zxvf  zookeeper-3.4.8.tar.gz 
    mv zookeeper-3.4.8 /home/zookeeper #这里能够指定你喜欢的任意目录
  • 修改环境变量:vi /etc/profile 加入下列内容
    # set zookeeperpath
    export ZOOKEEPER_HOME=/home/zookeeper
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    
  • 使用下面命令复制配置文件(也可直接创建)
    cp /home/zookeeper/conf/zoo_sample.cfg /home/zookeeper/conf/zoo.cfg
    
  • 使用 vi /home/zookeeper/conf/zoo.cfg 修改配置文件,具体内容以下:
    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just
    # example sakes.
    dataDir=/home/zookeeper/zkdata
    dataLogDir=/home/zookeeper/zklog
    # the port at which the clients will connect
    clientPort=2181
    # the maximum number of client connections.
    # increase this if you need to handle more clients
    #maxClientCnxns=60
    #
    # Be sure to read the maintenance section of the
    # administrator guide before turning on autopurge.
    #
    # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    #autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1
    server.1=master:2888:3888  
    server.2=slaver1:2888:3888  
    server.3=slaver2:2888:3888 
    

    tickTime: zookeeper中使用的基本时间单位, 毫秒值.
    dataDir: 数据目录. 能够是任意目录.
    dataLogDir: log目录, 一样能够是任意目录. 若是没有设置该参数, 将使用和dataDir相同的设置.
    clientPort: 监听client链接的端口号.
    nitLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户链接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中链接到 Leader 的 Follower 服务器)初始化链接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器尚未收到客户端的返回信息,那么代表这个客户端链接失败。总的时间长度就是 5*2000=10 秒
    syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒
    server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,须要一个端口来从新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通讯的端口。若是是伪集群的配置方式,因为 B 都是同样,因此不一样的 Zookeeper 实例通讯端口号不能同样,因此要给它们分配不一样的端口号。

  • 建立myid文件:在zoo.cfg指定的dataDir目录下创建以服务器节点对应的myid文件,如master节点中,建立myid文件内容为1,slave1中建立myid文件内容为2...
  • 使用下列命令将zoopeeper拷贝到其余节点
    scp /home/zookeeper root@master1: /home/
    scp /home/zookeeper root@master2: /home/
    

    完成后,只需在其余节点上修改vi /etc/profile,以及对应的myid,便可

4,启动Zookeeper集群

  • 在全部节点执行下列命令启动
    cd /home/zookeeper
    bin/zkServer.sh start  
    

    正常会显示以下状态

  • 使用jps命令查看系统进程
  • 使用下列命令检查运行状态
    bin/zkServer.sh -status
    

    如显示一下状态表示启动失败

    具体失败缘由可阅读zookeeper/zookeeper.out文件查阅 如显示一下状态表示启动成功

    查看其他节点,整个包括集群中各个结点的角色会有一个leader,其余都是follower。
    咱们经过more zookeeper.out检查启动输入日志,会发现有下列异常

    我启动的顺序是master>slave1>slave2,因为ZooKeeper集群启动的时候,每一个结点都试图去链接集群中的其它结点,先启动的确定连不上后面还没启动的,因此上面日志前面部分的异常是能够忽略的。经过后面部分能够看到,集群在选出一个Leader后,最后稳定了。 其余结点可能也出现相似问题,属于正常。
  • 客户端链接测试: 对于客户端来讲,ZooKeeper是一个总体(ensemble),不管链接到那个节点,实际上都在独享整个ZooKeeper集群的服务,因此,咱们能够在任何一个结点上创建到服务集群的链接

5,参考

相关文章
相关标签/搜索