Zookeeper
一、相关概念
- 分布式系统:是一个硬件或软件组件分布在网络中的不同的计算机上,彼此间仅通过消息传递进行通信和协作的系统。
- 特征:分布性、并发性、缺乏全局时钟、故障必然会发生
- 典型问题:通信异常、网络分区、三态(成功、失败、超时)、节点故障
CAP:
- P:分区容错性;
- CP:一致性;
- AP:可用性
BASE:
- BA:基本可用
- S:软状态
- E:最终一致性
保证分布式系统的一致性多种协议:
- 2PC:2 Phase-Commit,请求和执行
- 3PC:3 Phase-Commit,CanCommit->PreCommit->DoCommit
- Paxos:Leslie Lamport,1990年提出
- Google Chubby:分布式锁服务,GFS/BigTable都用到了chubby,分布式协作、元数据存储、Master选举
HDFS/HBase, Zookeeper:
- zookeeper是一个开源的分布式协调服务,由知名互联网公司Yahoo创建,它是Chubby的开源实现;换句话将,zk是一个经典的分布式数据一致性解决方案,分布式应用程序可以基于它实现数据的发布/订阅、负载均衡、名称服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列
二、zk中的基本术语
- 集群角色:Leader, Follower, Oberserver
- Leader:选举产生,提供读/写服务;
- Follower:参与选举,可被选举,提供读服务;
- Observer:参与选举,不可被选举,提供读服务
- 会话:zk中,客户端<-->服务端,tcp长连接
- 数据节点(ZNode):即zk数据模型中的数据单元;zk的数据都存储于内存中,数据模型为树状结构(ZNode Tree);每个ZNode都会保存自己的数据于内存中;
- 持久节点:仅显式删除才消失
- 临时节点:会话中止即自动消失
- 版本(version):zk会为每个ZNode维护一个称为Stat的数据结构,记录了当前ZNode的三个数据版本
- version:当前版本
- cversion:当前ZNode的子节点的版本
- aversion:当前ZNode的ACL的版本
- ACL:zk使用ACL机制进行权限控制
- CREATE , READ , WRITE, ADMIN
- 事件监听器(Watcher):zk上由用户指定的触发机制,在某些事件产生时,zk能够将其通知给相关的客户端
- ZAB协议:Zookeeper Atomic Boradcast, zk原子广播协议;用于在支持Leader奔溃恢复机制,重新选举Leader,而且还确保数据的完整性和一致性
- ZAB协议中存在三种状态:
- Looking
- Following
- Leading
- 四个阶段:
- 选举:election
- 发现:discovery
- 同步:sync
- 广播:broadcast
- ZAB协议中存在三种状态:
三、部署zookeeper
三种部署方式:单机模式、伪分布式模式、分布式模式
安装jdk
# yum install java-1.7.0-openjdk-devel -y
# vim /etc/profile.d/java.sh
export JAVA_HOME=/usr
# . /etc/profile.d/java.sh
# java -version
1、单机模式
~]# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
~]# mkdir /data/zookeeper/ -pv
~]# tar xf zookeeper-3.4.9.tar.gz -C /usr/local/
~]# cd /usr/local/
local]# ln -sv zookeeper-3.4.9 zookeeper
local]# cd zookeeper/conf/
conf]# cp zoo_sample.cfg zoo.cfg
conf]# vim zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
#maxClientCnxns=60
server.1=192.168.0.17:2888:3888
#autopurge.snapRetainCount=3
#autopurge.purgeInterval=1
conf]# cd ../bin/
bin]# ./zkServer.sh start
- 四字命令:监控zk
~]# telnet localhost 2181
ruok
stat
srvr
conf
cons
wchs
envi
...
- cli命令
~]# cd /usr/local/zookeeper/bin/
bin]# ./zkCli.sh
create
ls
ls2
stat
delete
rmr
get
set
...
- 配置参数
基本配置参数:
clinetPort=2181
dataDir=/data/zookeeper
dataLogDir:事务日志文件路径;
tickTime
存储配置参数:
preAllocSize:为事务日志预先分配的磁盘空间量,默认65535KB
snapCount:每多少次事务后执行一次快照操作,每事务的平均大小在100字节左右
autopurge.snpRetainCount:保留自动快照数
autopurge.purgeInterval:自动purge操作的时间间隔,0表示不启动
fsync.warningthiresholdms:zk进行事务日志的fsync操作时消耗的时长报警阈值
weight.X=N:判断quorum时投票权重,默认为1
网络配置参数:
maxClientCnxns:每客户端IP的最大并发连接数
clientPortAddress:zk监听的IP地址
minSessionTimeout:会话的最短超时时长
maxSessionTimeout:会话的最大超时时长
集群配置参数:
initLimit:Follower连入Leader并完成数据同步的时长
syncLimit:心跳检测的最大延迟
leaderServers:默认zk的leader接受读写请求,额外还要负责协调各Follower发来的事务等,因此,为使得Leader集中处理zk集群内部信息,建议不让Leader直接提供服务
cnxTimeout:Leader选举期间,各服务器创建TCP连接的超时时长
ellectionAlg:选举算法,目前仅支持FastLeaderElection算法一种
server.id=[hostname]:port:port[:observer]:集群内各服务器的属性参数
第一个port:follwer与leader进行通信和数据同步时所使用的端口
第二个port:leader选举时使用的端口
observer:定义指定的服务器为observer
2、分布式模式
- zk1:
###############node01:###############
~]# echo 1 > /data/zookeeper/myid
~]# vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=192.168.0.17:2888:3888
server.2=192.168.0.18:2888:3888
server.3=192.168.0.19:2888:3888
~]# /usr/local/zookeeper/bin/zkServer.sh start
- zk2:
###############node02:###############
~]# echo 2 > /data/zookeeper/myid
~]# vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=192.168.0.17:2888:3888
server.2=192.168.0.18:2888:3888
server.3=192.168.0.19:2888:3888
~]# /usr/local/zookeeper/bin/zkServer.sh start
- zk3:
###############node03:###############
~]# echo 3 > /data/zookeeper/myid
~]# vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper
clientPort=2181
server.1=192.168.0.17:2888:3888
server.2=192.168.0.18:2888:3888
server.3=192.168.0.19:2888:3888
~]# /usr/local/zookeeper/bin/zkServer.sh start
注意:运行为集群模式时,每个节点在其数据目录中应该有一个myid文件,其内容仅为server的id
四、典型应用场景
- 数据发布/订阅
- 负载均衡
- 命名服务
- 分布式协调/通知
- 集群管理
- Master选举