zookeeper

ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现。分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、配置维护,名字服务、分布式同步、分布式锁和分布式队列等功能。

特征
1、我们可以把Zookeeper理解为一个精简的文件系统(和Linux文件系统结构非常相似),其每一个节点称为znode,znode下可以存放子节点,也可以直接对节点进行赋值存值。
2、Zookeeper被应用与一些集群上,提高集群的高可用。它可以帮助你避免单点故障,使你的系统更加可靠。
3、Zookeeper的集群我们可以通俗的理解为,一个有Leader的团队,团队中各个成员的数据都是一致的。团队中的Leader采用选举算法推举,所以可以保证在Leader出现问题的时候,又会选举出新的Leader。(fast paxos 选举算法大家可以深入了解下)
4、Zookeeper使用路径来描述节点,节点可以被看做是一个目录,也可以被看做是一个文件,它同时具有两者的特点。
5、Zookeeper的Watch机制也是它的最大被应用的原因。当我们有很多客户端连接到Zookeeper时,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,通知它们。所以我们经常用它来做业务系统的统一配置管理。使用zk的Watch要特别注意一点就是它的“一次性触发器”(最后的Java例子中有模拟这点)。


ZooKeeper中有三种角色: Leader,Follower、Observer
一个 ZooKeeper 集群同一时刻只会有一个 Leader,其他都是 Follower 或 Observer。
ZooKeeper 配置很简单,每个节点的配置文件(zoo.cfg)都是一样的,只有 myid 文件不一样。myid 的值必须是 zoo.cfg中server.{数值} 的{数值}部分。

节点读写服务分工:
1.ZooKeeper 集群的所有机器通过一个 Leader 选举过程来选定一台被称为『Leader』的机器,Leader服务器为客户端提供读和写服务。
2.Follower 和 Observer 都能提供读服务,不能提供写服务。两者唯一的区别在于,Observer机器不参与 Leader 选举过程,也不参与写操作的『过半写成功』策略,因此 Observer 可以在不影响写性能的情况下提升集群的读性能。

Session
Session 是指客户端会话,在讲解客户端会话之前,我们先来了解下客户端连接。在ZooKeeper 中,一个客户端连接是指客户端和 ZooKeeper 服务器之间的TCP长连接。

ZooKeeper 对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测和服务器保持有效的会话,也能够向 ZooKeeper 服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的 Watch 事件通知。

Session的SessionTimeout 值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在 SessionTimeout 规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话
仍然有效.

事物操作
在ZooKeeper中,能改变ZooKeeper服务器状态的操作称为事务操作。一般包括数据节点创建与删除、数据内容更新和客户端会话创建与失效等操作。对应每一个事务请求,ZooKeeper都会为其分配一个全局唯一的事务ID,用 ZXID 表示,通常是一个64位的数字。每一个 ZXID对应一次更新操作,从这些 ZXID 中可以间接地识别出 ZooKeeper 处理这些事务操作请求的全局顺序。

状态信息
每个节点除了存储数据内容之外,还存储了 节点本身的一些状态信息。用 get 命令可以同时获得某个 节点的内容和状态信息在 ZooKeeper 中,version 属性是用来实现乐观锁机制中的『写入校验』的(保证分布式数据原子性操作)。

Master选举
Master 选举可以说是 ZooKeeper 最典型的应用场景了。比如 HDFS 中 Active NameNode 的选举、YARN 中 Active ResourceManager 的选举和 HBase 中 Active HMaster 的选举等。

 

Zookeeper下载
http://ftp.cuhk.edu.hk/pub/packages/apache.org/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz

这里配置3台电脑
hadoop@muhe221:~/soft$ tar -zxvf zookeeper-3.4.13.tar.gz
hadoop@muhe221:~/soft/zookeeper-3.4.13/conf$ cp zoo_sample.cfg zoo.cfg

修改zoo.cfg

# 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=/home/hadoop/soft/zookeeper-3.4.13/data
# the port at which the clients will connect
clientPort=2181

server.0=muhe221:2888:3888
server.1=caoming:2888:3888
server.2=muhe222:2888:3888

其中0,1,2是独立的编号,2888是集群通信端口,3888选主端口

hadoop@muhe221:~/soft/zookeeper-3.4.13$ mkdir data
hadoop@muhe221:~/soft/zookeeper-3.4.13/data$ vi myid
0

三台电脑中myid依次为对应的id:0, 1, 2

到此配置完毕

启动zookeeper

hadoop@muhe221:~/soft/zookeeper-3.4.13/bin$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

hadoop@caoming:~/soft/zookeeper-3.4.13/bin$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

hadoop@muhe222:~/soft/zookeeper-3.4.13/bin$ ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.13/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

 查看状态:

hadoop@muhe221:~/soft/zookeeper-3.4.13/bin$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: follower

hadoop@caoming:~/soft/zookeeper-3.4.13/bin$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: leader

hadoop@muhe222:~/soft/zookeeper-3.4.13/bin$ ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/hadoop/soft/zookeeper-3.4.13/bin/../conf/zoo.cfg
Mode: follower

 

