集群安装
集群方式:Zookeeper 使用方式主要有单机、伪集群、集群三种部署方式.
1.下载zookeeper安装包
Apache ZooKeeperhttps://zookeeper.apache.org/releases.html
2.解压安装包到安装目录
#1.创建安装目录
mkdir /usr/local/zookeeper
#2.解压安装包到指定目录下(使用3.4.9 最新的curator只支持3.4.x与4.0)
tar -xzvf /home/czh/zookeeper-3.4.9.tar.gz -C /usr/local/zookeeper
3.添加文件myid(必须是数字)
$cd /usr/local/zookeeper/zookeeper-3.4.9/data
$touch myid
$ vi myid
1
4.配置
#1.到达安装目录
cd /usr/local/zookeeper/apache-zookeeper-3.6.0-bin
#2.在zookeeper中新建data文件夹,做为zookeeper数据存储文件夹
mkdir /usr/local/zookeeper/apache-zookeeper-3.6.0-bin/data
#3.复制zoo_sample.cfg,并给新起名的zoo.cfg
cp /usr/local/zookeeper/apache-zookeeper-3.6.0-bin/conf/zoo_sample.cfg /usr/local/zookeeper/apache-zookeeper-3.6.0-bin/conf/zoo.cfg
#4修改zoo.cfg中dataDir属性值为新建data文件夹的路径(vim zoo.cfg)
vim /usr/local/zookeeper/apache-zookeeper-3.6.0-bin/conf/zoo.cfg
# tickTime: 客户端与服务器、服务器与服务器之间维持心跳的时间间隔,也就是每一个
# tickTime 会发送一次心跳,单位为毫秒
tickTime=2000
# initLimit: 集群中 Leader 和 Follow 初始化连接时最多能容忍的心跳数
# 也就是初始化过程中,如果 Leader 和 Follow 在 (10*tickTime)的时间内还没有连
# 接上,则认为连接失败
initLimit=10
# syncLimit: 同步通信实现, Leader 和 Follow 服务器之间发送请求和接收应答最多
# 能容忍的心跳数
# 也就是Leader和Follow如果发送的请求在 (5*tickTime)的时间没没有应答,那么就认
# 为Leader和Follow之间连接失败
syncLimit=5
# dataDir: zookeeper保存日志文件的目录
dataDir=/usr/local/zookeeper/apache-zookeeper-3.6.0-bin/data
dataLogDir=/usr/local/zookeeper/apache-zookeeper-3.6.0-bin/data/logs
# clientPort: 客户端连接 zookeeper 服务器的端口, zookeeper 会监控这个端口
clientPort=2181 #1,2,3 分别设置 2181 注意几个端口的区分
# the maximum number of client connections.
# increase this if you need to handle more clients
# maxClientCnxns=60
# 日志中保留的快照数目
autopurge.snapRetainCount=3
# 定时清除任务,单位为小时
autopurge.purgeInterval=1
###############cluster###############
server.1=hd09-1:2888:3888 #注意与clientPort的区分
server.2=hd09-2:2888:3888 #注意与clientPort的区分
server.3=hd09-3:2888:3888 #注意与clientPort的区分
server.1=192.168.137.230:2888:3888 #注意与clientPort的区分2181不正确
server.2=192.168.137.226:2888:3888 #注意与clientPort的区分
server.3=192.168.137.219:2888:3888 #注意与clientPort的区分
#最好直接使用ip不然会有问题(不确定)
#其中server.后面的数字1、2、3分别是机器hd09-1、hd09-2、hd09-3
#中zookeeper-3.4.10/zkData/myid文件中的值
#server.myid=ip:port1:port2
#port1:zk集群成员的信息交换 与clientPort 不同
#port2:在leader挂掉时专门用来进行选举leader所用
#clientPort=xxxx 对外暴露的端口
#clientPort=2181
// 这个可以不用改变都是使用同一个,由于不同的机器不会存在端口冲突的情况了
# 集群信息规则(server.服务器编号=服务器的 IP 地址: LF 通信端口:选举端口
# server.N=YYY:A:B
# N: 服务器编号,每一台服务器的编号都是唯一的
# YYY: 服务器的 IP 地址
# A: LF 通信的端口,服务器与 zookeeper 集群中 Leader 交换信息的端口
# B: 选举端口,
# 集群中每一台服务器的 A 端口都是一样的,集群中的每一台服务器的 B 端口也是一样的
# 但是当采用伪集群的时候,由于 IP 地址都是一样的,只能是 A 端口和 B 端口不一样.
observer 节点配置
//此处声明表示作为一个观察者角色存在
peerType=observer
server.1=10.2.143.5:2887:3887
server.2=10.2.143.36:2888:3888
server.3=10.2.143.37:2889:3889
//注意观察者角色的末尾,需要拼接上observer
server.4=10.2.143.38:2886:3886:observer
5.修改环境变量
vi /etc/profile
export ZOOKEEPER_HOME=/root/hd/zookeeper3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
6.生效环境变量
source /etc/profile
7.启动zookeeper服务
/usr/local/zookeeper/apache-zookeeper-3.6.0-bin/bin/zkServer.sh start
8.验证是否启动成功:
/usr/local/zookeeper/apache-zookeeper-3.6.0-bin/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone
在Zookeeper服务器成功启动的前提下,在Linux侧的shell命令端口执行下面的ruok四字命令,如果能够显示imok,表示zk服务器端成功启动。
使用四字命令:
echo ruok | nc 127.0.0.1 2181
9.客户端连接:./zkCli.sh
Mode: follower //显示当前zk是follwer 还是Leader.
$ telnet 127.0.0.1 2181
Trying 127.0.0.1.....
Connected to localhost.localdomain(127.0.0.1).
Escape character is '^]'
stat
Zookeeper version: 3.4.3-1240972,built on 02/06/2012 10:48 GMT
Clients:
/127.0.0.1:50257[0](queued=0,recved=1,sent=0)
Latency min/avg/max:0/1/4489
Received: 844689
Sent: 993100
Outstanding: 0
Zxid: 0x600084344
Mode: leader ### 集群模式
Node count 37
出现以上信息则说明正常启动
10.关闭zookeeper
异常内容
2021-03-15 16:11:41,548 [myid:1] - WARN [QuorumConnectionThread-[myid=1]-4:QuorumCnxManager@400] - Cannot open channel to 2 at election address zk_02/192.168.137.226:3888
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.initiateConnection(QuorumCnxManager.java:383)
at org.apache.zookeeper.server.quorum.QuorumCnxManager$QuorumConnectionReqThread.run(QuorumCnxManager.java:457)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
这种情况一般是两种:
1 端口的防火墙没开
2 如果是放在云上的话,zoo.cfg里面的ip要是内网地址,不能是别名或者公网地址
大坑
我们发现当我们启动zookeeper后data中除了自己写的myid外还多出一个version-2的文件夹,这就是关键!!我们可以看到这个文件夹对root可执行,但是当我们进入之后,发现里面的三个文件都是不可执行的。我们需要修改他们的权
集群端口配置错误可能造成follower与leader不同步