Zookeeper集群部署

Zookeeper集群部署

zookeeper集群管理

Zookeeper 是分布式应用协调服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:配置维护、域名服务、分布式同步、组服务等。

Zookeeper 的核心是广播,这个机制保证了各个Server之间的同步。实现这个机制的协议叫做Zab协议。

Zab协议有两种模式,它们分别是恢复模式(选主)和广播 模式(同步)。

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后, 恢复模式就结束了。
状态同步保证了leader和Server具有相同的系统状态。

  • 每个Server在工作过程中有三种状态:

  • LOOKING:当前Server不知道leader是谁,正在搜寻。

  • LEADING:当前Server即为选举出来的leader。

  • FOLLOWING:leader已经选举出来,当前Server与之同步。

1. 基于docker zookeeper集群部署

1.1 环境准备

1.1.1 部署docker容器

1.检查docker是否安装:docker -v
2.如果没安装,请安装docker容器

1.2.2 安装docker-compose编排工具

1.检查docker-compose是否安装:docker-compose -v
2.如果没安装,请安装docker-compose工具

1.2 环境准备

1.2.1. 通过docker-compose部署,创建docker.compose.yml文件

version: '3'
services:
  zookeeper-1:
    image: zookeeper:3.7
    restart: always
    hostname: zookeeper-1
    container_name: zookeeper-1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zookeeper-1:2888:3888;2181 server.2=zookeeper-2:2888:3888;2181 server.3=zookeeper-3:2888:3888;2181
  zookeeper-2:
    image: zookeeper:3.7
    restart: always
    hostname: zookeeper-2
    container_name: zookeeper-2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zookeeper-1:2888:3888;2181 server.2=zookeeper-2:2888:3888;2181 server.3=zookeeper-3:2888:3888;2181
  zookeeper-3:
    image: zookeeper:3.7
    restart: always
    hostname: zookeeper-3
    container_name: zookeeper-3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zookeeper-1:2888:3888;2181 server.2=zookeeper-2:2888:3888;2181 server.3=zookeeper-3:2888:3888;2181

1.2.2. zookeeper参数配置

  • 常用端口:
    • 2181:Zookeeper 业务客户端访问端口
    • 2888:Follower port (跟随者通讯端口)
    • 3888:Election port (选举通讯端口)
    • 8080:AdminServer port (管理界面端口)
  • 常用环境变量:
    • ALLOW_ANONYMOUS_LOGIN:默认值:no。设置是否允许匿名连接。如果没有设置ZOO_ENABLE_AUTH,则必须设置当前环境变量为 yes
    • ZOO_LISTEN_ALLIPS_ENABLED:默认值:no。设置是否默认监听所有 IP
    • ZOO_TICK_TIME:默认值:2000。设置tickTime。定义一个 Tick 的时间长度,以微秒为单位。该值为 ZooKeeper 使用的基础单位,用于心跳、超时等控制;如一般 Session 的最小超时时间为2个 Ticks
    • ZOO_INIT_LIMIT:默认值:10。设置 initLimit。以 ticks 为单位的时间长度。用于控制从服务器与 Leader 连接及同步的时间。如果数据量比较大,可以适当增大该值
    • ZOO_SYNC_LIMIT:默认值:5。设置syncLimit。以 ticks 为单位的时间长度。用于控制从服务器同步数据的时间。如果从服务器与 Leader 差距过大,将会被剔除
    • ZOO_MAX_CLIENT_CNXNS:默认值:60。设置maxClientCnxns。每个客户端允许的同时连接数(Socket层)。以 IP 地址来识别客户端
  • 集群配置参数
    • ZOO_SERVER_ID:1~255之间的唯一值,用于标识服务器ID。默认路径在/srv/data/zookeeper/myid下
    • ZOO_SERVERS: 定义集群模式时的服务器列表,每个服务器使用类似server.id=host:port:port的格式进行定义
  ZOO_SERVERS常用格式定义server.X=A:B:C
  server.: 关键字,不可以更改
  X: 数字,当前服务器的ID,在同一个集群中应当唯一
  A: IP地址或主机名(网络中可识别)
  B: 当前服务器与集群中 Leader 交换消息所使用的端口
  C: 选举 Leader 时所使用的端口

1.3 部署完成测试

1.3.1 测试Model leader


[root@localhost ~]# docker exec -it zookeeper-1 bash 
root@zoo3:/apache-zookeeper-3.7.0-bin# zkServer.sh status 
ZooKeeper JMX enabled by default 
Using config:/conf/zoo.cfg
Client port found: 2181. Client address: localhost. client SSL: false. Mode:leader

1.3.2 测试Model follower1


root@zoo3:/apache-zookeeper-3.7.0-bin# zkServer.sh status
ZocKeeper JMX enabled by default 
Using config :/ conf /z00.cfg
Client port found :2182.C1ient address : localhost , aient SSL : false . 
Mode : follower


1.3.3 测试Model follower2


root@zoo3:/apache-zookeeper-3.7.0-bin# zkServer.sh status
ZocKeeper JMX enabled by default 
Using config :/ conf /z00.cfg
Client port found :2183.C1ient address : localhost , aient SSL : false . 
Mode : follower


