> For the complete documentation index, see [llms.txt](https://xiaoxiami.gitbook.io/zookeeper/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://xiaoxiami.gitbook.io/zookeeper/master.md).

# 什么Zookeeper

> 什么是分布式系统？
>
> * 很多台计算机组成一个整体，一个整体一致对外并且处理同一请求
> * 内部的每台计算机偶可以相互通信（rest/rpc）
> * 客户端到服务端的一次请求到响应结束会历经多台计算机

Zookeeper是一个分布式开源框架，提供了协调分布式应用的基本服务，它向外部应用暴露一组通用服务——分布式同步（Distributed Synchronization）、命名服务（Naming Service）、集群维护（Group Maintenance）等，简化分布式应用协调及其管理的难度，提供高性能的分布式服务。ZooKeeper本身可以以单机模式安装运行，不过它的长处在于通过分布式ZooKeeper集群（一个Leader，多个Follower），基于一定的策略来保证ZooKeeper集群的稳定性和可用性，从而实现分布式应用的可靠性。

* 1、zookeeper是为别的分布式程序服务的
* 2、Zookeeper本身就是一个分布式程序（只要有半数以上节点存活，zk就能正常服务）
* 3、Zookeeper所提供的服务涵盖：主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务等
* 4、虽然说可以提供各种服务，但是zookeeper在底层其实只提供了两个功能：
  * 管理(存储，读取)用户程序提交的数据（类似namenode中存放的metadata）；&#x20;
  * 并为用户程序提供数据节点监听服务；

## Zookeeper集群机制

Zookeeper集群的角色： Leader 和 follower

只要集群中有半数以上节点存活，集群就能提供服务

## Zookeeper特性

* 1、Zookeeper：一个leader，多个follower组成的集群
* 2、全局数据**一致性**：每个server保存一份相同的数据副本，client无论连接到哪个server，数据都是一致的
* 3、分布式读写，更新请求转发，由leader实施
* 4、更新请求顺序进行，来自同一个client的更新请求按其发送**顺序依次执行**
* 5、数据更新**原子性**，一次数据更新要么成功，要么失败
* 6、**实时性**，在一定时间范围内，client能读到最新数据

## Zookeeper数据结构

* 1、层次化的目录结构，命名符合常规文件系统规范(类似文件系统）&#x20;

![](/files/-LfnTMRb8Vn24uIRH-x1)

* 2、每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
* 3、节点Znode可以包含数据和子节点（但是EPHEMERAL类型的节点不能有子节点）

节点类型

> a、Znode有两种类型：
>
> 短暂（ephemeral）（create -e /app1/test1 “test1” 客户端断开连接zk删除ephemeral类型节点）
>
> 持久（persistent） （create -s /app1/test2 “test2” 客户端断开连接zk不删除persistent类型节点）
>
> b、Znode有四种形式的目录节点（默认是persistent ）
>
> PERSISTENT
>
> PERSISTENT\_SEQUENTIAL（持久序列/test0000000019 ）
>
> EPHEMERAL
>
> EPHEMERAL\_SEQUENTIAL
>
> c、创建znode时设置顺序标识，znode名称后会附加一个值，顺序号是一个单调递增的计数器，由父节点维护
>
> ![](/files/-LfnTMRdo4vu5c08UdHs)
>
> d、在分布式系统中，顺序号可以被用于为所有的事件进行全局排序，这样客户端可以通过顺序号推断事件的顺序
