zookeeper专栏 | ||
---|---|---|
上一篇 | 主目录 | 下一篇 |
目录
【前言】
鉴于 ZooKeeper 本身的特点,服务器集群的节点数推荐设置为奇数台。这里我规划为四台( 一台作为observer),为别为 hadoop01,hadoop02,hadoop03,hadoop04(以后说道zookeeper集群时候指的是hadoop01,hadoop02,hadoop03,hadoop04这四台服务器,该集群有四个节点,分别为hadoop01,hadoop02,hadoop03,hadoop04)
整个zookeeper的集群的角色分为三种:
leader : 整个集群中的所有写数据请求都是由leader进行处理
follower : 能接收所有的读写请求,但是读数据请求自己处理,写数据请求转发给leader
observer : 跟follower的唯一的区别就是 没有 选举权 和 被选举权
observer其实跟follower类似, 只不过是为了给zookeeper进行扩充之使用。不会改变原来集群的主从所属关系仅仅只是接受请求,然后进行处理,没有投票的权利,也没有被选举成为leader的权利。
zookeeper集群的个数必须是奇数个的真正的原因: 要求参与选举的集群的节点个数必须是奇数个
1 获取安装包,解压
安装包地址
这里用的版本号:ZooKeeper-3.4.7.tar.gz
解压到/home/hadoop/apps/目录下
2 修改配置文件
进入安装目录的conf文件夹(/home/hadoop/apps/zookeeper-3.4.10/conf),将zoo_sample.cfg改名或复制一份zoo.cfg
- 将dataDir改为一个自定义的目录:
dataDir=/home/hadoop/zkdata
- 添加zk集群节点
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
#如果有第四台机器,并且想配置 observer
server.4=hadoop04:2888:3888:observer
配置参数解析:
tickTime 基本事件单元,以毫秒为单位。它用来控制心跳和超时,默认情况下最小的会话超时时间为两倍的 tickTime。
initLimit 此配置表示,允许 follower (相对于 leader 而言的“客户端”)连接并同步到 leader 的初始化连接时间,它以 tickTime 的倍数来表示。当超过设置倍数的 tickTime 时间,则连接失败。
syncLimit 此配置表示,leader 与 follower 之间发送消息,请求和应答时间长度。如果 follower 在设置的时间内不能与 leade进行通信,那么此 follower 将被丢弃。 dataDir 存储内存中数据库快照的位置 注意:如果需要保留日志信息,那么可以考虑配置
dataLogDir 的位置,这个位置就是日志的存储目录。通常情况下是分开存储的。并且应该谨慎地选择日志存放的位置,使用专 用的日志存储设备能够大大地提高系统的性能,如果将日志存储在比较繁忙的存储设备上,那么将会在很大程度上影响系统的性能。
clientPort 监听客户端连接的端口,默认是 2181,最好不要修改 最后再增加 ZooKeeper 的服务器列表信息,格式为:
server.id=主机名:心跳端口:选举端口 例子:server.1=hadoop01:2888:3888 其中 id虽然可以随便写,但是有两点要求,第一不能重复,第二范围是 1-255,并且对应服务器列表上还得存在对应的 id 文件,具体看下面操作
3 分发到hadoop02,hadoop03,hadoop04节点
[hadoop@hadoop01 apps]$ scp -r zookeeper-3.4.10/ hadoop@hadoop02:$PWD
[hadoop@hadoop01 apps]$ scp -r zookeeper-3.4.10/ hadoop@hadoop03:$PWD
[hadoop@hadoop01 apps]$ scp -r zookeeper-3.4.10/ hadoop@hadoop04:$PWD
4 配置环境变量
在hadoop01,hadoop02,hadoop03,hadoop04四台zk集群节点配置环境变量:
vim ~/.bashrc
#添加
export ZOOKEEPER_HOME=/home/hadoop/apps/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source ~/.bashrc
使其生效
5 创建文件myid
最重要的步骤,一定不能忘了。
去各个 ZooKeeper 服务器节点,新建目录dataDir=/home/hadoop/zkdata,这个目录就是你在 zoo.cfg 中配置的 dataDir 的目录,建好之后,在里面新建一个文件,文件名叫 myid,里面存放的内容就是服务器的 id,就是 server.1=hadoop01:2888:3888 当中的 id,就是 1,那么对应的每个服务器节点都应该做类似的操作。
拿服务器 hadoop01 举例:
6 启动
分别启动四台zk节点的进程
zkServer.sh start
#查看状态 zkServer.sh status
6.1 启动全新集群
【第一次启动时,没有历史数据】
为啥02是leader,01和03是follower?myid中数值大的优先,少数服从多数的原则
当前zk集群的3节点:hadoop01,hadoop02,hadoop03
当01、02、03按顺序启动时:
- 服务器01启动,此时只有它一台服务器启动了,没有满足投票超过半数(>=2)的条件,所以它的选举状态一直是LOOKING状态
- 服务器02启动,它与最开始启动的服务器01进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以id值较大的服务器02胜出,此时有2(01和02,满足>=2)台服务器选举了它,所以它成为了这次选举的leader.
- 服务器03启动,根据前面的分析,理论上服务器03应该是服务器01,02,03中最大的,但是由于前面已经有半数以上的服务器选举了服务器02,所以它只能接收当小弟的命了.
- 04没有选举权和被选举权
选举机制中的全新集群
- 如果将02stop,那么03成为leader。因为在myid文件中,3>1,01和03都选举03,且两票满足>=2的超过半数的条件。(再把02启起来,leader仍是03。leader还在就不用重新选举)
6.2 非全新集群启动
【不是第一次启动时,有历史数据】
选举机制中的非全新集群
(没有leader时,无法对外提供服务,使用zkServer.sh status无法查看角色状态)
1 如果按照01、02、03、04(是observer角色,无关,无选举权和被选举权)的顺序:
1)启动01: 没有leader,无法对外提供服务,looking状态
2)启动02: 此时还没有leader,进行选举。myid中02的2大于01的1,所以02节点胜出,得到两票,满足>=2的条件,成为leader。(能够对外提供服务,使用zkServer.sh status可以查看角色状态)
3)启动03; 已有leader,不再选举
4)启动04
#跟初始时一样
2 如果按照02、03、01、04(是observer角色,无关,无选举权和被选举权)的顺序:
1)启动02: 成为leader(为什么???)
2)启动03: 有了leader,不在选举
3)…
2 如果按照03、02、01、04(是observer角色,无关,无选举权和被选举权)的顺序:
1)启动03: 成为leader(为什么???)
2)启动02: 有了leader,不在选举
3)…
为什么非全新启动时,01先启动不能成为leader,02和03先启动就能成为leader???
7 停止
zkServer.sh stop