1. 准备工作
- 安装JDK1.8,可以先检查自己的系统是否已经安装好了jdk。我自己的系统已经安装好了,大家可以参考CentOS7 安装JDK1.8
java -version
- 下载zookeeper
- 最开始,自己通过
wget
命令是zookeeper -3.5.8,整个安装完成后启动zookeeper服务,发现所有的节点都无法启动。报错如下:
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.5.6/bin/../conf/zoo1.cfg
Starting zookeeper ... FAILED TO START
- 参考博客:zookeeper 启动时一直报 :Starting zookeeper … FAILED TO START
- 重新下载更低版本的zookeeper,自己选择使用清华镜像中的 zookeeper-3.4.14.tar.gz
2. 安装zookeeper(在一台节点上)
- 解压缩安装包,并移动到安装目录 (我一般所有的操作都是在root用户下)
tar -zxvf zookeeper-3.4.14.tar.gz # 解压缩文件
cp -rf zookeeper-3.4.14 /usr/local # 复制到安装目录
chmod -R -777 /usr/local/zookeeper-3.4.14 # 修改权限
- 将
simple_zoo.cfg
为zoo.cfg
cd /usr/local/zookeeper-3.4.14/conf # 进入conf目录
cp simple_zoo.cfg zoo.cfg
- 新增data文件夹,作为
dataDir
mkdir /usr/local/zookeeper-3.4.14/data
- 我的整个
zoo.cfg
的配置如下
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 不提供dataLogDir,默认将日志文件写入dataDir
dataDir=/usr/local/zookeeper-3.4.14/data
# the port at which the clients will connect,默认为2181
clientPort=2330
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
# server.id=ip:port1:port2,id是对服务器的编号
# ip是服务器的IP地址;port1是leader和follower的通信端口,默认为2888;
# port2是选举leader的端口,默认为3888
server.1=10.101.30.63:2888:3888
server.2=10.101.39.48:2888:3888
server.3=10.101.29.157:2888:3888
- zookeeper还有一个默认端口:2181,client的访问端口。
- 为zookeeper配置环境变量,个人喜欢同时编辑
/etc/profile
和~/.bashrc
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14
export PATH=$PATH:$ZOOKEEPER_HOME/bin
- 通过
source
命令,使环境变量生效
source /etc/profile
source ~/.bashrc
3. 集群配置
- 通过
scp
命令将配置好的zookeeper-3.4.14
拷贝到其他节点
# 使用两次scp,ip分别为:10.101.39.48、10.101.29.157
scp -r zookeeper-3.4.14 username@IP:/usr/local
- 增加
myid
文件,向里面添加本节点的id,zookeeper启动时会查询zoo.cfg
,实现myid
与serve id
的关联。
# 10.101.30.63的节点,添加myid 为 1
echo 1 > /usr/local/zookeeper-3.4.14/data/myid
# 10.101.39.48的节点,添加myid 为2
echo 2 > /usr/local/zookeeper-3.4.14/data/myid
# 10.101.29.157的节点,添加myid 为3
echo 3 > /usr/local/zookeeper-3.4.14/data/myid
- 启动每个节点上的zookeeper
. zkServer.sh start
- 查看zookeeper的状态,从截图可以看出,三各节点,一个leader。两个follower。
. zkServer.sh status
安装参考:
CentOS7安装配置zookeeper集群CentOS安装ZooKeeper集群
4. 查看status,提示Error contacting service. It is probably not running.
- 启动成功后,使用
. zkServer.sh status
查看每个节点的状态,发现统一报错如下。
JMX enabled by default
Using config: /usr/local/zk/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
- 在
zoo.cfg
中指定的dataDir
,与自己创建的对应目录不一致。 —— 自己更改了,重启没反应 - 检查了很多其他细节:
-
dataDir
下面的myid
中写入的id是否与zoo.cfg
中配置的一致。 —— 一致 -
zoo.cfg
中书写的server IP是否正确。 —— 正确
- 查看
zoo.cfg
中clientPort
端口是否被占用。 —— 确实被占用
- 自己最开始配置的是
2181
这个端口值,发现确实有进程占用
lsof -i:2181
- 傻乎乎,这个端口被占用了,那我就在配置文件中改成其他端口(
2330
),并没有想过先去kill
进程。 - 重启以后,发现还是会报错,于是kill掉每台机器上
2181
和2330
的端口的进程。 - 再次重启,发现status能获取到状态了。
- tips:
status
能获取到状态,自己发现有个很重的证据是,dataDir
下面有一个zookeeper_server.pid
文件。
5. 使用zkCli时,127.0.0.1:2181: Connection refused
- 使用如下命令,连接zk的客户端
. zkCli.sh
- 发现进入以后报错:
2020-08-17 15:14:34,655 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1025] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
2020-08-17 15:14:34,656 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1162] - Socket error occurred: localhost/127.0.0.1:2181: Connection refused
- 很神奇的是,所有的
clientPort
配置的是2330
,为何访问任然访问的是2181
这个默认端口? - 查看资料以后,发现别人都是使用具体的参数访问
clientPort
。
. zkCli.sh -server localhost:2181
- 重启以后,自己也通过指定ip和port实现了对节点的访问。访问ok,ip和port也是自己指定的。
. zkCli.sh -server 10.101.30.63:2330