目录
[Zookeeper 入门](#Zookeeper 入门)
[Znode(Zookeeper Node)](#Znode(Zookeeper Node))
Zookeeper****入门
概述
Zookeeper是一个分布式的、开放源码的协调服务,用于大型应用中管理和协调分布式环境下的进程。它提供了一套简单易用的API接口,使得开发者可以专注于应用程序的核心功能,而不需要关心底层的复杂实现细节。
Zookeeper的主要特点包括:
- 一致性:任何一台服务器上的客户端将看到同样的视图。
- 原子性:更新要么成功,要么失败,不会出现部分成功的状态。
- 单一视图:无论客户端连接到集群中的哪个服务器,其看到的服务视图都是一致的。
- 可靠性:一旦一个更新被确认,该更新将会被持久化。
- 实时性:客户端能够实时收到状态变更的通知。
Zookeeper的应用场景:
- 配置管理:集中存储和管理配置信息,简化配置同步过程。
- 命名服务:为分布式应用中的组件提供统一的命名服务。
- 集群管理:监控集群中的节点状态,实现动态调整。
- 分布式锁:提供协调机制,使得多个进程可以互斥地访问共享资源。
- 队列管理:实现分布式环境中任务的有序处理。
Zookeeper的基本概念:
- Znode(Zookeeper Node):Zookeeper中的数据单位,类似于文件系统中的文件和目录。
- 路径:每个znode都有一个唯一的路径来标识它。
- 临时节点:与会话关联的节点,会话结束时自动删除。
- 持久节点:创建后一直存在,除非手动删除。
- 顺序节点:创建时自动获得一个递增的序号作为路径的一部分。
架构:
Zookeeper通常以集群模式运行,集群中的每个服务器节点都保存着相同的数据副本。客户端可以通过任何一个服务器节点进行读写操作,并且能够通过心跳检测机制来保持与服务器之间的连接。
Zookeeper工作机制
Zookeeper的工作机制主要包括以下几个关键点:
-
角色和状态:
- 角色:在Zookeeper的集群中,各个节点有领导者(Leader)、跟随者(Follower)和观察者(Observer)三种角色。
- 状态:服务器的状态包括领导(Leading)、跟随(Following)、观察(Observing)和寻找(Looking)四种状态。
-
原子广播:Zookeeper的核心是原子广播,这个机制保证了各个服务器之间的同步。实现这个机制的协议叫做Zab协议(Zookeeper Atomic Broadcast protocol)。Zab协议有两种模式:
- 恢复模式(Recovery选主):当集群中没有领导者时,所有服务器进入恢复模式,进行领导者选举。
- 广播模式(Broadcast同步):在领导者选举完成之后,集群进入广播模式,进行正常的读写操作。
-
事务ID号(zxid):为了保证事务的顺序一致性,Zookeeper采用了递增的事务ID号(zxid)来标识事务。所有的提议(proposal)都在被提出的时候加上了zxid。
-
Leader选举:当领导者崩溃或者领导者失去大多数的跟随者时,Zookeeper进入恢复模式,需要重新选举出一个新的领导者,让所有的服务器都恢复到一个正确的状态。Zookeeper的选举算法有两种:
- 基于Basic Paxos实现的
- 基于Fast Paxos算法实现的
Paxos算法概述:从Basic Paxos到Fast Paxos及在Zookeeper中的应用
-
Znode数据模型:Zookeeper底层是一个树形结构的数据模型,用于数据的存储。每个节点称为Znode,它可以包含数据以及子节点。Znode有两种类型:持久节点和临时节点。持久节点即使在创建它的客户端会话结束之后仍然存在;临时节点则会在客户端会话结束时被删除。
-
Watcher监听机制:Zookeeper提供了数据的发布订阅功能,客户端可以注册Watcher来监听特定Znode的变化,如节点内容变化、子节点列表变化等。当被监听的Znode发生改变时,Zookeeper会主动通知客户端。
-
API应用:Zookeeper提供了一系列的API来支持客户端进行数据的读取、写入、创建节点等操作。
Zookeeper数据结构
Zookeeper的数据结构是一种类似文件系统的层次结构,用于存储和管理数据。这种结构被称为Znode(Zookeeper Node)树。下面是关于Zookeeper数据结构的一些关键点:
Znode(Zookeeper Node)
Znode是Zookeeper中的数据单元,它类似于文件系统中的文件和目录。每个Znode都有一个唯一的路径来标识它,并且可以存储少量的数据(最大限制为1MB)。Znode还可以拥有子节点,就像文件系统中的目录可以包含文件和其他目录一样。
Znode的类型
Znode有两种主要类型:
-
持久节点(Persistent Node):
- 创建后一直存在,直到显式删除。
- 即使创建它的客户端会话结束,节点仍然保留。
-
临时节点(Ephemeral Node):
- 与创建它的客户端会话绑定。
- 当客户端会话结束时,该节点自动被删除。
每种类型的节点还可以进一步细分为两种:
- 顺序节点(Sequential Node) :
- 创建时,Zookeeper会在节点名称的末尾添加一个递增的数字。
- 这样可以确保节点的创建顺序,并且可以用来实现一些特殊的功能,如分布式锁。
Znode路径
每个Znode都有一个唯一的路径来标识它,路径格式类似于Unix文件系统的路径。例如,/app/config
是一个Znode的路径,表示它位于/app
目录下。
Znode属性
除了数据之外,每个Znode还具有一些元数据属性,包括但不限于:
- Acl(Access Control List):控制哪些客户端可以对该节点执行何种操作。
- Stat(Status):提供有关节点状态的信息,如版本号、创建时间和最后修改时间等。
Watcher监听器
Zookeeper提供了一种称为Watcher的机制,允许客户端注册监听器来监听特定Znode的更改。当被监听的Znode发生变化时(例如,数据更改、子节点的增加或删除),Zookeeper会异步地通知注册了Watcher的客户端。
使用示例
假设你有一个Zookeeper集群,你可以在根路径/
下创建一个持久节点/app
,并在其下创建一个临时节点/app/server1
。你还可以在/app
节点下创建一个带有顺序的子节点/app/leader-0000000001
。这样的结构可以用于实现简单的服务发现或者作为分布式锁的基础。
总结
Zookeeper的数据结构是一种层次化的树状结构,由Znode组成。Znode可以存储数据、具有不同的生命周期,并且可以注册Watcher来监听状态变化。这种结构非常适合于构建分布式协调服务,如配置管理、服务发现、分布式锁等。