写点什么

ZooKeeper 应用场景综述

作者:极客罗杰
  • 2023-12-02
    上海
  • 本文字数:1694 字

    阅读完需:约 6 分钟

ZooKeeper应用场景综述

相信使用过 zookeeper 的同学都觉得 zookeeper(简称 ZK)是万精油,知道有很多地方可以用它,但却未必知道它所有的应用场景并理解它们工作原理。今天我们就来聊聊 zookeeper 的应用场景同时附赠 ZK 实战小贴士。


一、zookeeper 介绍


ZooKeeper 是一个分布式的、开源的分布式应用程序协调服务。


Zookeeper 是一个高可用的分布式管理和协调框架,基于 ZAB(Zookeeper Atomic Broadcast)算法即原子消息广播协议的实现。可以在分布式环境中实现应用配置管理、统一命名服务、状态同步服务等功能。


ZooKeeper 包含一个简单的原语集,提供 Java 和 C 的编程接口。


Zookeeper 中的角色:


1 Leader 领导者


zookeeper 集群主节点,负责响应所有变更请求即写请求。


2 Follower 跟随者


响应读请求,处理 leader 提议,参与 leader 选举。


3 Observer 观察者


应用场景是在 zookeeper 集群读负载高,可部署 observer,响应读请求,但不参与 leader 选举。


Zookeeper 数据模型:



Zookeeper 中的节点(ZNode)类型:


1 短暂(ephemeral):会话结束后,节点不存在即生命周期是会话


2 持久(persistent):会话结束后,节点存在


目前官方最新 zookeeper 版本是 3.9.0。


二、Zookeeper 应用场景


1. 分布式协调


应用案例:kafka 集群


工作原理:kafka 利用 zookeeper 保存 broker 元数据,选举 leader



2. 数据存储/配置中心


应用案例:spring cloud zookeeper


工作原理:znode 文件系统+监听机制



3. 命名服务


应用案例:dubbo


工作原理:用路径作为名字,路径上的数据就是其名字指向的实体



4. 分布式锁


应用案例: Curator 分布式锁用于定时任务


工作原理: Curator 框架是封装对于 zk 操作的 api



它是一把可重入分布式锁,并通过 zk 客户端工具 zooInspector 观察,如下图所示:



5. 队列(发布/订阅)


应用案例: Curator 小吞吐量队列


工作原理: Zookeeper 实现 FIFO 队列,和共享锁实现类似,类似于一个全写的共享锁模型。


1、获取/Queue 节点下的所有子节点,获取队列中的所有元素


2、确定自己的节点序号在所有子节点中的顺序


3、如果自己的序号不是最小,那么就需要等待,同时向比自己序号小的最后一个节点注册 Watcher 监听


4、接收到 Watcher 通知后,重复第一个步骤



6. 负载均衡


应用案例:软负载


工作原理:每台工作服务器在启动时都会去 zookeeper 的维护服务器列表的节点下注册临时节点,每台客户端在启动时都会去这个节点下取得所有可用的工作服务器列表,并通过一定的负载均衡算法如:轮询算法,随机算法,计算得出一台工作服务器,并与之通信。



7. 生成分布式 id


应用案例: 订单编码


工作原理: 利用 ZooKeeper 数据模型中的顺序节点作为 ID 编码。客户端通过调用 zookeeper create 函数创建顺序节点。服务器成功创建节点后,会响应客户端请求,把创建好的节点信息发送给客户端。客户端用数据节点名称作为 ID 编码,进行之后的本地业务如:订单编码操作。



附赠:Zookeeper 实战小贴士


Zookeeper 命令分为基本命令和四字命令。


基本命令


服务器端


1 ./zkServer.sh status 查看 zk 的运行状态


客户端


1 ls 查看


2 get 获取节点数据和更新信息


3 stat 获得节点的更新信息


4 ls2 ls 命令和 stat 命令的整合


5 create 创建节点


6 set path data [version] 修改节点


7 stat path [watch] 设置 watch 事件


get path [watch] 获取 watch 事件


四字命令


1 stat 查看状态信息


echo stat | nc 192.168.0.68 2181


2 ruok 查看 zookeeper 是否启动


echo ruok | nc 192.168.0.68 2181


3 dump 列出没有处理的节点,临时节点


echo dump | nc 192.168.0.68 2181


4 conf 查看服务器配置


echo conf | nc 192.168.0.68 2181


5 cons 显示连接到服务端的信息


echo cons | nc 192.168.0.68 2181


6 mntr 查看 zk 的健康信息


echo mntr | nc 192.168.0.68 2181


7 envi 显示环境变量信息


echo envi | nc 192.168.0.68 2181


8 wchs 展示 watch 的信息


echo wchs | nc 192.168.0.68 2181


注意事项


1 部署集群节点个数最佳实践奇数个,如 3,5,7


2 开启自动日志清理,避免磁盘满


autopurge.snapRetainCount=5


autopurge.purgeInterval=12


Log4j.properties**


3 解决脑裂(split-brain)问题


  • 设置 Quorums 法定人数

  • 采用 Redundant communication 冗余通信即采用多种通信方式

  • Fencing(共享资源)方式


4 应用场景读并发量很高的情况下,考虑使用 observer

发布于: 刚刚阅读数: 7
用户头像

极客罗杰

关注

还未添加个人签名 2021-04-11 加入

还未添加个人简介

评论

发布
暂无评论
ZooKeeper应用场景综述_极客罗杰_InfoQ写作社区