最后,我们将会写⼀个简单的AdminClient,通过该程序来展⽰系统的运⾏状态。ZooKeeper优点之⼀是我们可以通过zkCli⼯具来查看系统的状态,但是通常你希望编写你⾃⼰的管理客户端,以便更快更简单地管理系统。在本例中,我们通过getData和getChildren⽅法来获得主从系统的运⾏状态。
这些⽅法的使⽤⾮常简单,因为这些⽅法不会改变系统的运⾏状态,我们仅需要简单地传播我们遇到的错误,⽽不需要进⾏任何清理操作。该⽰例使⽤了同步调⽤的⽅法,这些⽅法还有⼀个watch参数,我们置为false值,因为我们不需要监视变化情况,只是想获得系统当前的运⾏状态。在后面的学习中我们将会看到如何使⽤这个参数来跟踪系统的变化情况。
现在,让我们看⼀下AdminClient的代码:
①我们在/master节点中保存了主节点名称信息,因此我们从/master中获取数据,以获得当前主节点的名称。因为我们并不关⼼变化情况,所以我们将第⼆个参数置为false。
②我们通过Stat结构,可以获得当前主节点成为主节点的时间信息。ctime为该znode节点建立时的秒数(系统纪元以来的秒数,即自1970年1月1日00:00:00UTC的描述),详细信息请查看java.lang.System.currentTimeMillis()。
③临时节点含有两个信息:指示当前从节点正在运⾏;其数据表示从节点的状态。
AdminClient⾮常简单,该程序简单地通过数据结构获得在主从⽰例的信息。我们试着可以启停Master程序、Worker程序,多次运⾏Client来队列化⼀些任务,AdminClient会展⽰系统的这些变化的状态。
你也许想知道如果在AdminClient中使⽤异步API是否更好。ZooKeeper有⼀个流⽔线的实现,⽤于处理成千上万的并发请求,对于系统需要⾯对的各种各样的延迟问题是⾮常重要的,⽽最⼤的延迟在于硬盘和⽹络。异步和同步的组件均通过队列⽅式来有效利⽤吞吐量。getData⽅法并不会进⾏任何硬盘的访问,但却需要依赖⽹络传输,同时我们使得同步⽅法的请求流⽔线管道化。如果我们的AdminClient程序运⾏于仅有⼏⼗个从节点、⼏百个任务的⼩型系统中,也许不会是⼤问题,但如果系统包含的从节点、任务再上升⼀个数量级,延迟问题可能就变得重要了。
考虑以下场景,请求的传输往返时延时间为1毫秒,如果进程需要读取10000个znode节点,我们就要在⽹络延迟上耗费10秒的时间,⽽通过异步API,我们可以缩短整个时间到接近1秒的时间。
以上⾯的Master、Worker、Client这些的基本实现带领我们进⼊了主从系统的开端,但到⽬前为⽌还没有实际调度起来。当⼀个任务加⼊队列,主节点需要唤醒并分配任务给⼀个从节点,从节点需要找出分配给⾃⼰的任务,任务完成时,客户端需要及时知道,如果主节点故障,另⼀个等待中的主节点需要接管主节点⼯作。如果从节点故障,分配给这个从节点的任务需要分配给其他从节点,在后面的学习中,我们将会讨论这些必要功能的实现。
网友评论