2 基于windows zookeeper集群部署

2.1 环境准备

  • 下载安装包

http://mirrors.cnnic.cn/apache/zookeeper/

  • 解压安装包

进入到安装包conf文件中,将文件zoo_sample.cfg改名为zoo.cfg

  • 安装JDK
1.检查jdk是否安装:java -version
2.如果没安装,请安装JDK1.8及以上版本
3.配置系统变量JAVA_HOME参数,参数值为JDK安装路径

2.2 集群配置

zookeeper集群,准备三个server,分别名为server1、server2、server3,每个目录下存放一份zookeeper程序。

  • 配置文件流程如下:
    • 修改解压安装包后,更改文件名为server1
    • 同时复制两份server1,名命为server2,server3
    • 创建三个server数据存储路径c:/tmp/zookeeper1、c:/tmp/zookeeper2、c:/tmp/zookeeper3
    • 同在在数据文件路径下依次创建myid文件,内容对应为1,2,3
    • 新增server1、server2、server3下conf/zoo.cfg配置文件
server1的zoo.cfg文件内容:

server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
clientPort:2181
dataDir=c:/tmp/zookeeper1

server2的zoo.cfg文件内容:
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
clientPort:2182
dataDir=c:/tmp/zookeeper2

server3的zoo.cfg文件内容:
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
clientPort:2183
dataDir=c:/tmp/zookeeper3

2.2 服务安装

zookeeper基于Window部署需要将server1,server2,server3注册成服务

  • 服务注册流程如下:
      1. 下载prunsrv
下载地址:http://archive.apache.org/dist/commons/daemon/binaries/windows/
下载版本:commons-daemon-1.2.4-bin-windows
    1. 解压prunsrv,并将prunsrv.exe,prunmgr.exe复制到server1,server2,server3的/bin目录下
    1. zookeeper配置系统环境变量名称为ZOOKEEPER_SERVICE1,ZOOKEEPER_SERVICE2,ZOOKEEPER_SERVICE3,对应值为server1,server2,server3
    1. zookeeper配置系统环境变量名称为ZOOKEEPER_HOME1,ZOOKEEPER_HOME2,ZOOKEEPER_HOM3,对应值为E:\Tools\zookeeper\server1,E:\Tools\zookeeper\server2,E:\Tools\zookeeper\server3
    1. 分别在server1,server2,server3的/bin目录下,创建zkServerStop.cmd和install.bat文件,编写文件内容:

server1的zkServerStop.cmd:

 @echo off
  setlocal
  TASKLIST /svc | findstr /c:"%ZOOKEEPER_SERVICE1%" > %ZOOKEEPER_HOME1%\zookeeper_svc.pid
  FOR /F "tokens=2 delims= " %%G IN (%ZOOKEEPER_HOME%\zookeeper_svc.pid) DO (
     @set zkPID=%%G
  )
  taskkill /PID %zkPID% /T /F
  del %ZOOKEEPER_HOME1%/zookeeper_svc.pid
  endlocal

server1的install.bat:

prunsrv.exe "//IS//%ZOOKEEPER_SERVICE1%" ^
        --DisplayName="Zookeeper (%ZOOKEEPER_SERVICE1%)" ^
        --Description="Zookeeper (%ZOOKEEPER_SERVICE1%)" ^
        --Startup=auto --StartMode=exe ^
        --StartPath=%ZOOKEEPER_HOME1% ^
        --StartImage=%ZOOKEEPER_HOME1%\bin\zkServer.cmd ^
        --StopPath=%ZOOKEEPER_HOME1%\ ^
        --StopImage=%ZOOKEEPER_HOME1%\bin\zkServerStop.cmd ^
        --StopMode=exe --StopTimeout=5 ^
        --LogPath=%ZOOKEEPER_HOME1% --LogPrefix=zookeeper-wrapper ^
        --PidFile=zookeeper.pid --LogLevel=Info --StdOutput=auto --StdError=auto

server2,server3同server1一样,只需要替换server1中ZOOKEEPER_SERVICE1,ZOOKEEPER_HOME1即可

      1. 创建完成后以,管理员身份运行依次运行server1,server2,server3的install.bat

2.3 集群连接测试

  • CMD到server1/bin目录,输入命令zkCli.cmd -server localhost:2181

[zk:1ocalhost:2181(CONNECTED) 13] 1s 
Lzookeeper]
[zk:1oca1host:2181(CONNECTED)14] create /node1 node1 Created/node1
[zk:1ocalhost:2181(CONNECTED)15] create /node2 node2 Created /node2
[zk:1ocalhost:2181(CONNECTED)16]1s/[node1,node2,zookeeper]
[zk:1ocalhost:2181(CONNECTED)17]

  • CMD到server2/bin目录,输入命令zkCli.cmd -server localhost:2182
  查询zk节点命令: ls /
  
  结果:[node1,node2,zooleeper]
  
  测试通过  
  • CMD到server3/bin目录,输入命令zkCli.cmd -server localhost:2183
  
  查询zk节点命令: ls /
  
  结果:[node1,node2,zooleeper]
  
  测试通过  
  
2022-08-11
0