Zookeeper入门基础

前言

Zookeeper 中, znode 是一个跟 Unix 文件系统路径相似的节点,可以往这个节点存储或获取数据。如果在创建 znode Flag 设置为 EPHEMERAL ,那么当创建这个 znode 的节点和 Zookeeper 失去连接后,这个 znode 将不再存在在 Zookeeper 里, Zookeeper 使用 Watcher 察觉事件信息。当客户端接收到事件信息,比如连接超时、节点数据改变、子节点改变,可以调用相应的行为来处理数据。 Zookeeper Wiki 页面展示了如何使用 Zookeeper 来处理事件通知,队列,优先队列,锁,共享锁,可撤销的共享锁,两阶段提交。

那么 Zookeeper 能作什么事情呢,简单的例子:假设我们有 20 个搜索引擎的服务器 ( 每个负责总索引中的一部分的搜索任务 ) 和一个总服务器 ( 负责向这 20 个搜索引擎的服务器发出搜索请求并合并结果集 ) ,一个备用的总服务器 ( 负责当总服务器宕机时替换总服务器 ) ,一个 web cgi( 向总服务器发出搜索请求 ) 。搜索引擎的服务器中的 15 个服务器提供搜索服务, 5 个服务器正在生成索引。这 20 个搜索引擎的服务器经常要让正在提供搜索服务的服务器停止提供服务开始生成索引,或生成索引的服务器已经把索引生成完成可以搜索提供服务了。使用 Zookeeper 可以保证总服务器自动感知有多少提供搜索引擎的服务器并向这些服务器发出搜索请求,当总服务器宕机时自动启用备用的总服务器。 web cgi 能够自动地获知总服务器的网络地址变化 . 这些又如何做到呢 ?

1. 提供搜索引擎的服务器都在 Zookeeper 中创建 znode,zk.create("/search/nodes/node1",

"hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);

2. 总服务器可以从 Zookeeper 中获取一个 znode 的子节点的列表 ,zk.getChildren("/search/nodes", true);

3. 总服务器遍历这些子节点 , 并获取子节点的数据生成提供搜索引擎的服务器列表 .

4. 当总服务器接收到子节点改变的事件信息 , 重新返回第二步 .

5. 总服务器在 Zookeeper 中创建 节点 ,zk.create("/search/master", "hostname".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateFlags.EPHEMERAL);

6. 备用的总服务器监控 Zookeeper 中的 "/search/master" 节点 . 当这个 znode 的节点数据改变时 , 把自己启动变成总服务器 , 并把自己的网络地址数据放进这个节点 .

7. web cgi Zookeeper "/search/master" 节点获取总服务器的网络地址数据并向其发送搜索请求 .

8. web cgi 监控 Zookeeper 中的 "/search/master" 节点 , 当这个 znode 的节点数据改变时 , 从这个节点获取总服务器的网络地址数据 , 并改变当前的总服务器的网络地址 .

我需要运行几个 ZooKeeper?

你运行一个 zookeeper 也是可以的,但是在生产环境中,你最好部署 3 5 7 个节点。部署的越多,可靠性就越高,当然最好是部署奇数个,偶数个不是不可以的,但是 zookeeper 集群是以宕机个数过半才会让整个集群宕机的,所以奇数个集群更佳。你需要给每个 zookeeper 1G 左右的内存,如果可能的话,最好有独立的磁盘。 ( 独立磁盘可以确保 zookeeper 是高性能的。 ). 如果你的集群负载很重,不要把 Zookeeper RegionServer 运行在同一台机器上面。就像 DataNodes TaskTrackers 一样。

Apache ZooKeeper 入门

http://www.huomo.cn/sysapp/article-19c2e.html

zookeeper-web - 在线 zookeeper 管理工具

http://git.oschina.net/crystony/zookeeper-web

ZooKeeper 开发手册中文翻译

http://my.oschina.net/sundiontheway/blog/346498

使用 RMI + ZooKeeper 实现远程调用框架

http://my.oschina.net/huangyong/blog/345164

zookeeper 简单的代码 demo

http://my.oschina.net/hejiula/blog/358097

美文美图