Weitere ähnliche Inhalte Ähnlich wie Zoo keeper (20) Zoo keeper5. Standalone模式
$ bin/zkServer.sh start
JMX enabled by default
Using config: /home/jxq/code/zookeeper-3.4.2/bin/../conf/
zoo.cfg
Starting zookeeper ... STARTED
$ bin/zkCli.sh -server 127.0.0.1:2181
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is enabled
[zk: localhost:2181(CONNECTED) 0] help
6. Standalone模式
[zk: localhost:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
connect host:port
get path [watch]
ls path [watch]
set path data [version]
rmr path
delquota [-n|-b] path
quit
printwatches on|off
create [-s] [-e] path data acl
stat path [watch]
close
ls2 path [watch]
listquota path
setAcl path acl
getAcl path
sync path
delete path [version]
7. Standalone模式
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 2] create /zk_test test_data
Created /zk_test
[zk: localhost:2181(CONNECTED) 3] ls /
[zookeeper, zk_test]
[zk: localhost:2181(CONNECTED) 4] get /zk_test
test_data
cZxid = 0x11
ctime = Thu Mar 08 15:33:55 CST 2012
mZxid = 0x11
mtime = Thu Mar 08 15:33:55 CST 2012
pZxid = 0x11
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 9
numChildren = 0
8. Standalone模式
[zk: localhost:2181(CONNECTED) 5] set /zk_test test_2
cZxid = 0x11
ctime = Thu Mar 08 15:33:55 CST 2012
mZxid = 0x13
mtime = Thu Mar 08 15:46:27 CST 2012
pZxid = 0x11
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
9. Standalone模式
[zk: localhost:2181(CONNECTED) 6] get /zk_test watch
test_2
cZxid = 0x11
ctime = Thu Mar 08 15:33:55 CST 2012
mZxid = 0x13
mtime = Thu Mar 08 15:46:27 CST 2012
pZxid = 0x11
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
10. Standalone模式
[zk: 127.0.0.1:2181(CONNECTED) 6] set /zk_test test_3
WATCHER::cZxid = 0x11
WatchedEvent state:SyncConnected type:NodeDataChanged
path:/zk_test
ctime = Thu Mar 08 15:33:55 CST 2012
mZxid = 0x51
mtime = Mon Mar 19 10:43:59 CST 2012
pZxid = 0x11
cversion = 0
dataVersion = 11
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
11. zk的一致性保证
• 顺序性:客户端请求顺序生效
• 原子性
• 单一系统映像
• 可靠性:一旦更新请求生效,会持续到下
一次请求
12. znode
• 3种znode
• persistent znode: 永久
有效地节点
• ephemeral znode: 临
时节点
• sequential znode: 顺序
节点
• 数据少于1MB
13. watches
• getData(), getChildren(), exists()
• One-time trigger
• data watches and child watches
• 有序的:
• 客户端收到watch事件的顺序跟节点发生改变的顺序一
致
• 客户端收到watch事件后才会看到新数据
• 注意延迟:收到watch事件和获取新数据之间数据
可能改变多次
void watcher(zhandle_t *zzh, int type, int state,
const char *path, void* context)
15. API
异步 同步
zoo_acreate() zoo_create()
zoo_aexists() zoo_exists()
zoo_aget() zoo_get()
zoo_aget_children() zoo_get_children()
zoo_aset() zoo_set()
zoo_adelete() zoo_delete()
16. 典型应用
• Naming service
• 配置管理
• 集群监控
• Barriers
• 分布式队列
• 分布式锁
• leader election
20. Barriers
• “/barrier/[n]”
1. create(“/barrier/n”, EPHEMERAL_SEQUENTIAL)
2. getChildren(“/barrier/”, true),设定watch,
节点数量变化时通知
3. if 节点数量小于x,等待watch通知
4. else return
5. goto 2
watcher函数:pthread_cond_signal()
等待:pthread_cond_wait()
22. 分布式锁
• “_locknode_/lock-[n]”
• 获得锁:
1. create(“_locknode_/lock-[n]”)
2. getChildren()
3. 判断(1)中创建节点序号是否是最小的,是则取得锁
4. exists()判断第二小的节点是否存在,并加watch
5. 如果exists()返回false, goto 2。否则等待通知
后再跳到2
• 释放锁:删除节点
26. zk节点的角色
角色 描述
leader(领导者) 进行投票的发起和决议
follower(跟随者) 接收客户端请求并返回结果,选举过程
中参与投票
接收客户端请求,将写操作转发给
learner(学习 observer(观察 leader。但是不参与投票过程,只同步
者) 者) leader状态。提高读性能。
client(客户端) 发起请求
28. 选举流程
• basic paxos
• 每个Server启动以后都询问其它的Server它要
投票给谁,收到所有Server回复以后,就计算
出zxid最大的哪个Server,并将这个Server相
关信息设置成下一次要投票的Server。如果此
时获胜的Server获得n/2 + 1的Server票数, 设
置当前推荐的leader为获胜的Server,并修改
自己状态。
• election.jpg