从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

本文来自博客园,作者:丁志岩,转载请注明原文链接:https://www.cnblogs.com/dezyan/p/18797056


浙公网安备 33010602011771号