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,参考

  • 相关阅读:
    Android -- 在一个Activity开启另一个Activity 并 获取他的返回值。
    Android -- Activity的生命周期,Activity四种启动模式 Standard, SingleTop,SingleTask,SingleInstance
    Python3 如何优雅地使用正则表达式(详解七)
    Python3 如何优雅地使用正则表达式(详解六)
    Python3 如何优雅地使用正则表达式(详解五)
    Python3 如何优雅地使用正则表达式(详解四)
    Python3 如何优雅地使用正则表达式(详解三)
    Python3 如何优雅地使用正则表达式(详解一)
    Windows编程中的若干难点
    魔法方法:算术运算
  • 原文地址:https://www.cnblogs.com/ejiyuan/p/5587700.html
Copyright © 2011-2022 走看看