《Zookeeper 分布式过程协同技术详解》读书

一个协作任务指一个包含多进程的任务。这个任务可以是为了协作或者是为了管理竞争。协作意味着多个进程需要同时处理某些事情,一些进程采取某些行动是的其它进程可以继续工作

zookeeper使用共享存储模型来实现应用间的协作和同步原语。对于共享存储本身,又需要在进程和存储间进行网络通信

zookeeper仲裁

采用仲裁方式的复制集群中,由于具备高可用的镜像复写功能,如果客户端需要等待每个服务器完成数据的螺钉后在继续,则延时的问题会变得比较突出,要知道,延时,在大流量的访问中,是不可接收的,但不代表能消灭延时。
此时,在ZK的设计思路中,为了规避这个问题,则衍生除了法定人数的思想,即我们只需要保证我们的集群中,由若干算法模式下实现的人数能完成对应的信息落地之后,则认为客户端可以继续下一波的操作,而不是等到所有集群完全落实才继续下去。例如,我们由5个zk服务器,而法定人数为3人,则我们只需要确保其中的3台服务器保存了对应的数据,客户端就可以继续,而其他两个服务器在正常的状态下,最终也是能获取到数据,并保存下来
 

主从架构

主节点负责负责跟踪从节点状态和任务的有效性,并分配任务到从节点

三个首要问题:

1.主节点崩溃: 如果主节点发送错误并失效,系统将无法分配新的任务或重新分配已失败的任务

2. 从节点崩溃:如果从节点崩溃,已分配的任务将无法完成

3.通信故障: 如果主节点和从节点之间无法进行信息交换,从节点将无法得知新任务分配给它

一个典型的zookeeper集群

zookeeper 单节点服务端/客户端通信

zk 服务端启动

bin/zkServer.sh start-foreground

启动一个客户端

bin/zkCli.sh

查看服务端日志

过程

1. 客户端启动程序来建立会话,客户端尝试连接到zookeepr服务端

2. 服务端初始化会话完成,建立log file,发送一个SyncConnected事件给客户端

3. 客户端应用需要实现Watcher对象来处理这个事件

zkNode的创建,删除

退出客户端

服务端log

 

多节点服务,主从模式

主节点: 负责监视新的从节点和任务,分配任务给可用的从节点

从节点:通过系统注册自己,以确保主节点可以看到自己能执行任务了,然后开始监视新任务

客户端: 创建新任务并等待系统的响应

../bin/zkServer.sh start ../conf/z1.cfg

../bin/zkServer.sh stop ../conf/z1.cfg

之后启动zk2, 达到仲裁人数,zk2称为leader, z1是个follower

客户端连接

bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182

多次停止客户端在重新,观察连接的变化

bin/zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

可以观察到连接127.0.0.1:2183 失败,最终可以连接的日志

主节点角色

主节点创建临时性的zNode,从节点可以看到;当主节点删除时,从节点也能注意到

从节点,任务和分配

主节点监控/workers 和 /tasks的自节点的变化情况

从节点通知主节点,自己可以执行任务

create -e /workers/worker1 "worker1"

主节点收到该消息

从节点创建接收任务的zNode, 并监控,以等待任务的分配

create -e /assign/worker1 ""

客户端角色

客户端创建任务,并监视任务的状态

[zk: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183(CONNECTED) 6] create -s /tasks/task- "cmd"
Created /tasks/task-0000000000
[zk: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183(CONNECTED) 7] ls /tasks/task-0000000000 true
[]
[zk: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183(CONNECTED) 8]

主节点收到客户端的请求

WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/tasks

随后会检查这个新任务,获取可用的从节点列表,之后分配这个给worker1

[zk: 127.0.0.1:2182(CONNECTED) 9] ls /tasks
[task-0000000000]
[zk: 127.0.0.1:2182(CONNECTED) 10] ls /workers
[worker1]
[zk: 127.0.0.1:2182(CONNECTED) 11] create /assign/worker1/task-0000000000 ""
Created /assign/worker1/task-0000000000
[zk: 127.0.0.1:2182(CONNECTED) 12]

从节点收到主节点分配的任务,并确认该任务是分配给了自己

[zk: 127.0.0.1:2181(CONNECTED) 8] ls  /assign/worker1 true
[]
[zk: 127.0.0.1:2181(CONNECTED) 9]
WATCHER::

WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/assign/worker1

接着从节点开始执行这个任务

[zk: 127.0.0.1:2181(CONNECTED) 9] create /tasks/task-0000000000/status "done"
Created /tasks/task-0000000000/status
[zk: 127.0.0.1:2181(CONNECTED) 10]

客户端收到通知,并检查结果

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

[zk: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183(CONNECTED) 8] get /tasks/task-0000000000
cmd
cZxid = 0x10000003a
ctime = Thu Apr 04 21:31:44 CST 2019
mZxid = 0x10000003a
mtime = Thu Apr 04 21:31:44 CST 2019
pZxid = 0x100000040
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 1
[zk: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183(CONNECTED) 9] get /tasks/task-0000000000/status
done
cZxid = 0x100000040
ctime = Thu Apr 04 21:51:23 CST 2019
mZxid = 0x100000040
mtime = Thu Apr 04 21:51:23 CST 2019
pZxid = 0x100000040
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 0
[zk: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183(CONNECTED) 10]

发布了441 篇原创文章 · 获赞 110 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/qq_26437925/article/details/89027430