# 探索 ZooKeeper:分布式系统的强大协调利器
ZooKeeper 作为 Hadoop 的正式子项目,是专为大型分布式系统打造的可靠协调系统。它功能丰富,涵盖配置维护、名字服务、分布式同步以及组服务等。其核心目标是将复杂易错的关键服务封装起来,为用户呈上简单易用的接口,以及性能卓越、功能稳定的系统。
值得一提的是,ZooKeeper 是 Google 的 Chubby 的开源实现,是高效可靠的协同工作系统。在分布式环境中,它大有用武之地,比如用于 leader 选举、配置信息维护等。在分布式场景里,我们常需一个 Master 实例、存储配置信息并保证文件写入一致性,而 ZooKeeper 能确保以下三点:
1. **事件有序性**:Watches 与其他事件、其他 watches 以及异步回复的顺序是有保障的。ZooKeeper 客户端库能确保一切按序调度。
2. **事件观察顺序**:客户端在看到所观察 znode 的新数据之前,会先看到该 znode 的 watch 事件。
3. **更新顺序对应**:ZooKeeper 中 watch 事件的顺序与 ZooKeeper 服务所看到的更新顺序一致。
ZooKeeper 中的 znode 类似 Unix 文件系统路径的节点,可存储或获取数据。若创建 znode 时 Flag 设置为 EPHEMERAL,那么创建该 znode 的节点与 ZooKeeper 失去连接后,此 znode 将从 ZooKeeper 中消失。ZooKeeper 利用 Watcher 感知事件信息,客户端接收到连接超时、节点数据改变、子节点改变等事件信息时,可调用相应行为处理数据。其 Wiki 页面展示了诸多用法,如处理事件通知、队列、优先队列、锁、共享锁、可撤销的共享锁以及两阶段提交。
## ZooKeeper 能助力哪些事务?
假设我们有 20 个搜索引擎服务器(每个负责总索引部分搜索任务)、一个总服务器(向 20 个搜索引擎服务器发搜索请求并合并结果集)、一个备用总服务器(总服务器宕机时替换)以及一个 web cgi(向总服务器发搜索请求)。其中 15 个搜索引擎服务器提供搜索服务,5 个生成索引,且它们状态常变化。使用 ZooKeeper 能实现:
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. **主服务器标识**:总服务器在 ZooKeeper 中创建节点,`zk.create(“/search/master”,”hostname”.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateFlags.EPHEMERAL)`。
5. **备用服务器启用**:备用总服务器监控 `/search/master` 节点,数据改变时启动并更新自身网络地址数据。
6. **cgi 地址获取**:web cgi 从 `/search/master` 节点获取总服务器网络地址发搜索请求,并监控该节点,数据改变时更新地址。
ZooKeeper 就是这样在分布式系统中发挥着神奇作用,为复杂的系统协调提供有力支持 。
解压密码: qq112233aa
暂无评论内容