目录
在实际的生产环境中,集群是部署在不同机器上的, 本着简单明了的原则, 本次介绍的集群是搭建在同一台虚拟机器上,建立三个Zookeeper的节点,用端口号进行区分,搭建一个
伪集群
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9b395b9b1810dafacdefb1bdbd26262f.png#pic_center)
一. 环境准备
1. 配置JDK
Zookeeper的运行需要JDK为基础,所以需要先在虚拟机上配置好JDK
JDK1.8 工具包
提取码: qwer
- 先将JDK工具包上传到虚拟机上(一般上传到目录/usr/local目录下)
- 解压工具包
tar -zxvf jdk-8u341-linux-x64.tar.gz
- 配置JDK环境变量
vim /etc/profile
先按 i键
进入编辑模式, 在末尾添加下面两句, 再按 Esc键
退出编辑模式,最后按 Shift + Q键
, 进入 Ex模式
, 输入 wq!
保存退出
export JAVA_HOME=/usr/local/jdk1.8.0_341/
export PATH=$PATH:$JAVA_HOME/bin
- 重新刷新下配置,否则可能不生效
source /etc/profile
- 最后验证下JDK是否配置成功
java -version
出现下面情况,说明JDK配置成功
2. 配置Zookeeper
Zookeeper 工具包
提取码: qwer
- 将Zookeeper工具包上传到虚拟机上(一般上传到目录/usr/local目录下),并解压
tar -zxvf zookeeper-3.5.8.tar.gz
- 为了后续配置文件好配,这里我单独创建一个zookeeper目录
mkdir /usr/local/zookeeper
- 将解压后的apache-zookeeper-3.5.8-bin目录中的内容复制至zookeeper目录
cp -r apache-zookeeper-3.5.8-bin/. /usr/local/zookeeper
- 新建data目录,并在此目录下新建三个子目录
mkdir /usr/local/zookeeper/data
mkdir /usr/local/zookeeper/data/node-1
mkdir /usr/local/zookeeper/data/node-2
mkdir /usr/local/zookeeper/data/node-3
- 为了不破坏zookeeper原始的配置文件,搭错了还能重来, 将zoo_sample.cfg配置文件复制三份
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo-1.cfg
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo-2.cfg
cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo-3.cfg
- 修改三份zoo.cfg中的clientPort和dataDir配置信息
vim /usr/local/zookeeper/conf/zoo-1.cfg
## node-1节点 - zoo-1.cfg
clientPort=2181 ## 默认就是2181,不用改
dataDir=/usr/local/zookeeper/data/node-1
vim /usr/local/zookeeper/conf/zoo-2.cfg
## node-2节点 - zoo-2.cfg
clientPort=2182
dataDir=/usr/local/zookeeper/data/node-2
vim /usr/local/zookeeper/conf/zoo-3.cfg
## node-3节点 - zoo-3.cfg
clientPort=2183
dataDir=/usr/local/zookeeper/data/node-3
至此,搭建集群的前期准备工作就算完成了,接下来就是集群搭建了
二. Zookeeper 集群搭建
1. 创建myid文件
在每个节点中的data目录下, 创建下myid文件,并且写入标识值
myid的值是zoo.cfg文件里定义的server.A项A的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个server,只是一个标识作用。
echo 1 >/usr/local/zookeeper/data/node-1/myid
echo 2 >/usr/local/zookeeper/data/node-2/myid
echo 3 >/usr/local/zookeeper/data/node-3/myid
2. 配置集群节点信息
在每个节点的zoo.cfg文件中都配置集群节点信息
server.1=10.15.122.88:2881:3881
server.2=10.15.122.88:2882:3882
server.3=10.15.122.88:2883:3883
server.A=B:C:D
- A 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件 myid,这个文件在 dataDir
目录下,这个文件里面有一个数据 就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据
与 zoo.cfg 里面的配置信息比较从而判断到底是哪个server - B 是这个服务器的地址
- C 是这个服务器Follower与集群中的Leader服务器交换信息的端口
- D 是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而
这个端口就是用来执行选举时服务器相互通信的端口
3. 启动Zookeeper
启动三个zoo.cfg配置文件,代表三个zookeeper节点
sh ./bin/zkServer.sh start ./conf/zoo-1.cfg
sh ./bin/zkServer.sh start ./conf/zoo-2.cfg
sh ./bin/zkServer.sh start ./conf/zoo-3.cfg
4. 查看各节点状态
sh ./bin/zkServer.sh status ./conf/zoo-1.cfg
sh ./bin/zkServer.sh status ./conf/zoo-2.cfg
sh ./bin/zkServer.sh status ./conf/zoo-3.cfg
从上述三个节点的状态看, 节点2成为了主节点, 节点1和节点3成为了从节点
至此, 简易的Zookeeper集群搭建完成
三. 验证集群是否正常运行
查看三个节点运行的进程号
ps -ef | grep .cfg
以下每个场景都是模拟一主二从, 现在node-1和node-3是从节点,node-2是主节点
下线节点使用下面命令,直接杀死进程
kill -9 进程号
模拟场景1: 下线一个从节点, 主节点和另一个从节点正常存活
将从节点node1下线, 从节点node3和主节点node2存活
kill -9 9184
此时再来查看进程运行情况
可以看到从节点node-1已经成功下线
再看下集群情况
此时,node-1节点已经下线,不影响集群的正常运行且其他节点的身份也没变化, node-2依旧是主节点,node-3还是从节点
模拟场景2: 下线主节点,其他从节点正常存活
前提要先把上一场景的node-1重新启起来.node-1会以从节点的身份重新加入到集群中
将主节点node-2下线, 从节点node-1和主节点node-3正常存活
kill -9 9235
此时再来查看进程运行情况
可以看到主节点node-2已经成功下线
再看下集群情况
sh ./bin/zkServer.sh status ./conf/zoo-1.cfg
sh ./bin/zkServer.sh status ./conf/zoo-2.cfg
sh ./bin/zkServer.sh status ./conf/zoo-3.cfg
此时,node-2下线后, node-1依旧是从节点, node-3由从节点变成主节点了
这是因为集群必须要有一个主节点, 当主节点下线之后,会在其他从节点当中重新选举出一个主节点来保证集群的正常运行
模拟场景3: 下线两个节点
前提要先把上一场景的node-2重新启起来,node-2会以从节点的身份重新加入到集群中
将节点node-1和node-3下线, 节点node-2正常存活
kill -9 9299
kill -9 9632
此时再来查看进程运行情况
此时就一个node-3节点进程在运行
再看下集群情况
sh ./bin/zkServer.sh status ./conf/zoo-1.cfg
sh ./bin/zkServer.sh status ./conf/zoo-2.cfg
sh ./bin/zkServer.sh status ./conf/zoo-3.cfg
可以看出集群已经停止运行,因为只有一个节点存活, 小于集群的最小存活节点数的规则
最小存活节点数 = (节点总数)/2 + 1
由此计算规则可知, 要想集群正常运行,必须要有两个节点存活才行
验证下: 之前是节点node-2存活, 重新启动节点node-1
重新启动节点node-1,发现集群又恢复正常了,原本节点node-2是从节点, 此时有两个节点,满足集群的最小节点数, 集群正常运行,并重新选举出一个主节点
注意: 如果之前下线的2个节点都是从节点, 主节点存活, 那么此时就不会重新选举
四. 总结
- 集群必须要有一个主节点
- 集群中,如果主节点下线, 会在剩下的从节点中重新选举一个主节点
- 集群中,如果现有存活的节点数小于集群最小存活节点数时, 集群停止工作, 变成单机 ; 当有节点重新启用时, 满足集群最小存活节点数条件, 集群恢复正常