zoukankan      html  css  js  c++  java
  • zookeeper集群

    0,Zookeeper基本原理

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

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

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

    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。

    •  配置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安装环境变量配置

      略

    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 的压缩包并解压到某个目录,修改一下配置即可。

    • 下载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,参考

  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/ejiyuan/p/5587700.html
Copyright © 2011-2022 走看看