Zookeeper集群搭建入门
Zookeeper架构
学习Zookeeper前,得先俯览全局,了解Zookeeper集群的部署模式,看Zookeeper架构设计
Server可以理解为集群中的节点,在Zookeeper集群中,有一个Server是Leader
集群节点角色分配
- leader(领导者):负责进行投票的发起和决议,更新系统状态
- learner(学习者)
- follower(跟随者)接收client请求,参与选主投票
- observer(观察者)接收client请求,不参与选主投票,具有扩展性
- 通过配置observerMasterPort=2191创建一个监听端口2191的ObserverMaster线程
- client(客户端)
本文介绍在单机Centos7上搭建2个Server组成的集群(单机集群),没多余的服务器了…55555~
Zookeeper下载
官方下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/
腾讯镜像仓库:https://mirrors.cloud.tencent.com/apache/zookeeper/
apache镜像仓库:http://archive.apache.org/dist/zookeeper/
我选择的是腾讯镜像的zookeeper-3.6.2版本
这里有两个gz,只需要下其中的一个就行了,我选择的是:apache-zookeeper-3.6.2-bin.tar.gz
下载完成后解压
tar xzf apache-zookeeper-3.6.2-bin.tar.gz
Zookeeper启动
一台服务器部署两个节点,将下载好的zookeeper文件夹copy两份
cp -r apache-zookeeper-3.6.2-bin/ apache-zookeeper-3.6.2-bin-server1/
cp -r apache-zookeeper-3.6.2-bin/ apache-zookeeper-3.6.2-bin-server2/
注意事项
文件解压后,因为zookeeper启动默认读取的配置文件是zoo.cfg,但解压后,conf内配置文件是zoo_sample.cfg
直接启动会报错,有3种解决方式:
进入 apache-zookeeper-3.6.2-bin-server1
- 修改启动脚本,把默认读取的配置文件改为zoo_sample.cfg(不推荐)
vim apache-zookeeper-3.6.2-bin-server1/bin/zkEnv.sh
找到 ZOOCFG=“zoo.cfg” 修改为ZOOCFG=“zoo_sample.cfg”
- 重命名zoo_sample.cfg文件名为zoo.cfg
mv conf/zoo_sample.cfg conf/zoo.cfg
- 复制文件并重新命名(推荐)
p conf/zoo_sample.cfg conf/zoo.cfg
修改配置
server1配置文件:
apache-zookeeper-3.6.2-bin-server1/conf/zoo.cfg
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/data/zookeeper/server1/data
dataLogDir=/data/zookeeper/server1/dataLog
clientPort=2181
server.1=0.0.0.0:2888:3888
server.2=0.0.0.0:2889:3889
server2配置文件:
apache-zookeeper-3.6.2-bin-server2/conf/zoo.cfg
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/data/zookeeper/server2/data
dataLogDir=/data/zookeeper/server2/dataLog
clientPort=2191
server.1=0.0.0.0:2888:3888
server.2=0.0.0.0:2889:3889
参数说明
- tickTime:发送心跳的间隔时间,单位:毫秒
- initLimit:Follower连接到Leader,失败后单次等待时间。等待总时长:tickTime * initLimit
- syncLimit:Follower发送数据到Leader,失败后单次等待时间。等待总时长:tickTime * initLimit
- dataDir:存储快照日志的目录
- dataLogDir:存储事务日志的目录
- clientPort:监听客户端连接的端口
- server.N=H:P:B
- N:服务器编号
- H:服务器地址
- localhost或127.0.0.1
- 0.0.0.0:不建议,不安全
- P:服务器相互通讯的端口
- B:P不可用时的备用端口号
因为我是一台服务器部署两个节点,所以P不能相同,为了方便连接,H也使用了0.0.0.0
单机集群与分布式集群的配置区别
- 单机集群
- clientPort不同
- H相同
- P、B不相同
- server.1=IP:2888:3888
server.2=IP:2889:3889
- 分布式集群
- clientPort相同
- H不相同,分别是各个服务器的IP
- P、B相同
- server.1=IP1:2888:3888
server.2=IP2:2888:3888
启动Zookeeper集群
Zookeeper常用命令
- 启动ZK服务:
sh bin/zkServer.sh start
- 查看ZK服务状态:
sh bin/zkServer.sh status
- 停止ZK服务:
sh bin/zkServer.sh stop
- 重启ZK服务:
sh bin/zkServer.sh restart
启动server1
sh apache-zookeeper-3.6.2-bin-server1/bin/zkServer.sh start
启动失败,报错信息:
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/gz/apache-zookeeper-3.6.2-bin-server1/bin/../conf/zoo.cfg
Starting zookeeper ... FAILED TO START
报错信息太粗略,需要查看报错日志详情,日志文件在apache-zookeeper-3.6.2-bin-server1/logs里
cat apache-zookeeper-3.6.2-bin-server1/logs/zookeeper-root-server-iZ8vbbuidiovq4xf9ykpfkZ.out
[root@iZ8vbbuidiovq4xf9ykpfkZ gz]# cat apache-zookeeper-3.6.2-bin-server1/logs/zookeeper-root-server-iZ8vbbuidiovq4xf9ykpfkZ.out
2021-01-23 20:55:28,260 [myid:] - INFO [main:QuorumPeerConfig@174] - Reading configuration from: /data/gz/apache-zookeeper-3.6.2-bin-server1/bin/../conf/zoo.cfg
2021-01-23 20:55:28,267 [myid:] - INFO [main:QuorumPeerConfig@460] - clientPortAddress is 0.0.0.0:2181
2021-01-23 20:55:28,267 [myid:] - INFO [main:QuorumPeerConfig@464] - secureClientPort is not set
2021-01-23 20:55:28,267 [myid:] - INFO [main:QuorumPeerConfig@480] - observerMasterPort is not set
2021-01-23 20:55:28,268 [myid:] - INFO [main:QuorumPeerConfig@497] - metricsProvider.className is org.apache.zookeeper.metrics.impl.DefaultMetricsProvider
2021-01-23 20:55:28,277 [myid:] - WARN [main:QuorumPeerConfig@729] - No server failure will be tolerated. You need at least 3 servers.
2021-01-23 20:55:28,277 [myid:] - ERROR [main:QuorumPeerMain@98] - Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing /data/gz/apache-zookeeper-3.6.2-bin-server1/bin/../conf/zoo.cfg
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:198)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:124)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:90)
Caused by: java.lang.IllegalArgumentException: myid file is missing
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.checkValidity(QuorumPeerConfig.java:812)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.setupQuorumPeerConfig(QuorumPeerConfig.java:683)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parseProperties(QuorumPeerConfig.java:507)
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:194)
... 2 more
Invalid config, exiting abnormally
2021-01-23 20:55:28,279 [myid:] - INFO [main:ZKAuditProvider@42] - ZooKeeper audit is disabled.
2021-01-23 20:55:28,280 [myid:] - ERROR [main:ServiceUtils@42] - Exiting JVM with code 2
日志的关键信息是:java.lang.IllegalArgumentException: myid file is missing
缺失文件: myid
原因: zookeeper集群模式下,server需要读取myid文件的内容来标识该节点唯一
解决方案: 在${dataDir}下分别创建myid文件,内容为1或2这种数字就行了
指令:
cat > /data/zookeeper/server1/data/myid << E
[root@iZ8vbbuidiovq4xf9ykpfkZ data]# cat > /data/zookeeper/server1/data/myid << E
> 1
> E
[root@iZ8vbbuidiovq4xf9ykpfkZ data]# cat > /data/zookeeper/server2/data/myid << E
> 2
> E
再次启动
指令:
sh apache-zookeeper-3.6.2-bin-server1/bin/zkServer.sh start
[root@iZ8vbbuidiovq4xf9ykpfkZ gz]# sh apache-zookeeper-3.6.2-bin-server1/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/gz/apache-zookeeper-3.6.2-bin-server1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@iZ8vbbuidiovq4xf9ykpfkZ gz]# sh apache-zookeeper-3.6.2-bin-server2/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/gz/apache-zookeeper-3.6.2-bin-server2/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
启动成功,查看集群状态
指令:
sh apache-zookeeper-3.6.2-bin-server1/bin/zkServer.sh status
[root@iZ8vbbuidiovq4xf9ykpfkZ gz]# sh apache-zookeeper-3.6.2-bin-server1/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/gz/apache-zookeeper-3.6.2-bin-server1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
[root@iZ8vbbuidiovq4xf9ykpfkZ gz]# sh apache-zookeeper-3.6.2-bin-server2/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /data/gz/apache-zookeeper-3.6.2-bin-server2/bin/../conf/zoo.cfg
Client port found: 2191. Client address: localhost. Client SSL: false.
Mode: leader
server1:
- 监听地址:2181
- 角色:follower
server2:
- 监听地址:2191
- 角色:leader
到此单机集群搭建结束,希望本文能给你有所收获~