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
版权声明: 本文为 InfoQ 作者【极客罗杰】的原创文章。
原文链接:【http://xie.infoq.cn/article/1ca3a0dd8ce3db45c3da0489d】。文章转载请联系作者。
评论