hadoop@muhe222:~/soft/zookeeper-3.4.13/bin$ ./zkCli.sh -server 10.121.63.208:2181
Connecting to 10.121.63.208:2181
2019-03-06 22:43:21,474 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
.....................
WatchedEvent state:SyncConnected type:None path:null
[zk: 10.121.63.208:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
        stat path [watch]
        set path data [version]
        ls path [watch]
        delquota [-n|-b] path
        ls2 path [watch]
        setAcl path acl
        setquota -n|-b val path
        history
        redo cmdno
        printwatches on|off
        delete path [version]
        sync path
        listquota path
        rmr path
        get path [watch]
        create [-s] [-e] path data acl
        addauth scheme auth
        quit
        getAcl path
        close
        connect host:port
[zk: 10.121.63.208:2181(CONNECTED) 1] ls /
[zookeeper]
[zk: 10.121.63.208:2181(CONNECTED) 3] get /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
[zk: 10.121.63.208:2181(CONNECTED) 4] create /zk_test
stat           set            ls             delquota       ls2            setAcl         setquota       history        redo           printwatches   delete         sync           listquota      rmr            get
create         addauth        quit           getAcl         close          connect
[zk: 10.121.63.208:2181(CONNECTED) 4] create /zk_test my_data
Created /zk_test
[zk: 10.121.63.208:2181(CONNECTED) 5] ls /
[zookeeper, zk_test]
[zk: 10.121.63.208:2181(CONNECTED) 6] get /zk_test
my_data
cZxid = 0x300000008
ctime = Wed Mar 06 14:52:12 CST 2019
mZxid = 0x300000008
mtime = Wed Mar 06 14:52:12 CST 2019
pZxid = 0x300000008
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0
[zk: 10.121.63.208:2181(CONNECTED) 7] delete /zk_test

 

[zk: 10.121.63.215(CONNECTED) 6] create /dog 'aaaa'
Created /dog
[zk: 10.121.63.215(CONNECTED) 7] ls /
[zookeeper, dog]
[zk: 10.121.63.215(CONNECTED) 8] stat /dog
cZxid = 0x300000020   //创建事件顺序  id属于集群来维护
ctime = Thu Mar 14 14:55:44 CST 2019
mZxid = 0x300000020   //修改事件顺序
mtime = Thu Mar 14 14:55:44 CST 2019  //修改时间
pZxid = 0x300000020   //子节点事件编号
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0  //临时节点拥有者,永久节点则为0,临时节点则为session id
dataLength = 4    //存储数据长度
numChildren = 0    //子节点的个数
[zk: 10.121.63.215(CONNECTED) 10] create /dog/a "little a"
Created /dog/a
[zk: 10.121.63.215(CONNECTED) 11] stat /dog
cZxid = 0x300000020
ctime = Thu Mar 14 14:55:44 CST 2019
mZxid = 0x300000020
mtime = Thu Mar 14 14:55:44 CST 2019
pZxid = 0x300000021
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 1
[zk: 10.121.63.215(CONNECTED) 12] stat /dog/a
cZxid = 0x300000021
ctime = Thu Mar 14 15:00:32 CST 2019
mZxid = 0x300000021
mtime = Thu Mar 14 15:00:32 CST 2019
pZxid = 0x300000021
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 8
numChildren = 0

 监听机制:

注册监听 (命令带watch)
ls path [watch] 子节点发生变化
get path [watch] 节点数据发生变化
stat path [watch]

四种事件:
nodedatachanged 节点数据内容改变
nodecreate 节点创建事件
nodedelete 节点删除
nodechildrenchanged 子节点变化事件

Note: 监听只生效一次

[zk: localhost:2181(CONNECTED) 17] ls /dog
[]
[zk: localhost:2181(CONNECTED) 18] ls /dog watch
[]
[zk: localhost:2181(CONNECTED) 19] create /dog/a "aaaaa"
Created /dog/a
[zk: localhost:2181(CONNECTED) 20]
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/dog
[zk: localhost:2181(CONNECTED) 20]


[zk: localhost:2181(CONNECTED) 28] get /dog watch  //获得内容监听
a dog
cZxid = 0x300000020
ctime = Thu Mar 14 14:55:44 CST 2019
mZxid = 0x30000002e
mtime = Thu Mar 14 15:44:01 CST 2019
pZxid = 0x30000002c
cversion = 11
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 1
[zk: localhost:2181(CONNECTED) 29]
[zk: localhost:2181(CONNECTED) 29] set /dog "this is a dog"  //修改内容 触发了NodeDataChanged事件
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/dogcZxid = 0x300000020

ctime = Thu Mar 14 14:55:44 CST 2019
mZxid = 0x30000002f
mtime = Thu Mar 14 15:44:36 CST 2019
pZxid = 0x30000002c
cversion = 11
dataVersion = 3
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 13
numChildren = 1

 

posted @ 2019-03-05 19:58  牧 天  阅读(290)  评论(0)    收藏  举报