Learning Zookeeper systematically

2. zookeeper安装

Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。

  • 单机模式:Zookeeper只运行在一台服务器,适合测试环境
  • 集群模式:Zookeeper运行在一个集群,适合生产模式,这个集群称作一个集合体
  • 伪集群模式:在一台服务器上运行多个Zookeeper实例

2.1 镜像地址

镜像库地址:http://archive.apache.org/dist/zookeeper/

image-20210606201031288

  • 我们可以看到,zk的版本是比较多的,我们在使用的时候,应该尽量避免最新的版本
    1. 因为新版本中或许会存在某些bug
    2. 新版本中的错误,你可能百度也搜不到
  • 所以我们使用上一个版本,即3.6.3

image-20210606201155192

  • apache-zookeeper-3.6.0.tar.gz需要安装maven,然后再运行mvn clean install 和mvn javadoc:aggregate,前一个命令会下载安装好多jar包,不知道要花多长时间
  • apache-zookeeper-3.6.0-bin.tar.gz已经自带所需要的各种jar包

2.2 安装前的准备

  1. 安装jdk

  2. 拷贝apache-zookeeper-3.6.0-bin.tar.gz到opt目录

  3. 解压安装包

[root@localhost opt]# tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
  1. 重命名

    [root@localhost opt]# mv apache-zookeeper-3.6.0-bin zookeeper
    

2.3 单机模式搭建

2.3.1 配置修改

  1. 在/opt/zookeeper/这个目录上创建zkData和zkLog目录

    [root@localhost zookeeper]# mkdir zkData 
    [root@localhost zookeeper]# mkdir zkLog
    
  2. 进入/opt/zookeeper/conf这个路径,复制一份 zoo_sample.cfg 文件并命名为 zoo.cfg

    [root@localhost conf]# cp zoo_sample.cfg zoo.cf
    
  3. 编辑zoo.cfg文件,修改dataDir路径:

dataDir=/opt/zookeeper/zkData 
dataLogDir=/opt/zookeeper/zkLog

2.3.2 操作zk

  1. 启动Zookeeper

    [root@localhost bin]# ./zkServer.sh start
    
  2. 查看进程是否启动

    [root@localhost bin]# jps
    

    QuorumPeerMain:是zookeeper集群的启动入口类,是用来加载配置启动QuorumPeer线程的

  3. 查看状态:

    [root@localhost bin]# ./zkServer.sh status
    
  4. 启动客户端

    [root@localhost bin]# ./zkCli.sh
    
  5. 退出客户端

    [zk: localhost:2181(CONNECTED) 0] quit
    

2.4 集群模式搭建

Zookeeper不但可以在单机上运行单机模式,而且可以在单机模拟集群模式。以下为单机情况下模拟集群模式的搭建。我们将不同的实例运行在一台机器,用端口区分。

我们在一台机器上部署了3个server,也就是说单台机器上运行多个Zookeeper实例,这种情况下我们要保证每个不同的zookeeper实例的端口号是不能冲突的,除了clientPort不同之外,dataDir也不同。另外,还要再dataDir所对应的目录中创建myid文件再指定对应的zookeeper服务器实例

  • clientPort端口

    如果在1台机器上部署多个zookeeper实例,那么每个实例需要不同的clientPort

  • dataDir和dataLogDir

    如果在1台机器上部署多个zookeeper实例,dataDir和dataLogDir也需要区分

  • server.X和myid

    server.X这个数字就是对应data/myid中的数字。在3个server的myid文件中分别写入了1,2,3,那么每个server中的zoo.cfg都配置sever.1,server.2,server.3。在同一台机器上部署的情况下,后面连着的2个端接口都不能是一样的,否则会端口冲突

2.4.0 虚拟机搭建集群

  1. 在虚拟机数据目录vms下,创建zk02
  2. 将本台服务器数据目录下的.vmx文件和所有的.vmdk文件分别拷贝zk02下
  3. 虚拟机->文件->打开 (选择zk02下的.vmx文件)
  4. 开启此虚拟机,弹出对话框,选择“我已复制该虚拟机”
  5. 进入系统后,修改linux中的ip,修改/opt/zookeeper/zkData/myid中的数值为2
  6. 第三台服务器zk03,重复上面的步骤

