Zookeeper 有三种部署模式:
下面就介绍一下这三种模式的部署过程。
zookeeper服务器是用Java创建的,运行在JVM之上。需要安装JDK7以上版本(最好JDK8或以上)。
官网下载地址:https://zookeeper.apache.org/releases.html
下载在本地之后可以把安装包上传到服务器或者虚拟机中,我使用的是服务器并远程shell连接
使用xshell 远程连接服务器,在opt目录下新建一个zookeeper目录
使用xftp将刚才下载的安装包上传到zookeeper目录下
进入zookeeper目录下解压
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz
进入conf配置目录
zoo_sample.cfg就是配置文件,但是此文件不能生效,需要名称为zoo.cfg的文件才能生效。
编辑配置文件zoo.cfg /tmp/zookeeper这个目录是zookeeper用于存储持久化的数据到本地的,但是服务器默认是没有的。
进入opt/zookeeper目录下,新建一个目录zkdata(目录名随意取)用于存放zookeeper的持久化数据。
复制此目录/opt/zookeeper/zkdata,将zoo.cfg配置文件中的dataDir修改为/opt/zookeeper/zkdata。
保存退出!
启动成功!
说明:伪分布即在一台服务器上通过不同端口模拟出分布式集群的效果,分布式一般 3 台起,一主两从。
说明:伪分布安装在了 Windows 开辟的虚拟机上,主机名为 bigdata。
将 zookeeper 安装包 zookeeper-3.4.10.tar.gz 导入 Linux。解压并重命名
[root@bigdata ~]# cd /software/
[root@bigdata software]# tar -zxvf zookeeper-3.4.10.tar.gz -C .
[root@bigdata software]# mv zookeeper-3.4.10 zk
# /etc/profile
export ZOOKEEPER_HOME=/software/zk
export PATH=.:$PATH:$ZOOKEEPER_HOME/bin
备份及修改 zk 配置文件** zoo_sample.cfg.bak
[root@bigdata software]# cd zk/conf
[root@bigdata conf]# cp zoo_sample.cfg zoo1.cfg
[root@bigdata conf]# vi zoo1.cfg # 修改该文件,注意一下两点即可,其他按默认即可
# 客户端端口,三个节点需要指定不同端口避免端口冲突
clientPort=2181
# 存放数据的目录,自定义,后边创建
dataDir=/software/zk/data/bigdata1
# 服务器列表及端口,三个节点需要指定不同的端口避免端口冲突
server.1=bigdata:2887:3887
server.2=bigdata:2888:3888
server.3=bigdata:2889:3889
clientPort
和 dataDir
server.id=hostname:port1:port2
tickTime:#zk 服务器和客户端会话心跳超时间间隔,单位为毫秒
initLimit:#在 zk follower 和 leader 之间进行数据同步最大超时次数,比如 initLimit = 5 ,tickTime = 2000,则允许最大延迟则为 5 * 2000 = 10000 毫秒
syncLimit:#在 follower 和 leader 之间数据同步和消息发送时,请求和应答不能超过多少个 tickTIme
dataDir:#zk 内部存储数据的磁盘位置,默认情况下 zk 的日志文件也保存在这个目录中。zk 运行期间会将数据存储在内存,保证访问速度
server.x:#zk 的服务器列表,格式如下:server.x = hostname:port1:port2 ,x 为从 1 -N 的数字,说明该节点 zk 集群中的编号,该编号在 myid 中配置,hostname 为当前服务器主机名或 IP,port1 为 follower 和 leader 之间通讯端口,port2 为 leader 失效后选举端口
myid:#在各自的 dataDir 目录中,内容就是当前服务器的编号
zoo1.cfg 配置完后为其他两个节点复制两份,并修改 clientPort 和 dataDir:
[root@bigdata conf]# cp zoo1.cfg zoo2.cfg
[root@bigdata conf]# cp zoo1.cfg zoo3.cfg
[root@bigdata conf]# vi zoo2.cfg
clientPort=2182
dataDir=/software/zk/data/bigdata2
[root@bigdata conf]# vi zoo3.cfg
clientPort=2183
dataDir=/software/zk/data/bigdata3
根据 zoox.cfg 中 dataDir 创建目录
[root@bigdata conf]# mkdir /software/zk/data
[root@bigdata conf]# cd /software/zk/data
[root@bigdata data]# mkdir bigdata1 bigdata2 bigdata3
[root@bigdata data]# vi bigdata1/myid
1
[root@bigdata data]# vi bigdata2/myid
2
[root@bigdata data]# vi bigdata3/myid
3
# 在 zk/bin 目录下
zkServer.sh start zoo1.cfg
zkServer.sh start zoo2.cfg
zkServer.sh start zoo3.cfg
[root@bigdata zk]# jps
2320 Jps
2050 QuorumPeerMain
2008 QuorumPeerMain
1980 QuorumPeerMain
[root@bigdata zk]# bin/zkServer.sh status zoo1.cfg
ZooKeeper JMX enabled by default
Using config: /software/zk/bin/../conf/zoo1.cfg
Mode: follower
[root@bigdata zk]# bin/zkServer.sh status zoo2.cfg
ZooKeeper JMX enabled by default
Using config: /software/zk/bin/../conf/zoo2.cfg
Mode: leader
[root@bigdata zk]# bin/zkServer.sh status zoo3.cfg
ZooKeeper JMX enabled by default
Using config: /software/zk/bin/../conf/zoo3.cfg
Mode: follower
根据 zk 选举机制,一共 3 台,当第二台启动后就会根据 serverid 选举出 myid 大的作为 leader,myid 小的和第三台作为 follower。
图示:
# 将zookeeper解压后文件夹重命名为zk
mv zookeeper-3.4.10.tar.gz /software
tar -zxvf zookeeper-3.4.10.tar.gz
mv zookeeper-3.4.10 zk
export ZOOKEEPER_HOME=/software/zk
export PATH=.:$PATH:$ZOOKEEPER_HOME/bin
# 配置完source一下,使其生效:
source /etc/profile
cd /software/zk/conf
mv zoo_sample.cfg zoo.cfg
vi zoo.cfg
# 在 /software/zk/ 下创建zk的数据存放目录data,并配置到此
dataDir=/software/zk/data
# 在最后添加上以下内容,其中2888是通讯端口,3888是选举端口
server.0=hadoop0:2888:3888
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
mkdir /software/zk/data
cd /software/zk/data
vi myid
# 把 0 写到该文件的最上边,Hadoop1的就写1,Hadoop2的就写2
# 查看防火墙状态
systemctl status firewalld.service
# 停止防火墙命令
systemctl stop firewalld
# 开机禁止启动命令
systemctl disable firewalld
# 查看selinux状态,非 disabled 则需要禁用
sestatus
# 修改selinux配置文件
vi /etc/selinux/config
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 然后重启机器
reboot
分别在三台机器下启动
cd /software/zk/bin # 配置了zk的环境变量可以不切到该目录,在任意目录执行start都可以
zkServer.sh start
# 查看服务器的各个角色:
zkServer.sh status
有Follower、Leader等等
说明:
leader
不一定是在第一个节点上面,是由 Zookeeper 内部的选举机制产生的QuorumPeerMain
进程是 ZooKeeper 的进程名字在一个集群中,最少需要 3 台。或者保证 2N + 1 台,即奇数。为什么保证奇数?主要是为了举算法。
流程:开始投票 -> 节点状态变成 LOOKING -> 每个节点选自己-> 收到票进行 PK -> sid 大的获胜 -> 更新选票 -> 再次投票 -> 统计选票,选票过半数选举结果 -> 节点状态更新为自己的角色状态。
当Leader崩溃了,或者失去了大多数的Follower,这时候 Zookeeper 就进入恢复模式,恢复模式需要重新选举出一个新的Leader,让所有的Server都恢复到一个状态LOOKING 。Zookeeper 有两种选举算法:基于 basic paxos 实现和基于 fast paxos 实现。
Zookeeper 采用了递增的事务 id 来识别,所有的 proposal (提议)都在被提出的时候加上了zxid 。zxid 实际上是一个 64 位数字。高 32 位是 epoch 用来标识 Leader 是否发生了改变,如果有新的Leader 产生出来, epoch 会自增。低 32 位用来递增计数。当新产生的 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 Server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。
Leader 服务器会和每一个 Follower/Observer 服务器都建立 TCP 连接,同时为每个Follower/Observer 都创建一个叫做 LearnerHandler 的实体。LearnerHandler 主要负责 Leader 和Follower/Observer 之间的网络通讯,包括数据同步,请求转发和 proposal 提议的投票等。Leader 服务器保存了所有 Follower/Observer 的 LearnerHandler 。
参考文章:https://blog.csdn.net/weixin_45579026/article /details/131080333 https://blog.csdn.net/qq_52595134/ article/details/123467180