ZooKeeper单机/集群部署

一、单机部署

1.1 配置java环境

官方依赖介绍:https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html

root@zookeeper:~# apt list openjdk*
root@zookeeper:~# apt install openjdk-8-jdk -y
root@zookeeper:~# java -version

1.2 部署ZooKeeper

官网下载地址:https://archive.apache.org/dist/zookeeper/

root@zookeeper:~# cd /usr/local/src/
root@zookeeper:/usr/local/src# tar xf apache-zookeeper-3.6.3-bin.tar.gz -C /etc/
root@zookeeper:/usr/local/src# cd /etc/apache-zookeeper-3.6.3-bin/
root@zookeeper:/etc/apache-zookeeper-3.6.3-bin# ln -sv /etc/apache-zookeeper-3.6.3-bin /etc/zookeeper
root@zookeeper:/etc/apache-zookeeper-3.6.3-bin# cd /etc/zookeeper
root@zookeeper:/etc/zookeeper# ll
root@zookeeper:/etc/zookeeper# cd /etc/zookeeper/conf/
root@zookeeper:/etc/zookeeper/conf# cp zoo_sample.cfg zoo.cfg
root@zookeeper:/etc/zookeeper/conf# grep '^[a-Z]' zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPort=2181

root@zookeeper:/etc/zookeeper/conf# /etc/zookeeper/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

1.3 验证

root@zookeeper:~# ps aux|grep zookeeper
root@zookeeper:~# /etc/zookeeper/bin/zkServer.sh status

二、集群部署

2.1 集群介绍

ZooKeeper集群用于解决单点和单机性能及数据高可用等问题。

2.2 集群结构

在这里插入图片描述

2.3 集群角色

  • 领导者
  • 学习者(跟随者、观察者)
  • 客户端

2.4 集群部署

zookeeper集群特性:整个集群中只要有超过集群数量一半的zookeeper工作是正常的,那么整个集群对外就是可用的,假如有2台服务器做了一个zookeeper集群,只要有任何一台故障或宕机,那么这个zookeeper集群就不可用了,因为剩下的一台没有超过集群一半的数量,但是假如有三台zookee per组成一个集群,那么损坏一台就还剩两台,大于3台的一半,所以损坏一台还是可以正常运行的,但是再损坏一台就只剩一台集群就不可用了。

那么要是4台组成一个zookeeper集群,损坏一台集群肯定是正常的,那么损坏两台就还剩两台,那么2台不大于集群数量的一半,所以3台的zookeeper集群和4台的zookeeper集群损坏两台的结果都是集群不可用,以此类推5台和6台以及7台和8台都是同理,所以这也就是为什么集群一般都是奇数的原因。

2.4.1 配置zookeeper集群

各zookeeper服务器都配置java环境并部署zookeeper集群

服务器环境

zk-node1:10.0.0.101
zk-node2:10.0.0.102
zk-node3:10.0.0.103
2.4.1.1 zk节点1部署过程

官方文档:https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html

# 配置java环境
root@zookeeper:~# apt list openjdk*
root@zookeeper:~# apt install openjdk-8-jdk -y
root@zookeeper:~# java -version

官网下载地址:https://archive.apache.org/dist/zookeeper/

root@zk-node1:~# cd /usr/local/src/
root@zk-node1:/usr/local/src# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
root@zk-node1:/usr/local/src# tar xf apache-zookeeper-3.6.3-bin.tar.gz -C /etc/
root@zk-node1:/usr/local/src# ln -sv /etc/apache-zookeeper-3.6.3-bin /etc/zookeeper
root@zk-node1:/usr/local/src# cd /etc/zookeeper/conf/
root@zk-node1:/etc/zookeeper/conf# cp zoo_sample.cfg zoo.cfg
root@zk-node1:/etc/zookeeper/conf# grep '^[a-Z]'  zoo.cfg
tickTime=2000            # 服务器之间的单词心跳检测时间间隔,单位为ms
initLimit=10             # 集群中leader和follower服务器初始连接心跳次数,即多少个2000ms
syncLimit=5              # leader与follower之间连接完成之后,后期检测发送和应答的心跳次数
dataDir=/data/zookeeper  # 自定义的zookeeper保存数据的目录 
clientPort=2181          # 客户端连接zookeeper的端口
maxClientCnxns=4096       # 单个客户端IP可以和zookeeper保持的连接数
autopurge.snapRetainCount=128    # 3.4.0中的新增功能,启动后,自动清除功能会将autopurge.snapRetainCount最新快照和相应的事务日志分别保留在dataDir和dataLogDir中,并删除其余部分,默认值为3,最小值为3
autopurge.purgeInterval=1      # 3.4.0及之后版本,ZK提供了自动清理日志和快照文件的功能,此参数指定清理频率,单位1小时,默认是0,不开启
server.1=10.0.0.61:2888:3888   # server.服务器编号=服务器IP:LF数据同步端口:LF选举端口
server.2=10.0.0.62:2888:3888   
server.3=10.0.0.63:2888:3888    

root@zk-node1:~# mkdir -p /data/zookeeper
root@zk-node1:~# echo 1 > /data/zookeeper/myid

