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

三、部署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选举
原文地址:https://www.cnblogs.com/L-dongf/p/10264832.html