目录
1.1.2 安装 zookeeper(在 hadoop01 上操作)
一、zookeeper 集群操作
1.1 zookeeper 集群部署
1.1.1 集群规划
注:最好是三台,但我本地资源不够,就塔两台了。
主机名 | IP |
hadoop01 | 192.168.170.130 |
hadoop02 | 192.168.170.131 |
1.1.2 安装 zookeeper(在 hadoop01 上操作)
可以查看上一篇文章进行操作:【Zookeeper 初级】01、Zookeeper 入门及安装_Stars.Sky的博客-CSDN博客
并在 hadoop02 上安装 JDK即可。
1.1.3 配置服务器编号
- (1)在 /opt/module/zookeeper-3.7.1/zkData 目录下创建一个 myid 的文件
[root@hadoop01 /opt/module/zookeeper-3.7.1]# cd /opt/module/zookeeper-3.7.1/zkData/
[root@hadoop01 /opt/module/zookeeper-3.7.1/zkData]# vim myid
1
在文件中添加与 server 对应的编号 (注意:上下不要有空行,左右不要有空格)
- (2)拷贝配置好的 zookeeper 到其他机器上
#1. 编写分发脚本
[root@hadoop01 /opt/module]# pwd
/opt/module
[root@hadoop01 /opt/module]# vim xsync
#!/bin/bash
#1. 判断参数个数
if [ $# -lt 1 ]
then
echo Not Enough Arguement!
exit;
fi
#2. 遍历集群所有机器
for host in hadoop01 hadoop02
do
echo ==================== $host ====================
#3. 遍历所有目录,挨个发送
for file in $@
do
#4. 判断文件是否存在
if [ -e $file ]
then
#5. 获取父目录
pdir=$(cd -P $(dirname $file); pwd)
#6. 获取当前文件的名称
fname=$(basename $file)
ssh $host "mkdir -p $pdir"
rsync -av $pdir/$fname $host:$pdir
else
echo $file does not exists!
fi
done
done
[root@hadoop01 /opt/module]# chmod 777 xsync
[root@hadoop01 /opt/module]# mv xsync /usr/bin/
#2. 配置主机解析。两台机子都要执行
[root@hadoop01 /opt/module]# vim /etc/hosts
192.168.170.130 hadoop01
192.168.170.131 hadoop02
#3. 配置免密登录
# ⼀直回⻋就⾏
[root@hadoop01 /opt/module]# ssh-keygen -t rsa
# 等待一会,然后输入 yes,再输入各主机的密码即可
[root@hadoop01 /opt/module]# for i in hadoop01 hadoop02;do ssh-copy-id -i /root/.ssh/id_rsa.pub $i;done
#4. 分发安装包
[root@hadoop01 /opt/module]# xsync zookeeper-3.7.1/
#5. 在 hadoop02 上修改 myid 文件中内容为 2
[root@hadoop02 ~]# vim /opt/module/zookeeper-3.7.1/zkData/myid
2
1.1.4 配置 zoo.cfg 文件
- (1)打开 zoo.cfg 文件
# 在文件末尾添加下面内容
[root@hadoop01 /opt/module]# vim zookeeper-3.7.1/conf/zoo.cfg
#######################cluster#######################
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
# 同步 zoo.cfg 配置文件
[root@hadoop01 /opt/module]# xsync zookeeper-3.7.1/conf/zoo.cfg
- (2)配置参数解读
server.A=B:C:D
-
A 是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件 myid 这个文件在 dataDir 目录 下,这个文件里面有一个数据就是 A的值, Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个 server。
-
B 是这个服务器的地址;
-
C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口;
-
D 是万一集群中的 Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
1.1.5 集群操作
- (1)分别启动 Zookeeper
[root@hadoop01 /opt/module]# cd /opt/module/zookeeper-3.7.1/
[root@hadoop01 /opt/module/zookeeper-3.7.1]# bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@hadoop02 /opt/module]# cd /opt/module/zookeeper-3.7.1/
[root@hadoop02 /opt/module/zookeeper-3.7.1]# bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- (2)查看状态
[root@hadoop01 /opt/module/zookeeper-3.7.1]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: followe
[root@hadoop02 /opt/module/zookeeper-3.7.1]# bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
1.2 选举机制(面试重点)
1.2.1 Zookeeper 选举机制——第一次启动
-
服务器 1 启动,发起一次选举。服务器 1 投自己一票。此时服务器 1 票数一票不够半数以上 3 票,选举无法完成服务器 1 状态保持为 LOOKING;
-
服务器 2 启动,再发起一次选举。服务器 1 和 2 分别投自己一票并交换选票信息,此时服务器 1 发现服务器 2 的 myid 比自己目前投票推举的(服务器 1) 大,更改选票为推举服务器 2。此时服务器 1 票数 0 票,服务器 2 票数 2 票,没有半数以上结果,选举无法完成,服务器 1、2 状态保持 LOOKING;
-
服务器 3 启动,发起一次选举。此时服务器 1 和 2 都会更改选票为服务器 3。此次投票结果:服务器 1 为 0 票,服务器 2 为 0 票,服务器 3 为 3 票。此时服务器 3 的票数已经超过半数,服务器 3 当选 Leader。服务器 1、2 更改状态为 FOLLOWING,服务器 3 更改状态为 LEADING;
-
服务器 4 启动,发起一次选举。此时服务器 1、2、3 已经不是 LOOKING 状态不会更改选票信息。交换选票信息结果:服务器 3 为 3 票,服务器 4 为1 票。此时服务器 4 服从多数更改选票信息为服务器 3 ,并更改状态为 FOLLOWING;
-
服务器 5 启动,同 4 一样当小弟 。
1.2.2 Zookeeper 选举机制——非第一次启动
1.3 ZK 集群启动停止脚本
1.3.1 编写启停脚本
[root@hadoop01 /opt/module/zookeeper-3.7.1]# vim /usr/bin/zk.sh
#!/bin/bash
case $1 in
"start") {
for i in hadoop01 hadoop02
do
echo -------- zookeeper $i 启动 --------
ssh $i "/opt/module/zookeeper-3.7.1/bin/zkServer.sh start"
done
};;
"stop") {
for i in hadoop01 hadoop02
do
echo -------- zookeeper $i 停止 --------
ssh $i "/opt/module/zookeeper-3.7.1/bin/zkServer.sh stop"
done
};;
"status") {
for i in hadoop01 hadoop02
do
echo -------- zookeeper $i 状态 --------
ssh $i "/opt/module/zookeeper-3.7.1/bin/zkServer.sh status"
done
};;
esac
[root@hadoop01 /opt/module/zookeeper-3.7.1]# chmod 777 /usr/bin/zk.sh
1.3.2 编写查看集群 Java 进程脚本
[root@hadoop01 /opt/module/zookeeper-3.7.1]# vim /usr/bin/jpsall
#!/bin/bash
for host in hadoop01 hadoop02
do
echo ========= $host =========
ssh $host /usr/java/jdk1.8.0_361/bin/jps -l
done
[root@hadoop01 /opt/module/zookeeper-3.7.1]# chmod 777 /usr/bin/jpsall
1.3.3 测试启停
[root@hadoop01 /opt/module/zookeeper-3.7.1]# zk.sh start
-------- zookeeper hadoop01 启动 --------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Starting zookeeper ... already running as process 4688.
-------- zookeeper hadoop02 启动 --------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@hadoop01 /opt/module/zookeeper-3.7.1]# jpsall
========= hadoop01 =========
4688 org.apache.zookeeper.server.quorum.QuorumPeerMain
4992 sun.tools.jps.Jps
========= hadoop02 =========
22372 org.apache.zookeeper.server.quorum.QuorumPeerMain
22421 sun.tools.jps.Jps
[root@hadoop01 /opt/module/zookeeper-3.7.1]# zk.sh status
-------- zookeeper hadoop01 状态 --------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
-------- zookeeper hadoop02 状态 --------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
[root@hadoop01 /opt/module/zookeeper-3.7.1]# zk.sh stop
-------- zookeeper hadoop01 停止 --------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
-------- zookeeper hadoop02 停止 --------
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.7.1/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED
如出现下面报错信息:
[root@hadoop01 /opt/module/zookeeper-3.7.1]# zk.sh start
-------- zookeeper hadoop01 启动 --------
Error: JAVA_HOME is not set and java could not be found in PATH.
-------- zookeeper hadoop02 启动 --------
Error: JAVA_HOME is not set and java could not be found in PATH.
解决办法:(两台机器都需要修改)
[root@hadoop01 /opt/module/zookeeper-3.7.1]# vim /opt/module/zookeeper-3.7.1/bin/zkEnv.sh
JAVA_HOME="/usr/java/jdk1.8.0_361"
上一篇文章:【Zookeeper 初级】01、Zookeeper 入门及安装_Stars.Sky的博客-CSDN博客
下一篇文章:【Zookeeper 初级】03、Zookeeper 客户端命令行操作_Stars.Sky的博客-CSDN博客