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注册成服务
- 服务注册流程如下:
-
- 下载prunsrv
-
下载地址:http://archive.apache.org/dist/commons/daemon/binaries/windows/
下载版本:commons-daemon-1.2.4-bin-windows
-
- 解压prunsrv,并将prunsrv.exe,prunmgr.exe复制到server1,server2,server3的/bin目录下
-
- zookeeper配置系统环境变量名称为ZOOKEEPER_SERVICE1,ZOOKEEPER_SERVICE2,ZOOKEEPER_SERVICE3,对应值为server1,server2,server3
-
- zookeeper配置系统环境变量名称为ZOOKEEPER_HOME1,ZOOKEEPER_HOME2,ZOOKEEPER_HOM3,对应值为E:\Tools\zookeeper\server1,E:\Tools\zookeeper\server2,E:\Tools\zookeeper\server3
-
- 分别在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即可
-
-
- 创建完成后以,管理员身份运行依次运行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]
测试通过