isHooky 2020-06-25
关于Zookeeper名字的来源
Zookeeper由雅虎研究院开发,开发团队原来想使用动物命名项目,在讨论时大家觉得分布式系统就像一个动物园,胡乱且难以管理,而Zookeeper就是将这一切变得可控。遂起名为Zookeeper,意为动物园管理员。
命名服务是指通过路径名称来获取服务的地址。首先zookeeper创建一个全局路径,服务方在全局路径下写入服务的地址(或者名称),服务消费方在启动后watch全局路径的数据和变化。注意,这里的节点均为临时节点,在服务连接中断或者宕机时,通过临时节点消失能够通知订阅方感知变化。
服务分布部署在不同的机器上,将全局的配置信息存放于zookeeper的节点下,客户端通过订阅节点的数据变化获取到配置信息。当节点中的配置信息发生变化时,客户端可以通过watch节点发送的消息感知,从而修改服务本地的配置管理信息。
当有新机器加入集群时,由新机器的客户端在指定的目录下新建临时节点,服务注册管理端通过订阅指定目录的变化,收到了新增节点的通知后,将新机器加入集群服务的列表。当机器退出集群或者宕机时,临时节点将会被删除,同样可以通知服务注册管理端,有机器退出了集群。
zookeeper的分布式锁可以分为2种,保持独占或者控制时序。
对于保持独占来说,可以把一个节点看做是一把锁,通过创建节点的方式来抢占锁资源。如果创建节点成功,客户端也就持有了这把锁,如果创建失败,则订阅节点的变化,如果收到节点删除消息,再次尝试创建节点来抢占锁资源。
对于控制时序来说,通过在指定目录下创建临时有序节点,编号最小的节点首先持有锁资源,每个后续节点都订阅前一个节点。拥有锁资源的客户端在操作完毕后,删除自己创建的节点。后续节点收到前置节点的删除通知后,即获取了锁资源,可以进行业务操作。
Zookeeper通过节点(znode)来实现原语的功能,并不直接暴露原语。Znode指Zookeeper操作和维护一个小型的数据节点,类似于文件系统的层级树状结构进行管理。
图:Zookeeper数据结构示例
· /作为跟目录节点,根节点下有/workers和/tasks两个字节点。
· /workers节点作为父节点,其下的每一个znode子节点用于保存系统中的可用worker,节点中保存着worker子节点的元数据信息。
· /tasks节点作为父节点,其下每个znode子节点用于保存一个代执行的任务,节点中保存着任务的详细数据。
ZookeeperAPI提供了以下方法来实现地znode的控制。
create /path data
创建一个名为/path的znode节点,并包含数据data。
delete /path
删除名为/path的znode。
exists /path
检查是否存在名为/path的节点。
setData /path data
设置名为/path的znode节点的数据为data。
getData /path
返回名为/path节点的数据信息。
getChildren /path
返回所有/path节点的所有子节点列表。
在新建znode时,需要指定该节点类型,不同的类型决定了znode节点的行为方式,Zookeeper提供了4种不同的znode类型。
持久节点和临时节点
znode节点可以是持久(persistent)节点,还可以是临时(ephemeral)节点。持久的znode,如/path,只能通过delete来进行删除。临时的znode与之相反,当创建的客户端崩溃或者关闭了与Zookeeper的连接时,这个节点就会被删除。
持久znode是一种非常有用的znode,可以通过持久类型znode为应用保存一些数据,即使znode的创建者不再属于应用系统时,数据也可以保存下来而不丢失。例如,在主-从模式中,需要保存从节点的任务分配情况,即使分配任务的主节点已经崩溃了。
一个临时znode,在以下两种情况会被删除:
注:因为临时的znode在其创建者的会话过期时被删除,所以我们现在不允许临时节点拥有子节点。
有序节点
一个有序znode节点被分配唯一一个单调递增的整数。当创建有序节点时,一个序号会被追加到路径之后。例如,客户端创建一个有序znode节点,其路径为/tasks/task-,那么该znode节点为/tasks/task-1。有序znode通过提供了创建具有唯一名称的znode的简单方式。同时也通过这种方式可以直观地查看znode的创建顺序。
Znode一共有四种:持久节点、临时节点、持久有序节点,临时有序节点。
Zookeeper提供基于通知的机制提供对节点的监视能力。客户端向Zookeeper注册需要接收通知的znode,通过对znode的设置监视点(watch)来接收通知。监视点是一个单次触发的操作,每次设置只会触发一次。为了接收多个通知,客户端必须在每次通知后设置新的监视点。在设置新监视点前客户端会先读取znode中的数据,所以不同担心会错过状态的变化。
Zookeeper可以定义不同类型的通知,如监控znode的数据变化、监控znode子节点的变化、监控znode的创建或删除。