# Zookeeper应用场景

* 数据发布订阅
* 负载均衡
* 命名服务
* 分布式协调
* 集群管理
* 统一配置文件管理
* 分布式队列
* 分布式锁
* master节点选举

## 数据发布订阅

发布与订阅，类似于消息队列MQ（amq，rmq..）,dubbo发布者把数据存储在znode上，订阅者会读取这个数据。

[Zookeeper的数据发布与订阅模式](https://blog.csdn.net/ZuoAnYinXiang/article/details/50937892)

## 统一命名服务

分布式环境下，经常需要对应用/服务进行统一命名，便于识别不同服务。类似于域名与ip之间对应关系，域名容易记住。通过名称来获取资源或服务的地址，提供者等信息按照层次结构组织服务/应用名称可将服务名称以及地址信息写到Zookeeper上，客户端通过Zookeeper获取可用服务列表类。

## 统一配置文件管理

分布式环境下，配置文件管理和同步是一个常见问题。一个集群中，所有节点的配置信息是一致的，比如Hadoop。对配置文件修改后，希望能够快速同步到各个节点上配置管理可交由Zookeeper实现。可将配置信息写入Zookeeper的一个znode上。各个节点监听这个znode。一旦znode中的数据被修改，zookeeper将通知各个节点。

> 统一配置管理，即只需要部署一台服务器，则可以把相同的配置文件同步更新到其他所有服务器，此操作爱云计算中用的特别多，如redis统一配置。
>
> 如下微服务中，部署了多台服务，并且都使用了redis，使用zookeeper，当修改了redis的配置，则可以只修改一台电脑，然后通过这一台电脑再分发到其他的电脑。
>
> ![](https://2663285815-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT31deyW842ExZVDh%2F-LfnTAqGO4YVUXXW5O6w%2F-LfnTJmvGMy_dycvvjyS%2F1.png?generation=1558862984146251\&alt=media)

## 集群管理

分布式环境中，实时掌握每个节点的状态是必要的。可根据节点实时状态作出一些调整。Zookeeper可将节点信息写入Zookeeper的一个znode上。监听这个znode可获取它的实时状态变化。典型应用比如Hbase中Master状态监控与选举。

## 分布式通知/协调

分布式环境中，经常存在一个服务需要知道它所管理的子服务的状态。例如，NameNode须知道各DataNode的状态，JobTracker须知道各TaskTracker的状态。心跳检测机制和信息推送也是可通过Zookeeper实现。

## 分布式锁

Zookeeper是强一致的。多个客户端同时在Zookeeper上创建相同znode，只有一个创建成功。Zookeeper实现锁的独占性。多个客户端同时在Zookeeper上创建相同znode ，创建成功的那个客户端得到锁，其他客户端等待。Zookeeper 控制锁的时序。各个客户端在某个znode下创建临时znode （类型为CreateMode. EPHEMERAL \_SEQUENTIAL），这样，该znode可掌握全局访问时序。

> 提供分布式锁，分布式环境中不同进程之间争夺资源，类似于多线程中的锁。

## 分布式队列

两种队列。当一个队列的成员都聚齐时，这个队列才可用，否则一直等待所有成员到达，这种是同步队列。队列按照 FIFO 方式进行入队和出队操作，例如实现生产者和消费者模型。（可通过分布式锁实现）

同步队列。一个job由多个task组成，只有所有任务完成后，job才运行完成。可为job创建一个/job目录，然后在该目录下，为每个完成的task创建一个临时znode，一旦临时节点数目达到task总数，则job运行完成。

## master节点选举

master节点选举，节点挂了以后，从节点就会接手工作，并且保证这个节点是唯一 ，这也是所谓首脑模式，从而保证我们 集群是高可用。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xiaoxiami.gitbook.io/zookeeper/chapter1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
