Zookeeper02之集群环境搭建
在上文的基础上本文来介绍下zookeeper的集群搭建。准备环境如果不清楚的可以参考上文:
Zookeeper集群搭建
1.获取安装文件并解压
官网地址:http://zookeeper.apache.org/
下载地址:http://mirror.bit.edu.cn/apache/zookeeper/
Linux下载命令:
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
- 1
解压缩安装文件
tar -zxvf zookeeper-3.4.10.tar.gz
- 1
目录结构说明
cd命令进入解压文件夹
目录 | 说明 |
---|---|
bin | 存放的可执行文件 ,使用命令都在bin目录下面 |
conf | 存放的配置文件 |
contrib | 存放扩展包 |
dist-maven | Mvn编译后的目录 |
docs | 存放文档 |
lib | 存放jar包Zookeeper是使用Java开发的,会用到很多jar包都存放在lib目录下 |
recipes | 案例demo代码 |
src | 存放的是源代码 |
2.配置zoo.cfg文件
从上面的目录结构我们指定配置文件保存在conf目录下,所以我们cd到conf目录下
[root@hadoop-node01 zookeeper-3.4.10]# cd conf
[root@hadoop-node01 conf]# ll
总用量 12
-rw-rw-r--. 1 1001 1001 535 3月 23 2017 configuration.xsl
-rw-rw-r--. 1 1001 1001 2161 3月 23 2017 log4j.properties
-rw-rw-r--. 1 1001 1001 922 3月 23 2017 zoo_sample.cfg
[root@hadoop-node01 conf]#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
1.将zoo_sample.cfg重命名为zoo.cfg
[root@hadoop-node01 conf]# mv zoo_sample.cfg zoo.cfg
[root@hadoop-node01 conf]# ll
总用量 12
-rw-rw-r--. 1 1001 1001 535 3月 23 2017 configuration.xsl
-rw-rw-r--. 1 1001 1001 2161 3月 23 2017 log4j.properties
-rw-rw-r--. 1 1001 1001 922 3月 23 2017 zoo.cfg
[root@hadoop-node01 conf]#
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2.修改zoo.cfg配置文件
修改的地方有两处:
- 修改zookeeper存储数据的位置
- 添加集群节点信息
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/root/app/zookeeper-3.4.10/zkData
dataLogDir=/root/app/zookeeper-3.4.10/zkLog
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=hadoop-node01:2888:3888
server.2=hadoop-node02:2888:3888
server.3=hadoop-node03:2888:3888
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
配置说明
配置项 | 说明 |
---|---|
tickTime=2000 | zookeeper里面最小的时间单位为2000ms |
initLimit=10 | Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit 时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了 |
syncLimit=5 | 在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题 |
dataDir | 存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能 |
dataLogDir | 事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能 |
clientPort | 客户端连接server的端口,即对外服务端口 ,默认是2181 |
server.1 | 配置集群节点 hadoop-node01:2888:3888 主机名, 心跳端口、数据端口 的格式 |
3.myid配置
在 zookeeper的数据的存储目录中创建 myid文件,本文既是zkData目录下,这个myid中的内容只有一行信息,即表示我们集群节点的标示,范围在1~255之间。每个节点中的myid的数字和我们在zoo.cfg中的server.数字=host…对应,
创建这块Data目录:
mkdir zkData
- 1
创建myid并设置值为1(hadoop-node01节点)
[root@hadoop-node01 zookeeper-3.4.10]# echo 1 > zkData/myid
[root@hadoop-node01 zookeeper-3.4.10]# cat zkData/myid
1
- 1
- 2
- 3
4.分发安装文件
将我们hadoop-node01上安装配置的环境分发到hadoop-node02和hadoop-node03两个节点相同的目录下:
scp -r zookeeper-3.4.10 hadoop-node02:`pwd`
scp -r zookeeper-3.4.10 hadoop-node03:`pwd`
- 1
- 2
确认分发成功后分别修改hadoop-node02和hadoop-node03上的myid的值分别为2,3
5.启动
分别在三个节点的zookeeper的安装根目录下执行如下启动命令:
./bin/zkServer.sh start
- 1
查看状态,分别在每个节点上执行
./bin/zkServer.sh status
- 1
hadoop-node01
hadoop-node02
hadoop-node03
说明启动成功
6.测试
我们将zookeeper集群节点半数存活即可用,我们现在是3个节点,那么我们kill掉一个节点应该还可以继续使用,kill掉两个就不能够使用了。所以我们来测试下
查看zookeeper进程编号
通过jps命令即可查看
[root@hadoop-node02 zookeeper-3.4.10]# jps
1559 QuorumPeerMain #这个是zookeeper的服务
1646 Jps
- 1
- 2
- 3
kill 掉这个节点,也就是leader节点
[root@hadoop-node02 zookeeper-3.4.10]# jps
1559 QuorumPeerMain
1646 Jps
[root@hadoop-node02 zookeeper-3.4.10]# kill -9 1559
[root@hadoop-node02 zookeeper-3.4.10]# jps
1668 Jps
- 1
- 2
- 3
- 4
- 5
- 6
再次查看另外两个节点情况
hadoop-node01
hadoop-node03
hadoop-node03变成了leader节点了。
再次将leader节点kill掉
再次将leader节点kill掉,也就是将3个集群节点中的两个kill掉后发现集群不可用了。
[root@hadoop-node03 zookeeper-3.4.10]# jps
1237 QuorumPeerMain
1325 Jps
[root@hadoop-node03 zookeeper-3.4.10]# kill -9 1237
[root@hadoop-node03 zookeeper-3.4.10]#
- 1
- 2
- 3
- 4
- 5
查看hadoop-node01
Zookeeper的选举机制
为什么要进行Leader选举?
Leader 主要作用是保证分布式数据一致性,即每个节点的存储的数据同步。遇到以下两种情况需要进行Leader选举
- 服务器初始化启动
- 服务器运行期间无法和Leader保持连接,Leader节点崩溃,逻辑时钟崩溃。
1.服务器初始化时Leader选举
zookeeper由于其自身的性质,一般建议选取奇数个节点进行搭建分布式服务器集群。以3个节点组成的服务器集群为例,说明服务器初始化时的选举过程。启动第一台安装zookeeper的节点时,无法单独进行选举,启动第二台时,两节点之间进行通信,开始选举Leader。
1)每个Server投出一票。他们两都选自己为Leader,投票的内容为(SID,ZXID)。
SID即Server的id,安装zookeeper时配置文件中所配置的myid;ZXID,事务id,
为节点的更新程度,ZXID越大,代表Server对Znode的操作越新。由于服务器初始化,
每个Sever上的Znode为0,所以Server1投的票为(1,0),Server2为(2,0)。
两Server将各自投票发给集群中其他机器。
2)每个Server接收来自其他Server的投票。集群中的每个Server先判断投票有效性,
如检查是不是本轮的投票,是不是来Looking状态的服务器投的票。
3)对投票结果进行处理。先了解下处理规则
- 首先对比ZXID。ZXID大的服务器优先作为Leader
- 若ZXID相同,比如初始化的时候,每个Server的ZXID都为0,
- 就会比较myid,myid大的选出来做Leader。
对于Server而言,他接受到的投票为(2,0),因为自身的票为(1,0),所以此时它会选举Server2为Leader,
将自己的更新为(2,0)。而Server2收到的投票为Server1的(1,0)由于比他自己小,
Server2的投票不变。Server1和Server2再次将票投出,投出的票都为(2,0)。
4) 统计投票。每次投票之后,服务器都会统计投票信息,如果判定某个Server有过半的票数投它,
那么该Server将会作为Leader。对于Server1和Server2而言,统计出已经有两台机器接收了(2,0)的投票信息,
此时认为选出了Leader。
5)改变服务器状态。当确定了Leader之后,每个Server更新自己的状态,
Leader将状态更新为Leading,Follower将状态更新为Following。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
2.服务器运行期间的Leader选举
zookeeper运行期间,如果有新的Server加入,或者非Leader的Server宕机,那么Leader将会同步数据到新Server或者寻找其他备用Server替代宕机的Server。若Leader宕机,此时集群暂停对外服务,开始在内部选举新的Leader。假设当前集群中有Server1、Server2、Server3三台服务器,Server2为当前集群的Leader,由于意外情况,Server2宕机了,便开始进入选举状态。过程如下
1) 变更状态。其他的非Observer服务器将自己的状态改变为Looking,开始进入Leader选举。
2) 每个Server发出一个投票(myid,ZXID),由于此集群已经运行过,所以每个Server上的ZXID可能不同。
假设Server1的ZXID为145,Server3的为122,第一轮投票中,Server1和Server3都投自己,
票分别为(1,145)、(3,122),将自己的票发送给集群中所有机器。
3) 每个Server接收接收来自其他Server的投票,接下来的步骤与初始化时相同。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。
原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/87924077
- 点赞
- 收藏
- 关注作者
评论(0)