Apache*项目介绍系列3 - ZooKeeper
今天介绍Apache著名*项目ZooKeeper,简称zk。如封面所示,管理zoo的凶猛野兽可不是简单之事。之所以先介绍zk是因为其影响力之大,范围之广,在后续的*项目中但凡设计分布式几乎都与其关联,所以还是及早铺垫为妙。
官网介绍,zk是一个分布式的,开源的分布式应用程序协调服务,为分布式应用提供了一致性服务,核心功能包括:配置维护,命名服务,分布式同步,组服务等。前半句比较绕口,大意为,zk本身设计,架构也是分布式的,同时它的核心功能也是为分布式应用提供服务的。呵呵,这年代,技术标榜中不提及分布式都不敢出来混。
另外,其实zk是Google的项目Chubby的开源实现,这里抛几个引子,google可谓是dt时代身后大师,很多知名的项目包括hadoop,hbase以及zk都是根据google的几篇论文而来,zk是来自“The Chubby lock service for loosely-coupled distributed system”。说的直白一点,google本身在大型分布式领域经过了多年技术沉淀,早早领先于业界,首先用google本身都是采用闭源商业开发,所以只好抛几篇paper出来,然而仅仅这2,3片paper就对整个世界都起了大变化,业界的大师以及各it公司如获至宝,茅塞顿开,包括facebook以及中国的阿里与腾讯,纷纷实现Google的开源软件,以至于后来的发展已经超出了google的预计,甚至倒逼Google后来的一些开源,如Go, Kubernetes等,也不知是google成就了dt还是双赢。向Google致敬,带着浓浓的硅谷底蕴,算一家伟大的技术公司!国内的巨头,目前还在霸道,土豪的成长中,带着浓浓的商业气息。
zk目前stable版本是3.4,系统数据模型如下:
可以看出分布式的设计,其核心数据模型理念类似文件目录结构(通过/分割),其中每一个节点zk中称之为znodes,每个节点都可以用根path来决定,总体提供一个分布式环境共享的hierarchal命名空间,这样分布式服务process就可以通过这个命名空间协调。另外,与文件目录的差异,这个数据模型是动态kept in-memory,目的是提供高并发,低延迟。注意,最近的业界,流行提到孪生术语“高并发,低延迟”。zk自己的分布式体现在它的架构设计。
zk的分布式结构,znodes之间通过in-memory,以及也支持持久化transaction logs,snapshots, 同时显然支持replicated。
zk客户端通过tcp链接一个zk服务器,zk客户端通过持续发送request,获得response,监控events,以及发送heart beats,即心跳脉冲,如果连接断掉,会重新自动连接新的server。不用担心,zk客户端通常会被封装在其它高端产品中。
继续回到上边的znodes,这个是其核心之一。zonde可以保存状态信息,配置信息,location信息等。所以每个znode大小很小,几个字节-几k而已。znodes维护了structure的状态信息,版本,acl变化。每次znode数据变化会自动加版本,zk客户端同样可以收到版本信息。znode有一个重要的概念ephemeral nodes,中文意思是指一些短暂生命周期的节点。ephemeral nodes非常有用,它的生命周期是当session创建时激活,session结束了就删除。
另一个zk的功力是watches,zk客户可以监控znodes,一个watch event将被激活当有任何的znode变化,进而zk客户端可以做进一步处理,比如发现某些server不可用,zk客户端可以负载均衡等。
zk的API也清晰简单,create,delete,exists,get,sync等,与普通数据库活着文件系统类似。
zk的replication如下图所示
值得注意的是,zk的replicaitn数据库是in-memory包含整个data tree。 zk的读请求会从local replica服务数据库获取,zk的write请求会通过agreement protocol:所有的write请求会转发到single server,zk术语叫leader,其它的zk server术语叫followers,哪里都有领导啊?哈哈。消息层负责重新选举leader,以及同步leader到followers。
zk性能统计:
放心,性能不好官网也不敢上图了。此统计图来自Yahoo! 注意,啰嗦一下,yahoo后面的!是yahoo的一部分哦。
好了,来点干货,run一下吧,当然要分布式run了,先来3个server吧。Running Replicated ZooKeeper, 单机模式很简单,replicated模式是生产环境必备模式。zk中一个replicated group叫做quorum,replicated模式下,所有的quorum服务器都复制相同配置文件。
别忘了建一个data目录,创建一个myid文件,里面标示server数字如1.
run run run zk
创建一个node吧,run一些命令
可以故意删除一些server,如删除server2,然后继续连接,测试zk的分布式集群。不高兴弄了。大家可以自己玩。
再上一个watch的java用例,来自官网。
好了,先抛转头到这里吧,有兴趣的可以继续深入研究。如zk的分布式锁,以fast paxos为基础的变种ZAB协议,以及leader选举算法。
总结一下,zk目前已经俨然成为分布式集群管理的必不可少的一个模块,包括hadoop,hbase等用它来管理namenode, hbase里的master election,server状态同步。
公众号:技术极客TechBooster
上一篇: disconf源码解读
下一篇: WPF之Style样式