zookeeper功能介绍与常用命令
zookeeper是一个观察者模式的分布式框架,负责存储和管理大家关心的数据(1M、节点)
然后接受观察者的注册,一旦数据发生状态变化,zookeeper会负责通知zookeeper上注册的观察者做出相应反映,从而实现集群中类似Master/slave管理模式
1)Zookeeper:一个领导者(leader),多个跟随者(follower)组成的集群。
3)Follower 用于接收客户请求并向客户端返回结果,在选举 Leader 过程中参与投票。
4)集群中只要有半数以上节点存活,Zookeeper 集群就能正常服务。
5)全局数据一致:每个 server 保存一份相同的数据副本,client 无论连接到哪个 server,数
6)更新请求顺序进行,来自同一个 client 的更新请求按其发送顺序依次执行。
8)实时性,在一定时间范围内,client 能读到最新数据。
每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过
提供的服务包括:统一命名服务,统一配置管理,统一集群管理,服务器节点动态上下线,软负载均衡
(2)通过MobaXterm.exe 工具拷贝 zookeeper 到 linux 系统下
[[email protected] software]$ chmod u+x zookeeper-3.4.10.tar.gz
[[email protected] software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
将/opt/module/zookeeper-3.4.10/conf 这个路径下的 zoo_sample.cfg 修改为 zoo.cfg;
dataDir=/opt/module/zookeeper-3.4.10/zkData
在/opt/module/zookeeper-3.4.10/这个目录上创建 zkData 文件夹
[[email protected] zookeeper-3.4.10]$ mkdir zkData
[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh start
[[email protected] zookeeper-3.4.10]$ jps
[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
[[email protected] zookeeper-3.4.10]$ bin/zkCli.sh
[zk: localhost:2181(CONNECTED) 0] quit
[[email protected] zookeeper-3.4.10]$ bin/zkServer.sh stop
1)tickTime=2000:通信心跳数,Zookeeper服务器心跳时间,单位毫秒Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最时时间是2*tickTime)
2)initLimit=10:Leader和Follower初始通信时限
集群中的follower跟随者服务器与leader领导者服务器之间初始连接时能容忍的最多心
跳数(tickTime的数量),用它来限定集群中的Zookeeper服务器连接到Leader的时限。
Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的
Leader允许Follower在initLimit时间内完成这个工作。
3)syncLimit=5:Leader 和 Follower 同步通信时限
集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,
Leader认为Follwer死掉,从服务器列表中删除Follwer。
在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机
如果L发出心跳包在syncLimit之后,还没有从F那收到响应,那么就认为这个F已经不在
保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据
1)半数机制(Paxos 协议):集群中半数以上机器存活,集群可用。所以 zookeeper
2)Zookeeper 虽然在配置文件中并没有指定 master 和 slave。但是,zookeeper 工作时,是有一个节点为 leader,其他则为 follower,Leader 是通过内部的选举机制临时产生的。
3)以一个简单的例子来说明整个选举的过程。假设有五台服务器组成的 zookeeper 集群,它们的 id 从 1-5,同时它们都是最新启动。
(1)服务器 1 启动,此时只有它一台服务器启动了,它发出去的报没有任何响应,所
(2)服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,
由于两者都没有历史数据,所以 id 值较大的服务器 2 胜出,但是由于没有达到超过半数以
上的服务器都同意选举它(这个例子中的半数以上是 3),所以服务器 1、2 还是继续保持
(3)服务器 3 启动,根据前面的理论分析,服务器 3 成为服务器 1、2、3 中的老大,
而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的 leader。
(4)服务器 4 启动,根据前面的分析,理论上服务器 4 应该是服务器 1、2、3、4 中最
大的,但是由于前面已经有半数以上的服务器选举了服务器 3,所以它只能接收当小弟的命
短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除
持久(persistent):客户端和服务器端断开连接后,创建的节点不删除
2)Znode 有四种形式的目录节点(默认是 persistent )
(2)持久化顺序编号目录节点(PERSISTENT_SEQUENTIAL)
客户端与 zookeeper 断开连接后,该节点依旧存在,只是 Zookeeper 给该节点名称
(4)临时顺序编号目录节点(EPHEMERAL_SEQUENTIAL)
客户端与 zookeeper 断开连接后,该节点被删除,只是 Zookeeper 给该节点名称进
3)创建 znode 时设置顺序标识,znode 名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护4)在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的
在 hadoop102、hadoop103 和 hadoop104 三个节点上部署 Zookeeper。
(1)解压 zookeeper 安装包到/opt/module/目录下
[[email protected] software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(2)在/opt/module/zookeeper-3.4.10/这个目录下创建 zkData
(3)重命名/opt/module/zookeeper-3.4.10/conf 这个目录下的 zoo_sample.cfg 为 zoo.cfg
dataDir=/opt/module/zookeeper-3.4.10/zkData
#######################cluster##########################
C 是这个服务器与集群中的 Leader 服务器交换信息的端口;
D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的
Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
集群模式下配置一个文件myid,这个文件在dataDir 目录下,这个文件里面有一个数据
就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比
(1)在/opt/module/zookeeper-3.4.10/zkData 目录下创建一个 myid 的文件
添加 myid 文件,注意一定要在 linux 里面创建,在 notepad++里面很可能乱码
scp -r zookeeper-3.4.10/ [email protected]:/opt/app/
scp -r zookeeper-3.4.10/ [email protected]:/opt/app/
[[email protected] zookeeper-3.4.10]# bin/zkServer.sh start
[[email protected] zookeeper-3.4.10]# bin/zkServer.sh start
[[email protected] zookeeper-3.4.10]# bin/zkServer.sh start
[[email protected] zookeeper-3.4.10]# bin/zkServer.sh status
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
[[email protected] zookeeper-3.4.10]# bin/zkServer.sh status
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
[[email protected] zookeeper-3.4.5]# bin/zkServer.sh status
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
在/usr/local/bin 目录下创建 xsync 文件,向里面添加:
pdir=`cd -P $(dirname $p1); pwd`
for((host=01; host<=03; host++)); do
echo $pdir/$fname [email protected]$host:$pdir
echo ==================slave$host==================
#Note:这里的slave对应自己主机名,需要做相应修改。另外,for循环中的host的边界值由自己的主机编号决定。
使用xsync filename就能将filename分发到集群中的各个节点中。
格式化的时候 两个的fsimage一致, nna 上边有edits操作,nnsb作用跟snn作用类似。如果nna宕机,journal里的数据+nnsb的数据编译成新的文件,可以快速恢namenode的作用。
Q-journal 分布式日志管理系统 基于zookeeper开发
数据同步策略与zookeeper相同,paxos算法做数据一致性同步 。
zkfc 基于zoopeeker的failover controller 控制发生故障状态的控制器,负责不断监控namenode的状态,不断发请求。一个机子上一个zkfc。他们两个会通过zoopeeker上记录信息告诉那个是nna记录状态。如果nna出故障,zkfc1发送消息个另外一个机子上的zkfc2, (jvm线程过多,gc无法同步回收,会暂停进程)如果出现2个namenode叫split sbain 脑裂,处理方法:1,ssh kill掉一个namenode。(有时候是网路问题,kill 不死)2,shell脚本,(利用用户提供的脚本方法处理,关闭nn网络)控制sandbynamenode作为active。
6.2 Yarn单点故障问题
yarn中没有什么job的状态继承可言。一个resourcesmanager不行,就多设计几个。都需要给zookeeper进行监听注册。
datanode nodemanager zookeeper journalnode
datanode nodemanager zookeeper journalnode