tylderen +

分布式系统的管理员 ZooKeeper (一) 介绍

背景

在调研或使用一些分布式系统的解决方案时,常常会发现ZooKeeper的身影,只知道它的主要功能是为分布式系统提供一致性协调(Coordination)服务。用得多了,就开始有兴趣想去了解它是怎样在分布式系统中起作用的,它自身是如何设计和实现的,所以就有了关于ZooKeeper的这一系列文章。

介绍

顾名思义,ZooKeeper(“动物园管理员”),起这个名字,查了下是因为ZooKeeper是Hadoop下面的一个子项目, 用来协调跟Hadoop相关的一些分布式的框架,如Hadoop, Hive, Pig等, 其实它们都是动物,ZooKeeper又是为了管理它们, 所以就叫这个名字了。 只是现在Zookeeper不仅仅在这些以动物命名的系统中使用,已经广泛的应用在其他分布式系统中了。

在介绍ZooKeeper的应用场景前,有必要先简单介绍一下它自身的一些实现。

应用场景

ZooKeeper本身可以以一个单一进程的方式启动,也可以以一组ZooKeeper进程作为一个集群启动。 很明显,以集群的方式启动,会提高整个Zookeeper服务的可靠性,当然配置也复杂些,但是一些优秀的特性也是只有Zookeeper作为一个集群才能给我们提供的。

ZooKeeper的使用场景,主要在分布式系统管理和协调中,细分下来,常见的大概有这么几个:

互斥锁

单一的应用环境,线程、进程的同步,都可以通过操作系统提供的同步机制来完成。但是在分布式系统中,多台机器多个进程之间的同步,靠操作系统就没办法了。这时候就需要像ZooKeeper这样的分布式的协调(Coordination)服务来协助完成同步,原理和单一进程下的锁机制还是很像的:

这个时候,如果zookeeper是以集群的方式部署的,那么这个锁就是分布式锁,分布式锁的实现方式有不少,接下来的文章我们会对比一下ZooKeeper的分布式锁和Redis实现的分布式锁。

集群选Master

我们现在很多的分布式系统都是mater/slave结构,一般会有一台为master,其余的都是slave,不同角色负责的任务不同。master一般来说承担的责任更大,所以一旦master挂掉能够马上从slave中选出一个master作为替代,对于系统的稳定性是至关重要的。

具体来说,使用ZooKeeper来为集群选master,可以这样做:集群里的每台机器在启动的时候可以在ZooKeeper里创建类型为EPHEMERAL_SEQUENTIAL的节点(创建的节点路径可以用自己机器所在的IP等和其他机器进行区分),这样每个节点会自动被编号。 可以规定编号最小或者最大的为master,当我们对这些节点做监控的时候,得到服务器列表,只要所有集群机器逻辑认为最小或最大编号节点为master,那么master就被选出,而这个master宕机的时候,相应的znode会消失,然后新的服务器列表就被推送到客户端,然后每个节点逻辑认为最小或最大编号节点为master,这样就做到动态master选举。

Blog

Opinion

Project