3、通过zkCli⼯具命令和zk 的java API两种方式创建⼀个主从模式示列

1、示例说明:一个主从模型包含以下三个角色:

  1. 主节点:负责监视新的从节点和任务及分配任务给可用的从节点:
    创建临时主节点/master其节点值为主机信息,以便zk外部的其他进程需要与他通信,添加主机信息并不是必须的,但这样做仅仅是为了说明我们可以在需要时对主节点添加数据。一个活动的主节点可能崩溃,备份主节点需要接替活动主节点的角色,为了检测到这些,需要在/master节点上设置一个监视点。
    备注:stat 命令可以得到一个znode节点的属性,并允许我们在已经存在的znode节点上设置监视点。通过在路径后面设置参数为true来添加监视点,当活动主节点崩溃是,我们观察到:NodeDeleted path:/master

  2. 从节点:通过系统注册自己,以确认主节点看到他们可以执行任务,然后开始监听新任务:
    创建三个父持久节点:/workers 、/tasks、/assign 并且不包含任何数据。一旦这些节点存在了,主节点就需要监视/workers和/tasks 子节点的变化情况。通过监视这些节点,可以告诉我们哪个从节点当前有效,还告诉我们当前有任务需要分配,并向从节点分配任务。从节点通过在/workers 子节点下创建临时性的znode来进行通知,并在子节点中使用主机名来标识自己。

  3. 客户端:创建新任务,并等待系统的响应;
    2、使⽤zkCli⼯具在命令窗口完成上述主从模式模拟:
    步骤1:创建临时主节点、持久子节点
    ##创建临时主节点
    create -e /master “master1.example.com:2223”

     ##尽管在任何时刻最多只能有⼀个活动的主节点,其他进程将成为备份主节点。假如其他进程不知道已经有⼀个主节点被选举出来,并尝试创建⼀个/master节点。那么ZK会告诉我们⼀个/master节点已经存在
     ##但是⼀个活动的主节点可能会崩溃,备份主节点需要接替活动主节点的⾓⾊。为了检测到这些,需要在/master节点上设置⼀个监视点
     [zk: localhost:2181(CONNECTED) 8] create -e /master "master2.example.com:2234"
     Node already exists: /master
     [zk: localhost:2181(CONNECTED) 9]
    
    
     ##创建持久从节点,其节点内容均为空
     create /wokers ""
     create /tasks ""
     create /assign ""
    

    步骤2:对从节点/workers 和 /tasks 设置对各自子节点的监视点;在主节点上设置监视点;
    ##在主节点上调用stat命令前,我们使用ls -w 命令,先设置对应znode的子节点变化的监视
    [zk: localhost:2181(CONNECTED) 12] ls -w /workers
    []
    [zk: localhost:2181(CONNECTED) 13] ls -w /tasks
    []

     ##在主节点上设置监视点
     stat -w /master
    

    步骤3:从节点⾸先要通知主节点,告知从节点可以执⾏任务
    ##3.1 从节点通过在/workers 子节点下创建临时性的znode来进行通知(告知主节点我可以执行任务),并在子节点中使用主机名来标识自己
    [zk: localhost:2181(CONNECTED) 16] create -e /wokers/wokers1.example.com “wokers1.example.com:2224 is created and ok,can execute task”
    WATCHER::Created /wokers/wokers1.example.com
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/wokers
    注:从输出的日志中可以看到一旦从节点在/workser下创建了一个通知子节点,主节点就会观察到通知信息
    ##3.2 从节点需要创建⼀个子节点 assing/worker1.example.com来接收任务分配,并通过ls命令对该节点设置监视点,来监视该节点的变化,以便等待新新的任务,至此,从节点就准备好了,可以接受任务分配
    create /assign/workers1.example.com “”
    ls -w /assign/workers1.example.com

     ##至此从节点就已经准备完成,可以接收任务分配,接下来我们通过讨论客户端⾓⾊来看⼀下任务分配的问题。
    

    步骤4:
    ##客户端向系统中添加任务,我们按照任务添加的顺序来添加节点,其本质上是一个队列。客户端现在必须等待任务执⾏完毕。执⾏任务的从节点将任务执⾏完毕后,会创建⼀个znode来表⽰任务状态。
    ##客户端通过查看任务状态的znode是否创建来确定任务是否执⾏完毕,因此客户端需要监视状态znode的创建事件:
    [zk: localhost:2181(CONNECTED) 19] create -s /tasks/task- “cmd”
    Created /tasks/task-0000000000
    [zk: localhost:2181(CONNECTED) 20]
    WATCHER::
    WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/tasks
    注:从输出的日志中可以看到一旦从节点在/tasks 下创建了一个子节点,主节点就会观察到通知信息

     ##执行任务的从节点会在/tasks/task-0000000000节点下创建状态znode节点,所以我们需要⽤ls命令来监视/tasks/task-0000000000的⼦节点。
     [zk: localhost:2181(CONNECTED) 21] ls -w /tasks/task-0000000000
     []
    
     ##主节点会检查新的任务,获取可用的从节点里列表,之后分配这个任务给worker1.example.com
     ls /tasks
     ls /workers
    
     [zk: localhost:2181(CONNECTED) 18] create /assign/workers1.example.com/task-0000000000
     WATCHER::Created /assign/workers1.example.com/task-0000000000
     WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/assign/workers1.example.com
     注:从输出的日志可以看,从节点workers1.example.com 接收到新分配任务的通知
    
     ##从节点检查新任务,并确认任务是否分配给自己
     ls /assign/workers1.example.com
     [task-0000000000]
    
     ##一旦从节点完成任务的执行,他就会在/tasks中添加一个状态节点
     [zk: localhost:2181(CONNECTED) 20] create /tasks/task-0000000000/status "done"
     Created /tasks/task-0000000000/status
     [zk: localhost:2181(CONNECTED) 21]
    
     ##之后客户端会接收到通知,并检查执行结果
     get /tasks/task-0000000000
     get /tasks/task-0000000000/status
    
     总结:本列中我们看到任务执行成功,其状态为done,当然任务也可能非常复杂,甚至涉及另外一个分布式系统,最终不管是什么样的任务,执行任务的机制与通过zk来传递结果。本质上都是一样的。
     有相同爱好的可以进来一起讨论哦:企鹅群号:1046795523
    

学习视频资料:http://www.makeru.com.cn/live/1392_1164.html?s=143793

猜你喜欢

转载自blog.csdn.net/wy122222222/article/details/108451654