Zookeeper入门
Posted JTang_java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zookeeper入门相关的知识,希望对你有一定的参考价值。
Zookeeper入门
文章目录
- Zookeeper入门
- 一、Zookeeper是什么?
- 二、Zookeeper linux 服务端集群搭建步骤
- 三、Zookeeper Java客户端搭建步骤
- 四、ZooKeeper 数据模型 znode 结构
- 五、ZooKeeper应用场景
- 六、Zookeeper 权限控制 ACL访问控制表
- 七、Zookeeper 数据同步ZAB
- 八、Zookeeper Leader 选举原理
- 九、Zookeeper 分布式锁实现原理
- 十、面试问题
- 总结
一、Zookeeper是什么?
- 开放源码
- 为分布式框架提供协调服务的apache项目
- 观察者模式
- 一主多从结构
- 实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能
一个最常用的场景:担任服务器生产者和消费者的注册中心(生产者将服务注册到zookeeper中心,消费者进行调用时再去查找),比如Dubbo的注册中心,用zookeeper对solr集群进行管理,可实现负载均衡、配置文件的管理,是集群的入口
二、Zookeeper linux 服务端集群搭建步骤
- 在centos中创建三台虚拟机,安装好zookeeper 环境(可使用Xftp7上传),安装好 java 开发工具包 JDK
- 创建zookeeper数据存储目录
- 修改zookeeper配置文件
- 进入zookeeper安装目录下的bin目录 sh zkServer.sh start 命令启动zookeeper
参考https://blog.csdn.net/weixin_44854986/article/details/120068977
三、Zookeeper Java客户端搭建步骤
zookeeper比较常用的Java客户端有zkclient、curator。
- idea工具添加org.apache.zookeeper依赖
- 使用 zookeeper 原生 API,连接上一教程搭建的三台服务组成的集群,因为连接需要时间,用 countDownLatch 阻塞,等待连接成功,控制台输出连接状态!
- zookeeper 客户端框架curator连接
参考https://www.runoob.com/w3cnote/zookeeper-java-setup.html
四、ZooKeeper 数据模型 znode 结构
我们直观的看到此时存储的数据在根目录下存在 runoob 和 zookeeper 两个节点,zookeeper 节点下存在 quota 这个节点。
- znode以 key/value 形式存储数据
- 同一级节点 key 名称是唯一的
- 创建节点时,必须要带上全路径,eg:create /runoob/child/ch01 0
- watch 机制,监听节点变化
- delete 命令只能一层一层删除
- 节点存放数据上限1M
事件监听机制类似于观察者模式,watch 流程是客户端向服务端某个节点路径上注册一个 watcher,同时客户端也会存储特定的 watcher,当节点数据或子节点发生变化时,服务端通知客户端,客户端进行回调处理。特别注意:监听事件被单次触发后,事件就失效了。
五、ZooKeeper应用场景
1、统一配置管理
问题: 系统1、2、3分别有配置文件1、2、3,3个配置文件中有很多类似部分,如果修改配置有可能会3个文件都修改,而且还可能会重启才能生效。
解决: 抽取相同部分common.yml作为他们共同的配置文件,将common.yml放置在Znode节点中,3个系统对这个节点监听是否变更。
参考https://www.imooc.com/wiki/Zookeeper/zookeeperconfig.html
2、统一命名服务
跟域名差不多,假如定义一个名字,它是全局唯一的,它下面有很多台机器,别人访问机器时不是通过ip而是访问这个名字。
4、集群管理
包括集群监控、集群控制(监控集群机器的状态,机器挂了就剔除,新机器可添加,删除或添加后就发通知)
5、Master选举
利用节点唯一性,同时只有一个客户端能创建成功而作为选举使用,创建成功的就是master
6、数据订阅发布
就是配置中心,可动态从节点获取数据,并在节点注册一个watcher监听,实时监控以实现动态更新数据。
7、分布式锁
锁服务分为两类
- 保持独占:把znode视为锁,通过createznode实现,所有客户端都创建lock节点,成功创建的客户端拥有这把锁,用完即删。
- 控制时序:lock节点已存在,所有客户端在它下面创建临时顺序目录节点,和选master一样,编号最小的获得锁,用完即删,依次方便。
8、负载均衡
为了让高并发的请求能够平均的分配到集群中的每一个服务,避免有些服务压力过大,而有些服务处于空闲状态这样的情况,我们需要制定一些规则来把请求进行路由,这种分配请求的做法就叫做负载均衡,路由请求的规则就是负载均衡的策略。
- 轮询策略(默认):按照集群的顺序依次进行请求的分配,如此往复。可以将集群服务放到一个数组来循环分配请求
/**
* 轮询策略 Demo
*/
public class RoundRobinStrategy
public static void main(String[] args)
// 模拟 Server 地址列表
String[] serverList = "192.168.0.77","192.168.0.88","192.168.0.99";
// 模拟 5 次请求
for (int i = 0; i < 5; i++)
// 根据数组长度取模,顺序获取地址索引
int i1 = i % serverList.length;
// 根据索引获取服务器地址
System.out.println(serverList[i1]);
- 随机策略:把服务列表放到一个数组,然后根据数组的长度来获取随机数,取到的随机数就是服务在数组中的索引。
/**
* 随机策略 Demo
*/
public class RandomStrategy
public static void main(String[] args)
// 服务地址数组
String[] serverList = "192.168.0.77","192.168.0.88","192.168.0.99";
// 模拟发送 5 次请求
for (int j = 0; j < 5; j++)
// 随机获取数组的索引
int i = new Random().nextInt(serverList.length);
// 根据索引获取服务器地址
System.out.println(serverList[i]);
- 临时节点和最小连接数策略实现负载均衡:使用临时节点来维护 Server 的地址列表就保证了请求不会被分配到已经停机的服务上。
参考https://www.imooc.com/wiki/Zookeeper/zookeeperloadblance.html
六、Zookeeper 权限控制 ACL访问控制表
- 对节点设置读写等权限,保障数据安全性
- getAcl 命令:获取某个节点的 acl 权限信息。
- setAcl 命令:设置某个节点的 acl 权限信息。
- addauth 命令:输入认证授权信息,注册时输入明文密码,加密形式保存。
格式: [scheme: id :permissions]
1、scheme:代表采用的某种权限机制,包括 world开放式权限、auth授予权限、digest用于账号密码登录和验证、ip限制 IP 地址的访问权限、super超级用户几种。
2、id:代表允许访问的用户。
3、permissions:权限组合字符串,由 cdrwa 组成,其中每个字母代表支持不同权限, 创建权限 create©、删除权限 delete(d)、读权限 read®、写权限 write(w)、管理权限admin(a)。
七、Zookeeper 数据同步ZAB
-ZAB 协议来实现分布式数据一致性(分为消息广播、崩溃恢复两部分)
leader服务器宕机时,进入崩溃回复模式,开始选举新的leader,follower保持数据同步,选举完后进入广播模式,leader开始处理新请求。
八、Zookeeper Leader 选举原理
集群启动时,每个节点都是looking状态,leader选举至少是2台
1、serv1启动时单机无法选举,serv2也启动了,才开始选举
2、每个服务器发出投票。serv1、serv2都投自己,投票信息包含myid、zxid、epoch,格式是(myid,zxid,epoch),将这个投票发给集群中的其他机器
3、接受其他服务器的投票。集群每个服务器接收到投票后,检查是否有效:是否本轮epoch、是否是looking
4、处理投票。针对每一个投票,服务器都要把别人的投票和自己的PK,PK规则:
i. 优先比较epoch
ii. 其次检查ZXID。ZXID比较大的服务器优先作为Leader
iii. 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。
比较到比自己大的,更新自己的投票信息,再投票。
5、统计投票。每次投票后,服务器都会统计投票数,选出超半数投的节点
6、改变服务器状态。确定了leader,每个服务器就更新自己的状态,变成follower或者leader。
参考https://blog.csdn.net/heyanfeng22/article/details/118077513
九、Zookeeper 分布式锁实现原理
- 排他锁(写锁或独占锁),如果事务T1对数据对象O1加上排他锁,那么整个加锁期间,只允许事务T1对O1进行读取和更新操作,其他任何事务都不能进行读或写。
- 共享锁(读锁)。如果事务T1对数据对象O1加上了共享锁,那么当前事务只能对O1进行读取操作,其他事务也只能对这个数据对象加共享锁,直到该数据对象上的所有共享锁都释放。
十、面试问题
1、为什么最好使用奇数台服务器构成集群?
答:Leader选举算法才用Zab原子广播协议,思想核心是当多数server写成功就ok。假如有3个server,最多允许1个server挂掉,其实4个server的情况也是最多允许1个挂掉,既然都一样,那有3台就够了。
2、服务器角色解析?
答:
- leader:使用调度者、处理者,保证处理顺序
- follower: 处理客服端非事务请求,转发事务给leader,参与投票选票
- observer:处理客户端非事务请求,转发事务给leader
3、分布式集群中为啥有Master选举?
答:分布式环境中,有些业务只需要某一台机器执行,其他机器可以共享这个结果,可大大减少计算,提高性能,所以要选举。
4、zookeeper如何保证事务的顺序一致性?
答:用zab原子广播协议来实现,leader收到请求后,把它转换成一个提议,并为每个提议分配一个全局唯一递增的事务id(zxid),然后把提议放入FIFO队列中,再发给所有follower,follower再写磁盘中,成功后返ACK给leader,leader收到超半数follower的ack后认为数据写成功,就发送commit命令给follower们可以提交提议了。
5、zookeeper负载均衡和nginx负载均衡的区别?
答:zk:调控;nginx:调权重,可控的需要自己写插件;nginx吞吐量比zk大。
6、操作znode的常用命令?四字命令格式?
答:create增加、delete删除、set修改、get查询。四字命令:echo [command] | nc [ip] [port]
总结
以上就是今天要讲的内容,本文仅仅简单介绍了Zookeeper入门的一些基础内容,有描述错误的地方请指出,因有些知识点及截图来自于菜鸟教程等其他网站,如有涉及到版权问题请联系我删除,感谢观看。
以上是关于Zookeeper入门的主要内容,如果未能解决你的问题,请参考以下文章