2.4.1 复制多分模拟多个实例并改名

cp -r zookeeper01/ zookeeper02
cp -r zookeeper01/ zookeeper03

2.4.2 分别在这三个实例文件夹中创建data及logs目录

cd /usr/local/zkcluster/zookeeper01
mkdir data
cd data
mkdir logs

cd /usr/local/zkcluster/zookeeper02
mkdir data
cd data
mkdir logs

cd /usr/local/zkcluster/zookeeper03
mkdir data
cd data
mkdir logs

2.4.3 修改配置文件名称(三个实例需要都修改)

cd /usr/local/zkcluster/zookeeper01/conf
mv zoo_sample.cfg zoo.cfg

2.4.4 配置每一个Zookeeper的dataDir

clientPort=2181
dataDir=/usr/local/zkcluster/zookeeper01/data
dataLogDir=/usr/local/zkcluster/zookeeper01/data/logs

clientPort=2182
dataDir=/usr/local/zkcluster/zookeeper02/data
dataLogDir=/usr/local/zkcluster/zookeeper02/data/logs

clientPort=2183
dataDir=/usr/local/zkcluster/zookeeper03/data
dataLogDir=/usr/local/zkcluster/zookeeper03/data/logs

2.4.5 配置集群

  • 在每个Zookeeper的data目录下创建一个myid文件,内容分别是1,2,3。这个文件就是记录每个服务器的ID

    touch myid
    
  • 在每个zookeeper的zoo.cfg配置客户端访问端口和集群服务器IP列表

    server.1=服务器IP:2881:3881
    server.2=服务器IP:2882:3882
    server.3=服务器IP:2883:3883
    #server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间头皮选举端口
    
  • 配置参数解读 server.A=B:C:D

    • A:一个数字,表示第几号服务器集群模式下配置的/opt/zookeeper/zkData/myid文件里面的数据就是A的值
    • B:服务器的ip地址
    • C:与集群中Leader服务器交换信息的端口
    • D:选举时专用端口,万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

2.4.6 启动集群

  1. 每台服务器的防火墙必须关闭

    [root@localhost bin]# systemctl stop firewalld.service
    
  2. 启动第1台

    [root@localhost bin]# ./zkServer.sh start
    
  3. 查看状态

    [root@localhost bin]# ./zkServer.sh status
    
    ZooKeeper JMX enabled by default 
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg 
    Client port found: 2181. Client address: localhost. 
    Error contacting service. It is probably not running
    

    注意:因为没有超过半数以上的服务器,所以集群失败 (防火墙没有关闭也会导致失败)

  4. 当启动第2台服务器时

    • 查看第1台的状态:Mode: follower
    • 查看第2台的状态:Mode: leader

2.5 伪集群模式搭建

Zookeeper不但可以在单机上运行单机模式Zookeeper,而且可以在单机模拟集群模式 Zookeeper的运行,也就是将不同节点运行在同一台机器。我们知道伪分布模式下Hadoop的操作和分布式模式下有着很大的不同,但是在集群为分布 式模式下对Zookeeper的操作却和集群模式下没有本质的区别。显然,集群伪分布式模式为我们体验Zookeeper和做一些尝试性的实验提供了很大 的便利。比如,我们在实验的时候,可以先使用少量数据在集群伪分布模式下进行测试。当测试可行的时候,再将数据移植到集群模式进行真实的数据实验。这样不 但保证了它的可行性,同时大大提高了实验的效率。这种搭建方式,比较简便,成本比较低,适合测试和学习,如果你的手头机器不足,就可以在一台机器上部署了 3个server。

2.5.1 注意事项

在一台机器上部署了3个server,需要注意的是在集群为分布式模式下我们使用的每个配置文档模拟一台机器,也就是说单台机器及上运行多个Zookeeper实例。但是,必须保证每个配置文档的各个端口号不能冲突,除了clientPort不同之外,dataDir也不同。另外,还要在dataDir所对应的目录中创建myid文件来指定对应的Zookeeper服务器实例。

  • clientPort端口:如果在1台机器上部署多个server,那么每台机器都要不同的 clientPort,比如 server1是2181,server2是2182,server3是2183

  • dataDir和dataLogDir:dataDir和dataLogDir也需要区分下,将数据文件和日志文件分开存放,同时每个server的这两变量所对应的路径都是不同的

  • server.X和myid: server.X 这个数字就是对应,data/myid中的数字。在3个server的myid文件中分别写入了0,1,2,那么每个server中的zoo.cfg都配 server.0 server.2,server.3就行了。因为在同一台机器上,后面连着的2个端口,3个server都不要一样,否则端口冲突

