从0搭建Zookeeper单点、集群

主机IP 主机名
10.0.0.91 elk91
10.0.0.92 elk92
10.0.0.93 elk93

单点部署

1.下载zookeeper软件包

root@elk91:~# wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz

2.解压软件包

root@elk91:~# tar xf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/local/

3.创建符号链接

root@elk91:~# ln -svf /usr/local/apache-zookeeper-3.8.4-bin /usr/local/zookeeper

4.添加环境变量

root@elk91:~# cat /etc/profile.d/zk.sh
#!/bin/bash

#因为es也是基于java语言写的,所以这里的java环境直接引用了es的
export JAVA_HOME=/usr/share/elasticsearch/jdk
export ZK_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZK_HOME/bin:$JAVA_HOME/bin

root@elk91:~# source /etc/profile.d/zk.sh

5.准备配置文件

root@elk91:~#  cp /usr/local/zookeeper/conf/zoo{_sample,}.cfg

6.启动zookeeper服务

root@elk91:~# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

#查看状态
root@elk91:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
#显示为单点
Mode: standalone

#停止服务
root@elk91:~# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

7.连接zookeeper服务

root@elk91:~# zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]

zookeeper集群部署

1.停止zookeeper的单点模式

root@elk91:~# zkServer.sh stop

2.修改配置文件

root@elk91:~# cat > /usr/local/zookeeper/conf/zoo.cfg <<EOF
# 定义最小单元的时间范围tick。
tickTime=2000
# 启动时最长等待tick数量。
initLimit=5
# 数据同步时最长等待的tick时间进行响应ACK
syncLimit=2
# 指定数据目录
dataDir=/dezyan/data/zk
# 监听端口
clientPort=2181
# 开启四字命令允许所有的节点访问。
4lw.commands.whitelist=*
# server.ID=A:B:C[:D]
# ID:
#    zk的唯一编号。
# A:
#    zk的主机地址。
# B:
#    leader的选举端口,是谁leader角色,就会监听该端口。
# C: 
#    数据通信端口。
# D:
#    可选配置,指定角色。
server.91=10.0.0.91:2888:3888
server.92=10.0.0.92:2888:3888
server.93=10.0.0.93:2888:3888

## Metrics Providers
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
#metricsProvider.httpHost=0.0.0.0
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
EOF

3.拷贝软件包到集群的其他节点

root@elk91:~# cat /etc/profile.d/zk.sh
#!/bin/bash
export JAVA_HOME=/usr/share/elasticsearch/jdk
export ZK_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZK_HOME/bin:$JAVA_HOME/bin

root@elk91:~# scp -r /usr/local/zookeeper 10.0.0.92:/usr/local/
root@elk91:~# scp -r /usr/local/zookeeper 10.0.0.93:/usr/local/
root@elk91:~# scp /etc/profile.d/zk.sh 10.0.0.92:/etc/profile.d/
root@elk91:~# scp /etc/profile.d/zk.sh 10.0.0.93:/etc/profile.d/

4.elk91节点配置免密登录

root@elk91:~# apt -y install expect
root@elk91:~# cat > password_free_login.sh <<'EOF'
#!/bin/bash

# 创建密钥对
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q

# 声明你服务器密码,建议所有节点的密码均一致,否则该脚本需要再次进行优化
export mypasswd=1

# 定义主机列表
elk_list=(10.0.0.91 10.0.0.92 10.0.0.93)

# 配置免密登录,利用expect工具免交互输入
for i in ${elk_list[@]};do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
  expect {
    \"*yes/no*\" {send \"yes\r\"; exp_continue}
    \"*password*\" {send \"$mypasswd\r\"; exp_continue}
  }"
done
EOF
root@elk91:~# bash password_free_login.sh

5.准备myid文件

root@elk91:~# for i in `seq 91 93`; do ssh 10.0.0.$i "install -d /dezyan/data/zk && echo $i > /dezyan/data/zk/myid";done

6.启动zookeeper集群

#执行环境变量脚本,启动各个节点的zk服务
root@elk91:~# for i in `seq 91 93`; do ssh 10.0.0.$i "source /etc/profile.d/zk.sh && zkServer.sh start";done
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

#查看各个节点的状态
root@elk91:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

root@elk92:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

root@elk93:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

7.连接集群测试

root@elk93:~# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 0] ls /
[zookeeper]

8.停止Leader节点观察服务是否正常还使用,验证zookeeper的高可用

①停止Leader

[root@elk92 ~]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

②观察Leader变化

[root@elk91 ~]# for i in `seq 91 93`; do ssh 10.0.0.$i "source /etc/profile.d/zk.sh && zkServer.sh status";done
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Error contacting service. It is probably not running.
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader

③得出高可用集群结论

如果集群要对外部提供服务,最少要保证半数以上的服务存活的。
换句话说,如果你想要一个zk集群,容忍N台节点故障,则需要准备2N+1台服务器。
所以分布式服务通常是单数节点

zkWeb实现zookeeper的WebUI管理

1.下载解压JDK8、zkweb

root@elk91:~# tar xf jdk-8u291-linux-x64.tar.gz -C /usr/local/

2.使用JDK8启动zkWeb

root@elk91:~# nohup /usr/local/jdk1.8.0_291/bin/java -jar zkWeb-v1.2.1.jar  &

3.访问zkWeb的UI

http://10.0.0.91:8099/

posted @ 2025-03-27 22:56  丁志岩  阅读(39)  评论(0)    收藏  举报