引言
ZooKeeper是什么呢?简单的说,它就是一个文件系统,我们可以使用客户端在ZooKeeper服务器创建数据节点,节点有自己的值,节点下也可以创建子节点,类似一个树形结构。我们还可以对节点做增删改查操作如下图所示,这看起来和MySQL数据库的CRUD操作很像,只不过ZooKeeper操作的是数据节点,而MySQL操作的是数据库记录而已。
从上图看,我们可以在根目录下创建(create)节点/z-book,它的值是123,也可以把它的值更新(set)成132,还可以在它下面创建子节点page1,page2,还可以读取(get)子节点/zook/page1的值是789,还可以删除(delete)之前插入的节点/z-book2,总的来说就是节点的增删改查。
但是ZooKeeper只有增删改查节点这么简单么,肯定不是。首先ZooKeepr是可以集群的,为什么集群呢?当然是为了可以对外提供更高性能的服务,而且我在一台机器上增删改后的数据在其它机器上最终是可以查到的——这是ZooKeeper内部实现的,这和MySQL的主从复制又有点像,ZooKeeper是没有固定主库的(ZooKeer中叫Leader节点,由选举产生),Leader宕机之后,只要集群中超过半数机器可以工作,集群会选举出新的Leader并正常对外提供服务。像这样分布式环境下,多个机器持久化的同一份数据通常被称作数据副本,多个副本数据保持一致的特性叫分布式数据一致性,一致性和可用性、分区容错性的关系有CAP、BASE等相关的理论,这些我们会在第一篇分布式架构详细介绍,关于ZooKeeper具体如何实现的分布式数据一致性我们会在第四篇ZAB协议做详细介绍。当然ZooKeepr主要也不是做数据存储使用的,这里拿MySQL只是做类比说明。
But分布式数据一致性服务是ZooKeeper内部封装,作为外部服务是无需关注的,那ZooKeepr还有什么其它特性吗?那就是Watcher监听机制,既我们不但可以用客户端在ZooKeeper服务器增删改查节点还可以向服务器对这些节点的变动注册监听器,一旦节点状态发生了变动(比如节点被更新或者被删除),服务器就会发送通知给当初前来注册的客户端。这个机制也就是ZooKeeper被用来实现分布式协调服务的重要特性,我们会在第三篇Watcher—数据变更的通知中介绍。
以上就是关于ZooKeepr整体的介绍,核心内容是ZooKeeper内部的分布式数据一致性解决方案和对外提供的分布式协调服务,同时也提及了这篇总结的大体内容。这篇总结是对《从Paxos到ZooKeeper分布式一致性原理与实践》一书的归纳整理,绝大内容大部分来自书里,自己对部分内容做了标注和图解,总共分五篇,结构与原书略有不同,最后一篇是总结了一些ZooKeeper常见的面试题,目录如下。