Zookeeper简介及核心概念
This commit is contained in:
parent
adba3d0602
commit
7cb7bcae27
@ -24,7 +24,7 @@
|
||||
|
||||
## 一、Zookeeper简介
|
||||
|
||||
Zookeeper是一个开源的分布式协调服务,由雅虎创建,是Google Chubby的开源实现。Zookeeper可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。Zookeeeper可以保证如下的分布式一致性特性:
|
||||
Zookeeper是一个开源的分布式协调服务,目前由Apache进行维护。Zookeeper可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master选举、分布式锁和分布式队列等功能。它具有以下特性:
|
||||
|
||||
+ **顺序一致性**:从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到Zookeeper中;
|
||||
+ **原子性**:所有事务请求的处理结果在整个集群中所有机器上都是一致的;不存在部分机器应用了该事务,而另一部分没有应用的情况;
|
||||
@ -46,7 +46,7 @@ Zookeeper通过树形结构来存储数据,它由一系列被称为ZNode的数
|
||||
|
||||
### 2.2 目标二:构建集群
|
||||
|
||||
可以由一组Zookeeper服务构成Zookeeper服务集群,集群中每台机器都会单独在内存中维护自身的状态,并且每台机器之间都保持着通讯,只要集群中有半数机器能够正常工作,那么整个集群就可以正常提供服务。
|
||||
可以由一组Zookeeper服务构成Zookeeper集群,集群中每台机器都会单独在内存中维护自身的状态,并且每台机器之间都保持着通讯,只要集群中有半数机器能够正常工作,那么整个集群就可以正常提供服务。
|
||||
|
||||
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/zookeeper-zkservice.jpg"/> </div>
|
||||
|
||||
@ -72,16 +72,16 @@ Zookeeper集群中的机器分为以下三种角色:
|
||||
|
||||
### 3.2 会话
|
||||
|
||||
在实际使用中,Zookeeper客户端通过TCP长连接连接到服务集群,会话(Session)从第一次连接开始就已经建立,之后通过心跳检测机制来保持有效的会话状态。通过这个连接,客户端可以发送请求并接收响应,同时也可以接收到对应Watch事件的通知。
|
||||
Zookeeper客户端通过TCP长连接连接到服务集群,会话(Session)从第一次连接开始就已经建立,之后通过心跳检测机制来保持有效的会话状态。通过这个连接,客户端可以发送请求并接收响应,同时也可以接收到Watch事件的通知。
|
||||
|
||||
关于会话中另外一个核心的概念是sessionTimeOut(会话超时时间),当由于网络故障或者客户端主动断开等原因,导致连接断开,此时只要在会话超时时间之内重新建立连接,则之前创建的会话依然有效。
|
||||
|
||||
### 3.3 数据节点
|
||||
|
||||
Zookeeper数据模型是由一系列基本数据单元Znode(数据节点)组成的节点树,其中根节点为`/`。每个节点上都会保存自己的数据和节点信息。Zookeeper中节点可以分为两大类:
|
||||
Zookeeper数据模型是由一系列基本数据单元`Znode`(数据节点)组成的节点树,其中根节点为`/`。每个节点上都会保存自己的数据和节点信息。Zookeeper中节点可以分为两大类:
|
||||
|
||||
+ 持久节点 :节点一旦创建,除非被主动删除,否则一直存在;
|
||||
+ 临时节点 :一旦创建该节点的客户端会话失效,则所有该客户端创建的临时节点都会被删除。
|
||||
+ **持久节点** :节点一旦创建,除非被主动删除,否则一直存在;
|
||||
+ **临时节点** :一旦创建该节点的客户端会话失效,则所有该客户端创建的临时节点都会被删除。
|
||||
|
||||
临时节点和持久节点都可以添加一个特殊的属性:`SEQUENTIAL`,代表该节点是否具有递增属性。如果指定该属性,那么在这个节点创建时,Zookeeper会自动在其节点名称后面追加一个由父节点维护的递增数字。
|
||||
|
||||
@ -111,11 +111,11 @@ Zookeeper中一个常用的功能是Watcher(事件监听器),它允许用户
|
||||
|
||||
Zookeeper采用ACL(Access Control Lists)策略来进行权限控制,类似于UNIX文件系统的权限控制。它定义了如下五种权限:
|
||||
|
||||
- CREATE:允许创建子节点;
|
||||
- READ:允许从节点获取数据并列出其子节点;
|
||||
- WRITE:允许为节点设置数据;
|
||||
- DELETE:允许删除子节点;
|
||||
- ADMIN:允许为节点设置权限。
|
||||
- **CREATE**:允许创建子节点;
|
||||
- **READ**:允许从节点获取数据并列出其子节点;
|
||||
- **WRITE**:允许为节点设置数据;
|
||||
- **DELETE**:允许删除子节点;
|
||||
- **ADMIN**:允许为节点设置权限。
|
||||
|
||||
|
||||
|
||||
@ -123,9 +123,9 @@ Zookeeper采用ACL(Access Control Lists)策略来进行权限控制,类似于U
|
||||
|
||||
### 4.1 ZAB协议与数据一致性
|
||||
|
||||
ZAB协议是Zookeeper专门设计的一种支持崩溃恢复的原子广播协议,Zookeeper通过它来实现分布式数据的一致性。基于该协议,Zookeeper实现了一种主从模式的系统架构来保持集群中各个副本之间数据的一致性。具体如下:
|
||||
ZAB协议是Zookeeper专门设计的一种支持崩溃恢复的原子广播协议。通过该协议,Zookeepe基于主从模式的系统架构来保持集群中各个副本之间数据的一致性。具体如下:
|
||||
|
||||
Zookeeper使用一个单一的主进程来接收并处理客户端的所有事务请求,并采用原子广播协议将数据的状态变更以事务Proposal的形式广播到所有的副本进程上去。如下图:
|
||||
Zookeeper使用一个单一的主进程来接收并处理客户端的所有事务请求,并采用原子广播协议将数据状态的变更以事务Proposal的形式广播到所有的副本进程上去。如下图:
|
||||
|
||||
<div align="center"> <img src="https://github.com/heibaiying/BigData-Notes/blob/master/pictures/zookeeper-zkcomponents.jpg"/> </div>
|
||||
|
||||
@ -155,9 +155,9 @@ Leader服务会为每一个Follower服务器分配一个单独的队列,然后
|
||||
|
||||
### 5.1数据的发布/订阅
|
||||
|
||||
数据发布/订阅系统,即所谓的配置中心。在分布式系统中,你可能有成千上万个服务节点,如果想要对所有服务的某项配置进行更改,由于数据节点过多,你不可逐台进行修改,而应该在设计时采用统一的配置中心。之后发布者只需要将变更后的配置发送到配置中心,所有服务节点即可自动下载并进行变更,从而实现配置的集中管理和动态更新。
|
||||
数据的发布/订阅系统,通常也用作配置中心。在分布式系统中,你可能有成千上万个服务节点,如果想要对所有服务的某项配置进行更改,由于数据节点过多,你不可逐台进行修改,而应该在设计时采用统一的配置中心。之后发布者只需要将新的配置发送到配置中心,所有服务节点即可自动下载并进行更新,从而实现配置的集中管理和动态更新。
|
||||
|
||||
Zookeeper通过Watcher机制可以实现数据的发布和订阅。分布式系统的所有的服务节点可以对某个ZNode注册监听,之后只需要将变更的配置写入该ZNode,之后所有服务节点都会收到该变更事件的信息。
|
||||
Zookeeper通过Watcher机制可以实现数据的发布和订阅。分布式系统的所有的服务节点可以对某个ZNode注册监听,之后只需要将新的配置写入该ZNode,所有服务节点都会收到该事件。
|
||||
|
||||
### 5.2 命名服务
|
||||
|
||||
@ -165,13 +165,13 @@ Zookeeper通过Watcher机制可以实现数据的发布和订阅。分布式系
|
||||
|
||||
### 5.3 Master选举
|
||||
|
||||
分布式系统一个重要的模式就是主从模式(Master/Salves),Zookeeper可以用于该模式下的Matser选举。可以让所有服务节点去竞争性地创建同一个ZNode,由于Zookeeper的强一致性,必然只有一个服务节点能够创建成功,这样该服务节点就可以成为Master节点。
|
||||
分布式系统一个重要的模式就是主从模式(Master/Salves),Zookeeper可以用于该模式下的Matser选举。可以让所有服务节点去竞争性地创建同一个ZNode,由于Zookeeper不能有路径相同的ZNode,必然只有一个服务节点能够创建成功,这样该服务节点就可以成为Master节点。
|
||||
|
||||
### 5.4 分布式锁
|
||||
|
||||
可以通过Zookeeper的临时节点和Watcher机制来实现分布式锁,这里以排它锁为例进行说明:
|
||||
|
||||
分布式系统的所有服务节点可以竞争性地去创建同一个临时节点,由于Zookeeper的强一致性,必然只有一个服务节点能够创建成功,此时可以认为该节点获得了锁。其他没有获得锁的服务节点通过在该节点上注册监听,从而当锁释放时再去竞争获得锁。锁的释放情况有以下两种:
|
||||
分布式系统的所有服务节点可以竞争性地去创建同一个临时ZNode,由于Zookeeper不能有路径相同的ZNode,必然只有一个服务节点能够创建成功,此时可以认为该节点获得了锁。其他没有获得锁的服务节点通过在该ZNode上注册监听,从而当锁释放时再去竞争获得锁。锁的释放情况有以下两种:
|
||||
|
||||
+ 当正常执行完业务逻辑后,客户端主动将创建的临时节点删除,此时锁被释放;
|
||||
|
||||
@ -186,9 +186,13 @@ Zookeeper还能解决大多数分布式系统中的问题:
|
||||
+ 如可以通过创建临时节点来建立心跳检测机制,如果分布式系统的某个服务节点宕机了,则该临时节点会被删除,此时通过监听机制就能知道该服务已经宕机;
|
||||
+ 分布式系统的每个服务节点还可以将自己的节点状态写入临时节点,从而完成状态报告或节点工作进度汇报;
|
||||
+ 通过数据的订阅和发布功能,Zookeeper还能对分布式系统进行模块的解耦和任务的调度;
|
||||
+ 通过监听机制,还能对分布式系统的服务节点进行动态上下线,从而服务的动态扩容。
|
||||
|
||||
|
||||
+ 通过监听机制,还能对分布式系统的服务节点进行动态上下线,从而实现服务的动态扩容。
|
||||
|
||||
|
||||
|
||||
## 参考资料
|
||||
|
||||
1. 倪超 . 从Paxos到Zookeeper——分布式一致性原理与实践 . 电子工业出版社 . 2015-02-01
|
||||
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user