2.5.2 复制并改名

cp -r zookeeper01/ zookeeper02
cp -r zookeeper01/ zookeeper03

2.5.3 分别在这三个实例文件夹中创建data及logs目录

cd /usr/local/zkcluster/zookeeper01
mkdir data
cd data
mkdir logs

cd /usr/local/zkcluster/zookeeper02
mkdir data
cd data
mkdir logs

cd /usr/local/zkcluster/zookeeper03
mkdir data
cd data
mkdir logs

2.5.4 修改配置文件名称(三个实例需要都修改)

cd /usr/local/zkcluster/zookeeper01/conf
mv zoo_sample.cfg zoo.cfg

2.5.5 配置每一个Zookeeper的dataDir

clientPort=2181
dataDir=/usr/local/zkcluster/zookeeper01/data
dataLogDir=/usr/local/zkcluster/zookeeper01/data/logs

clientPort=2182
dataDir=/usr/local/zkcluster/zookeeper02/data
dataLogDir=/usr/local/zkcluster/zookeeper02/data/logs

clientPort=2183
dataDir=/usr/local/zkcluster/zookeeper03/data
dataLogDir=/usr/local/zkcluster/zookeeper03/data/logs

2.5.6 配置集群

  • 在每个Zookeeper的data目录下创建一个myid文件,内容分别是1,2,3。这个文件就是记录每个服务器的ID

    touch myid
    
  • 在每个zookeeper的zoo.cfg配置客户端访问端口和集群服务器IP列表

    server.1=服务器IP:2881:3881
    server.2=服务器IP:2882:3882
    server.3=服务器IP:2883:3883
    #server.服务器ID=服务器IP地址:服务器之间通信端口:服务器之间头皮选举端口
    
  • 配置参数解读 server.A=B:C:D

    • A:一个数字,表示第几号服务器集群模式下配置的/opt/zookeeper/zkData/myid文件里面的数据就是A的值
    • B:服务器的ip地址
    • C:与集群中Leader服务器交换信息的端口
    • D:选举时专用端口,万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

2.5.7 启动集群

  1. 每台服务器的防火墙必须关闭

    [root@localhost bin]# systemctl stop firewalld.service
    
  2. 启动第1台

    [root@localhost bin]# ./zkServer.sh start
    
  3. 查看状态

    [root@localhost bin]# ./zkServer.sh status
    
    ZooKeeper JMX enabled by default 
    Using config: /opt/zookeeper/bin/../conf/zoo.cfg 
    Client port found: 2181. Client address: localhost. 
    Error contacting service. It is probably not running
    

    注意:因为没有超过半数以上的服务器,所以集群失败 (防火墙没有关闭也会导致失败)

  4. 当启动第2台服务器时

    • 查看第1台的状态:Mode: follower
    • 查看第2台的状态:Mode: leader

2.6配置参数解读

Zookeeper中的配置文件zoo.cfg中参数含义解读如下:

  • tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
    • Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
  • initLimit =10:LF初始通信时限
    • 集群中的Follower跟随者服务器与Leader领导者服务器之间,启动时能容忍的最多心跳数
    • 10*2000(10个心跳时间)如果领导和跟随者没有发出心跳通信,就视为失效的连接,领导和跟随者彻底断开
  • syncLimit =5:LF同步通信时限
    • 集群启动后,Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit *tickTime->10秒,Leader就认为Follwer已经死掉,会将Follwer从服务器列表中删除
  • dataDir:数据文件目录+数据持久化路径
    • 主要用于保存Zookeeper中的数据。
  • dataLogDir:日志文件目录
  • clientPort =2181:客户端连接端口
    • 监听客户端连接的端口。
原文地址:https://www.cnblogs.com/pengcode/p/14856326.html