在分布式系统的构建和管理中,数据的同步、序列化和协调是至关重要的。Apache ZooKeeper,作为一个集中式的存储库,允许分布式应用程序存储和检索数据,使得整个分布式系统能够协同工作。ZooKeeper可以被视作一个文件系统,其中的节点用于存储数据,而非文件或目录。它是一个Hadoop管理员工具,用于在集群中管理作业。
Apache ZooKeeper的正式定义表明,它是一个分布式的、开源的配置和同步服务,同时也是分布式应用的名称注册服务。它被用来管理和协调大量的机器集群。例如,Twitter使用的Apache Storm,用于存储机器状态数据,将Apache ZooKeeper作为机器之间的协调器。
在Hadoop中,分布式应用程序由于连接到网络的机器数量众多,因此更难以协调和处理,因为它们更容易出现错误。由于涉及的机器众多,竞态条件和死锁是实现分布式应用程序时常见的问题。竞态条件发生在一台机器尝试同时执行两个或更多操作时,这可以通过ZooKeeper的序列化特性来解决。
死锁发生在两台或多台计算机尝试同时访问同一共享资源时。更准确地说,它们试图访问彼此的资源,这导致死锁,因为没有一个系统释放资源,而是等待另一个系统释放。ZooKeeper中的同步功能有助于解决死锁问题。分布式应用程序的另一个主要问题是部分进程失败,导致数据不一致。ZooKeeper通过原子性处理这个问题,意味着要么整个进程终止,要么失败后什么也不留下。因此,ZooKeeper是Hadoop的重要组成部分,它处理这些小但重要的事务,以便开发者可以更专注于应用程序的功能。
HadoopZooKeeper架构是一个遵循简单客户端-服务器模型的分布式应用程序,其中客户端是消耗服务的节点,服务器是提供服务的节点。多个服务器节点统称为ZooKeeper文件。ZooKeeper客户端在任何给定时间至少使用一个服务器。
主节点是基于集合内的共识动态选择的,因此ZooKeeper文件通常是奇数,以确保大多数投票。如果主节点失败,另一个主节点会立即被选中并接管前一个主节点。除了主节点和从节点,ZooKeeper中还有观察者。引入观察者是为了解决扩展问题。增加从节点影响了写入性能,因为投票过程成本较高。观察者因此是不参与投票的从节点,但与其他从节点有类似的职责。
在ZooKeeper架构中,所有写入操作都通过主节点进行,因此所有写入操作都保证是顺序的。当对ZooKeeper执行写入操作时,每个连接到该客户端的服务器都与主服务器一起存储数据。这使得所有服务器都与数据保持更新。然而,这也意味着不能执行并发写入。线性写入保证如果ZooKeeper用于主要写入负载可能会有问题。
ZooKeeper在Hadoop中理想地用于协调客户端之间的消息交换,这涉及到较少的写入和更多的读取。ZooKeeper在数据共享时很有用,但如果应用程序有并发数据写入,ZooKeeper可能会碍事并强加严格的操作顺序。
ZooKeeper在读取方面最擅长,因为读取可以并发进行。并发读取之所以能够执行,是因为每个客户端都连接到不同的服务器,所有客户端都可以同时从服务器读取。然而,并发读取会导致最终一致性,因为主服务器没有参与。可能会出现客户端可能有过时视图的情况,但会在小延迟后更新。
如何使用Apache ZooKeeper构建分布式应用程序?ZooKeeper架构完成了上述所有细节,用户不需要做任何事情。一个指挥官被选择,观察者被设置,为用户使用ZooKeeper做好了准备。与早期用户相比,ZooKeeper可以被用作一个文件系统,其中可以创建目录并存储数据。像任何其他文件系统一样,上述创建的目录也可以有子目录和孙目录。这个文件系统是集中存储的,并且可以从任何地方访问。
Apache ZooKeeper的一个例子可能是一个数据模型。在例子中,每个目录被称为ZooKeeper中的一个znode。存储统计数据,如版本详情和用户数据,大小高达1 Mb。这个小信息存储空间清楚地表明ZooKeeper不是用来像数据库那样存储数据的,而是用来存储少量数据,如必须共享的配置数据。
有两种类型的znode:
安装Apache ZooKeeper
以下是下载和安装ZooKeeper 3.4.6的步骤,配置3个ZooKeeper节点:
tar -zxvf zookeeper-3.4.6.tar.gz
解压tarball。mkdir /usr/local/zookeeper/data
创建目录。可以作为root创建此目录,并将所有者更改为需要的任何用户。sudo vi /usr/local/zookeeper/conf/zoo.cfg
创建ZooKeeper配置文件,并插入以下代码:
tickTime = 2000
syncLimit = 5
dataDir = /usr/local/zookeeper/data
clientPort = 2181
server.1 = Master : 2888 : 3888
server.2 = Slave1 : 2888 : 3888
server.3 = Slave2 : 2888 : 3888
sudo vi /usr/local/zookeeper/data/myid
在数据文件夹中创建一个名为myid的文件,并在此文件中写入“1”(不带引号)并保存。zkServer.sh start
命令在所有服务器上启动ZooKeeper。jps
并检查QuorumPeerMain。zkCli.sh -server Slave1:2181
命令启动客户端。使用ZooKeeper
以下是如何使用ZooKeeper的几点说明:
结论