一.简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。Chubby是google分布式系统中的锁服务,锁机制说白了就是资源的一个协调和管理。比如在一个并发的环境里,为了避免多个运行单元对共享数据同时进行修改,造成数据损坏的情况出现,就必须依赖像锁这样的协调机制,让有的线程可以先操作这些资源,然后其他线程等待。对于线程内的锁来讲,我们使用的各种语言平台都已经给我们准备很多种选择,如java中synchronized、ReadWriteLock等,但在线程内的协调相对简单,对方法的调用结果,成功就是成功,失败就是失败,结果是明确的且确定的。在网络分布式的环境下,就会出现很多复杂的状况,可能服务调用失败了,实际是执行成功的,同一时间的调用,会因为网络延迟结果不一定同时返回。在分布式环境中为了提升可靠性,往往会部署多套服务,如何在多套服务中达到一致,做到良好的协调,这就是zookeeper要解决的问题。
二.功能
“ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services”。根据描述,zookeeper是一个服务中心,提供配置管理、命名服务、分布式同步和集群管理。
1.配置管理
在项目中很多情况用到配置文件,配置文件的方便之处在于不用嵌入和关心代码,极大方便了修改和部署,随着分布式的应用,往往多个服务器或节点会有相同的配置项,把这些相同的配置集中管理,zookeeper就可以提供这种集中配置管理的服务,并通过一致性协议提供高可靠性的服务。在实际中,HBase、Hadoop、kafaka等都使用了zookeeper。
2.名字服务
名字服务就类似于DNS服务,由于IP地址不好记忆,通过域名的方式更符合人们的习惯,所以DNS就应运而生。这里的名字服务,就是为了更好地管理服务名与服务地址的关系,通过服务名直接可以定位到服务地址,这样当希望调用某个服务的时候,通过服务名就可以得到服务的调用地址了。
3.分布式同步
分布式同步是通过分布式锁的方式来实现的,zookeeper可以协调多个分布式进程之间的活动,为了提高可靠性,集群中的每一台服务器都部署了同样的服务,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。
4.集群管理
在分布式集群中,有各种各样的情况,比如集群的监控、节点的移除和添加、网络问题、节点故障,集群中的机器要感知这种变化,并根据变化做出相应的调整,这也是zookeeper提供的功能。
三.安装和配置
1.安装包下载,地址官网,本次下载的版本为zookeeper-3.4.6
2.单机配置
到zookeeper解压后目录的config文件夹,拷贝zoo_sample.cfg为zoo.cfg,主要配置项
参数
|
含义
|
示例
|
---|---|---|
tickTime | the number of milliseconds of each tick | 2000 |
initLimit | the number of ticks that the initial synchronization phase can take | 10 |
syncLimit | the number of ticks that can pass between sending a request and getting an acknowledgement | 5 |
dataDir | data directory | /tmp/zookeeper |
clientPort | the port at which the clients will connect | 2181 |
启动命令bin/zkServer.sh start
客户端连接命令bin/zkCli.sh -server localhost:2181
3.集群配置
在zoo.cfg中添加server配置信息,格式如server.X=A:B:C,单机时则不用配置,其中X是一个数字, 表示这是第几号server. A是该server所在的IP地址. B配置该server和集群中的leader交换消息所使用的端口. C配置选举leader时所使用的端口,另外在每个分机的dataDir下创建myid,名称为数字X,即本Server的编号,作为区分的标识。
ZooKeeper采用一种称为Leader election的选举算法。ZooKeeper集群启动的时候,会首先选出某一满足的节点作为Leader,在整个集群运行过程中,只有一个Leader,其他的都是Follower,如果ZooKeeper集群在运行过程中Leader出了问题,系统会采用该算法重新选出一个Leader。因此,各个结点之间要能够保证互相连接。
更多具体的信息可参考官网说明,官网上往往是最好的资料。
四.架构说明
ZooKeeper分布式协调服务框架的总体架构
ZooKeeper集群由一组Server节点组成,这一组Server节点中存在一个角色为Leader的节点,其他节点都为Follower。当客户端Client连接到ZooKeeper集群,并且执行写请求时,这些请求会被发送到Leader节点上,然后Leader节点上数据变更会同步到集群中其他的Follower节点。Leader节点在接收到数据变更请求后,首先将变更写入本地磁盘,以作恢复之用。当所有的写请求持久化到磁盘以后,才会将变更应用到内存中。ZooKeeper使用了一种自定义的原子消息协议,在消息层的这种原子特性,保证了整个协调系统中的节点数据或状态的一致性。Follower基于这种消息协议能够保证本地的ZooKeeper数据与Leader节点同步,然后基于本地的存储来独立地对外提供服务。当一个Leader节点发生故障失效时,失败故障是快速响应的,消息层负责重新选择一个Leader,继续作为协调服务集群的中心,处理客户端写请求,并将ZooKeeper协调系统的数据变更同步(广播)到其他的Follower节点。
五.客户端工具简单操作
1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
3. 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
5. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
6. 删除文件: delete /zk 将刚才创建的 znode 删除
7. 退出客户端: quit
8. 帮助命令: help
参考:
http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html#sc_RunningReplicatedZooKeeper
http://shiyanjun.cn/archives/474.html
http://www.cnblogs.com/kunpengit/p/4045334.html 工具命令
http://blog.youkuaiyun.com/huwei2003/article/details/49101269 hello world