root@zk-node1:~# scp /etc/zookeeper/conf/zoo.cfg 10.0.0.62:/etc/zookeeper/conf/zoo.cfg   
root@zk-node1:~# scp /etc/zookeeper/conf/zoo.cfg 10.0.0.63:/etc/zookeeper/conf/zoo.cfg
2.4.1.2 zk节点2部署过程
# 配置java环境
root@zk-node2:~# apt list openjdk*
root@zk-node2:~# apt install openjdk-8-jdk -y
root@zk-node2:~# java -version
root@zk-node2:~# cd /usr/local/src/
root@zk-node2:/usr/local/src# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
root@zk-node2:/usr/local/src# tar xf apache-zookeeper-3.6.3-bin.tar.gz -C /etc/
root@zk-node2:/usr/local/src# ln -sv /etc/apache-zookeeper-3.6.3-bin /etc/zookeeper
root@zk-node2:/usr/local/src# cd /etc/zookeeper/conf/
root@zk-node2:/etc/zookeeper/conf# cp zoo_sample.cfg zoo.cfg
root@zk-node2:/etc/zookeeper/conf# grep '^[a-Z]'  zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=4096
autopurge.snapRetainCount=128
autopurge.purgeInterval=1
server.1=10.0.0.61:2888:3888
server.2=10.0.0.62:2888:3888
server.3=10.0.0.63:2888:3888

root@zk-node1:~# mkdir -p /data/zookeeper
root@zk-node1:~# echo 2 > /data/zookeeper/myid
2.4.1.3 zk节点3部署过程
# 配置java环境
root@zk-node3:~# apt list openjdk*
root@zk-node3:~# apt install openjdk-8-jdk -y
root@zk-node3:~# java -version
root@zk-node3:~# cd /usr/local/src/
root@zk-node3:/usr/local/src# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz
root@zk-node3:/usr/local/src# tar xf apache-zookeeper-3.6.3-bin.tar.gz -C /etc/
root@zk-node3:/usr/local/src# ln -sv /etc/apache-zookeeper-3.6.3-bin /etc/zookeeper
root@zk-node3:/usr/local/src# cd /etc/zookeeper/conf/
root@zk-node3:/etc/zookeeper/conf# cp zoo_sample.cfg zoo.cfg
root@zk-node3:/etc/zookeeper/conf# grep '^[a-Z]'  zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
maxClientCnxns=4096
autopurge.snapRetainCount=128
autopurge.purgeInterval=1
server.1=10.0.0.61:2888:3888
server.2=10.0.0.62:2888:3888
server.3=10.0.0.63:2888:3888

root@zk-node1:~# mkdir -p /data/zookeeper
root@zk-node1:~# echo 3 > /data/zookeeper/myid

2.4.2 各服务器启动zookeeper

2.4.2.1 zk节点1启动zookeeper
root@zk-node1:~# /etc/zookeeper/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2.4.2.2 zk节点2启动zookeeper
root@zk-node2:~# /etc/zookeeper/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
2.4.2.3 zk节点3启动zookeeper
root@zk-node3:~# /etc/zookeeper/bin/zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

2.4.3 验证zookeeper集群状态

2.4.3.1 zk节点1验证zookeeper
root@zk-node1:~# /etc/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower
2.4.3.2 zk节点2验证zookeeper
root@zk-node2:~# /etc/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: leader
2.4.3.3 zk节点3验证zookeeper
root@zk-node3:~# /etc/zookeeper/bin/zkServer.sh status
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost. Client SSL: false.
Mode: follower

2.4.4 zookeeper集群选举过程

2.4.4.1 节点角色状态
LOOKING:寻找leader状态,处于该状态需要进入选举过程
LEADING:领导者状态,处于该状态的节点说明角色已经是leader
FOLLOWING:跟随者状态,表明leader已经选举出来,当前节点角色是follower
OBSERVER:观察者状态,表明当前节点角色是observer
2.4.4.2 选举ID
zxid(zookeeper transaction id):每个改变zookeeper状态的操作都会形成一个对应的zxid
myid:服务器的唯一标识,通过配置myid文件指定,集群中唯一
2.4.4.3 leader选举过程

当集群中的zookeeper节点启动以后,会根据配置文件中指定的zookeeper节点地址进行leader选择操作,过程如下:

1.每个zookeeper都会发出投票,由于是第一次选举leader,因此每个节点都会把自己当做leader角色进行选举,每个zookeeper的投票中都会包含自己的myid和zxid,此时zookeeper1的投票为myid为1,初始zxid有一个初始值,后期会随着数据更新而自动变化,zookeeper2的投票为myid为2,初始zxid为初始生成的值。

2.每个节点接受并检查对方的投票信息,比如投票时间、是否状态为LOOKING状态的投票

3.对比投票,优先检查zxid,如果zxid不一样则zxid大的为leader,如果zxid相同则继续对比myid,myid大的一方为leader

成为Leader的必要条件:Leader要具有最高的zxid;当集群的规模是n时,集群中大多数的机器(至少n/2+1)得到响应并follow选出的Leader.
心跳机制:Leader与Follower利用PING来感知对方的是否存活,当Leader无法响应PING时,将重新发起Leader选举。

请不要以此视为定论,这只是我的个人经验

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑疯雷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值