Zoo keeper

1,039 views

Published on

Published in: Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,039
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
22
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Zoo keeper

  1. 1. ZooKeeper高可用分布式协调系统high available and reliable coordination system
  2. 2. zk 的角色 人体 分布式系统 神经 网络 器官 服务器 大脑 zk
  3. 3. zk 的角色
  4. 4. Standalone 模式$ cd zookeeper-3.4.2/$ cat conf/zoo.cfgtickTime=2000dataDir=/var/lib/zookeeperclientPort=2181
  5. 5. Standalone 模式$ bin/zkServer.sh startJMX enabled by defaultUsing config: /home/jxq/code/zookeeper-3.4.2/bin/../conf/zoo.cfgStarting zookeeper ... STARTED$ bin/zkCli.sh -server 127.0.0.1:2181Connecting to localhost:2181Welcome to ZooKeeper!JLine support is enabled[zk: localhost:2181(CONNECTED) 0] help
  6. 6. Standalone 模式[zk: localhost:2181(CONNECTED) 0] helpZooKeeper -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. 7. Standalone 模式[zk: localhost:2181(CONNECTED) 1] ls /[zookeeper][zk: localhost:2181(CONNECTED) 2] create /zk_test test_dataCreated /zk_test[zk: localhost:2181(CONNECTED) 3] ls /[zookeeper, zk_test][zk: localhost:2181(CONNECTED) 4] get /zk_testtest_datacZxid = 0x11ctime = Thu Mar 08 15:33:55 CST 2012mZxid = 0x11mtime = Thu Mar 08 15:33:55 CST 2012pZxid = 0x11cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 9numChildren = 0
  8. 8. Standalone 模式[zk: localhost:2181(CONNECTED) 5] set /zk_test test_2cZxid = 0x11ctime = Thu Mar 08 15:33:55 CST 2012mZxid = 0x13mtime = Thu Mar 08 15:46:27 CST 2012pZxid = 0x11cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 6numChildren = 0
  9. 9. Standalone 模式[zk: localhost:2181(CONNECTED) 6] get /zk_test watchtest_2cZxid = 0x11ctime = Thu Mar 08 15:33:55 CST 2012mZxid = 0x13mtime = Thu Mar 08 15:46:27 CST 2012pZxid = 0x11cversion = 0dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 6numChildren = 0
  10. 10. Standalone 模式[zk: 127.0.0.1:2181(CONNECTED) 6] set /zk_test test_3WATCHER::cZxid = 0x11WatchedEvent state:SyncConnected type:NodeDataChangedpath:/zk_testctime = Thu Mar 08 15:33:55 CST 2012mZxid = 0x51mtime = Mon Mar 19 10:43:59 CST 2012pZxid = 0x11cversion = 0dataVersion = 11aclVersion = 0ephemeralOwner = 0x0dataLength = 6numChildren = 0
  11. 11. zk 的一致性保证• 顺序性:客户端请求顺序生效• 原子性• 单一系统映像• 可靠性:一旦更新请求生效,会持续到下 一次请求
  12. 12. znode • 3 种 znode • persistent znode: 永久 有效地节点 • ephemeral znode: 临时 节点 • sequential znode: 顺序 节点 • 数据少于 1MB
  13. 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)
  14. 14. ACL• 类似 unix 文件权限• 只对某一节点有效(非递归的)• 权限: • CREATE, READ,WRITE,DELETE,ADMIN
  15. 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. 16. 典型应用• Naming service• 配置管理• 集群监控• Barriers• 分布式队列• 分布式锁• leader election
  17. 17. 配置管理• 配置文件、机器列表等等• 集中管理• 服务自动更新配置 • 客户端建立 watch • zk 节点内容(配置)更改时推送到客户端
  18. 18. 集群监控• 每个服务创建“ /clusterServers/ {hostname}” 节点, ephemeral• 监控服务 watch“/clusterServers” 子节点数 量• 被监控服务停止时节点消失,监控服务收 到 watch 事件
  19. 19. Barriers
  20. 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()
  21. 21. 分布式队列• “/q/element_[n]”• 生产者: create(“/q” + “/element_”, message, ZOO_SEQUENCE);• 消费者: get_children(); delete();• zk 集群数据一致性
  22. 22. 分布式锁• “_locknode_/lock-[n]”• 获得锁: • create(“_locknode_/lock-[n]”) • getChildren() • 判断 (1) 中创建节点序号是否是最小的,是则取得锁 • exists() 判断第二小的节点是否存在,并加 watch • 如果 exists() 返回 false, goto 2 。否则等待通 知后再跳到 2• 释放锁:删除节点
  23. 23. leader election
  24. 24. ZK 内部设计
  25. 25. • ZooKeeper Atomic Broadcast• 保证: • 消息的可靠传递 • 全局顺序 • 因果顺序• 消息传递的两个流程 • 选举 • 同步
  26. 26. zk 节点的角色角色 描述leader( 领导者 ) 进行投票的发起和决议 follower( 跟随者 接收客户端请求并返回结果,选举过程 ) 中参与投票 接收客户端请求,将写操作转发给learner( 学习 observer( 观察 leader 。但是不参与投票过程,只同步者) 者) leader 状态。提高读性能。client( 客户端 ) 发起请求
  27. 27. zk server 工作状态• LOOKING :当前 server 不知道 leader 是谁• LEADING :当前 server 是 leader• FOLLOWING : leader 已经选举出来
  28. 28. 选举流程• basic paxos • 每个 Server 启动以后都询问其它的 Server 它要 投票给谁,收到所有 Server 回复以后,就计算 出 zxid 最大的哪个 Server ,并将这个 Server 相 关信息设置成下一次要投票的 Server 。如果此 时获胜的 Server 获得 n/2 + 1 的 Server 票数, 设置当前推荐的 leader 为获胜的 Server ,并修 改自己状态。• election.jpg
  29. 29. 同步流程• leader 等待 server 连接• follower 连接 leader ,将最大的 zxid 发送给 leader• leader 根据 follower 的 zxid 确定同步点• 完成同步后通知 follower 已经成为 uptodate 状态• follower 收到 uptodate 消息后,又可以重新 接受 client 的请求进行服务

×