ZooKeeper主从模式的三种角色(以Client为例)

来源:互联网 发布:祥南行书体 mac 编辑:程序博客网 时间:2024/06/07 10:51

主节点

集群中只有一个节点会成为主节点,所以相应的节点必须锁定管理权。因此要创建一个>/master<的节点。
create -e /master “master”
用>get /master<查看主节点信息,会有类似于下面格式的输出:

master
cZxid = 0xa00000007
ctime = Mon May 29 16:54:37 CST 2017
mZxid = 0xa00000007
mtime = Mon May 29 16:54:37 CST 2017
pZxid = 0xa00000007
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 7
numChildren = 0

同时通过>true<参数来监视主节点,如:

ls /master true
stat /master true

从节点

从节点主要有两个关注点:注册节点和确认接受任务分配。
1. 首先要先初始化>/workers、/tasks、/assign<这三个父节点目录:
2. 通过>create /workers/something “something”<在目录下注册从节点,以让主节点能够知道哪个节点正常;
3. 通过>create /assign/something “something”<在目录下注册可以接受任务的节点;
4. 同样,需要通过>true<来添加监视状态;

客户端

客户端的要向>/tasks<目录中添加要执行的任务,同样也是采用注册的方式。
1. 首先提交任务:>create -s /tasks/task- “cmd”<,提交了一个 “cmd” 任务,得到以下回复:

WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/tasks
Created /tasks/task-0000000000

  1. 客户端要监视任务的执行状态>ls /tasks/task-0000000000 true<;

  2. 之后主节点查看任务和可用节点,将任务分配给目标节点>create /assign/Hadoop3/task-0000000000 “”<,得到:

    WATCHER::
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/assign/Hadoop3
    Created /assign/Hadoop3/task-0000000000

  3. 然后从节点检查确定任务分配给自己并执行任务;

  4. 一旦任务完成,从节点就向>create /tasks/task-0000000000/status “done”<中添加状态,

    WATCHER::
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/tasks/task->0000000000
    Created /tasks/task-0000000000/status

6.客户端接收通知,检查结果>get /tasks/task-0000000000<,结果类似如下:

cmd
cZxid = 0xa00000013
ctime = Mon May 29 18:08:43 CST 2017
mZxid = 0xa00000013
mtime = Mon May 29 18:08:43 CST 2017
pZxid = 0xa00000017
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 1

同时检查状态>get /tasks/task-0000000000/status<,

done
cZxid = 0xa00000017
ctime = Mon May 29 18:22:57 CST 2017
mZxid = 0xa00000017
mtime = Mon May 29 18:22:57 CST 2017
pZxid = 0xa00000017
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0

当然在实际中,不应该用Client来实现应用,而是通过自己的程序调用API完成,Client更多用于调试。