什么是zookeeper?
zookeeper是apache基金会开源的一个顶级项目,其主要的应用场景就是多用于分布式集群起到’协调’服务的作用。zookeeper的应用场景主要有:配置中心,注册中心,服务发现等。官网地址:
https://zookeeper.apache.org/
zookeeper单点部署:
- 1.下载zookeeper软件包
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
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
[root@elk91 ~]# ll /usr/local/zookeeper/conf/zoo{_sample,}.cfg
-rw-r--r-- 1 root root 1183 Mar 16 16:19 /usr/local/zookeeper/conf/zoo.cfg
-rw-r--r-- 1 root root 1183 Feb 13 2024 /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
- 7.链接zookeeper服务
[root@elk91 ~]# zkCli.sh
Connecting to localhost:2181
...
[zk: localhost:2181(CONNECTED) 0]
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1]
- 8.测试单点故障
[root@elk91 ~]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[root@elk91 ~]#
至此zookeeper单点部署完成咯!
zookeeper集群部署:
- 1.再起两台服务器作为两个节点92,93
- 2.停止zookeeper的单点模式
[root@elk91 ~]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[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.
Error contacting service. It is probably not running.
- 3.修改配置文件
[root@elk91 ~]# cat > /usr/local/zookeeper/conf/zoo.cfg <<EOF
# 定义最小单元的时间范围tick。
tickTime=2000
# 启动时最长等待tick数量。
initLimit=5
# 数据同步时最长等待的tick时间进行响应ACK
syncLimit=2
# 指定数据目录
dataDir=/oldboyedu/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
- 4.拷贝软件包到集群的其他节点
[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/
- 5.elk91节点配置免密登录
[root@elk91 ~]# apt -y install expect
[root@elk91 ~]# cat > password_free_login.sh <<'EOF'
#!/bin/bash
# auther: violet
# 创建密钥对
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
也可以手动ssh-keygen ssh-copy-id 10.0.0.92 ssh-copy-id 10.0.0.93,给其他节点做免密要登录哟!自行选择
- 6.准备myid文件
[root@elk91 ~]# for i in `seq 91 93`; do ssh 10.0.0.$i "install -d /zkp/data/zk && echo $i > /zkp/data/zk/myid";done
- 7.启动zookeeper集群
[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 ~]#
[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.
Mode: leader #92节点是leader
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@elk91 ~]#
- 8.连接集群测试
[root@elk91 ~]# zkCli.sh -server 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181
Connecting to 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]
[zk: 10.0.0.91:2181,10.0.0.92:2181,10.0.0.93:2181(CONNECTED) 1]
- 9.停止Leader节点观察服务是否正常还使用,验证zookeeper的高可用
[root@elk92 ~]# zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
[root@elk92 ~]#
观察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 #93节点变成leader
[root@elk91 ~]#
- 10.得出高可用集群结论
如果集群要对外部提供服务,最少要保证半数以上的服务存活的。
换句话说,如果你想要一个zk集群,容忍N台节点故障,则需要准备2N+1台服务器。
至此zookeeper集群搭建完成!
彩蛋:zookeeper如何优化?
优化方法:
修改zookeeper集群的堆内存大小:
- 1.查看默认的堆内存大小
[root@elk91 ~]# ps -ef | grep zookeeper
root 26219 1 0 17:09 pts/1 00:00:03 /usr/share/elasticsearch/jdk/bin/java ... -Xmx1000m...
- 2.生产环境调优说明
对于环境中,如果数据量不大的,默认1GB是够用的,如果数据量较大,建议将堆内存调大,比如4GB。
而学习环境中,仅需要128m就可以了。
- 3.修改堆内存映射
[root@elk91 ~]# vim /usr/local/zookeeper/bin/zkEnv.sh
...
ZK_SERVER_HEAP="${ZK_SERVER_HEAP:-128}"
- 4.将配置文件同步到zookeeper集群
root@elk91 ~]# scp /usr/local/zookeeper/bin/zkEnv.sh 10.0.0.92:/usr/local/zookeeper/bin/
[root@elk91 ~]# scp /usr/local/zookeeper/bin/zkEnv.sh 10.0.0.93:/usr/local/zookeeper/bin/
- 5.重启zookeeper集群
[root@elk91 ~]# zkServer.sh restart
[root@elk92 ~]# zkServer.sh restart
[root@elk93 ~]# zkServer.sh restart
- 6.验证测试
[root@elk91 ~]# ps -ef | grep zookeeper
root 26581 1 5 17:41 pts/1 00:00:01 /usr/share/elasticsearch/jdk/bin/java .. -Xmx128m -Xmx128m ..
zookeeper的leader选举流程
选举流程:
1.先比较zxid;
2.再比较myid
Categories: