Zookeeper入门

Posted JTang_java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zookeeper入门相关的知识,希望对你有一定的参考价值。

Zookeeper入门


文章目录


一、Zookeeper是什么?

  • 开放源码
  • 为分布式框架提供协调服务的apache项目
  • 观察者模式
  • 一主多从结构
  • 实现数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能

一个最常用的场景:担任服务器生产者和消费者的注册中心(生产者将服务注册到zookeeper中心,消费者进行调用时再去查找),比如Dubbo的注册中心,用zookeeper对solr集群进行管理,可实现负载均衡、配置文件的管理,是集群的入口

二、Zookeeper linux 服务端集群搭建步骤

  1. 在centos中创建三台虚拟机,安装好zookeeper 环境(可使用Xftp7上传),安装好 java 开发工具包 JDK
  2. 创建zookeeper数据存储目录
  3. 修改zookeeper配置文件
  4. 进入zookeeper安装目录下的bin目录 sh zkServer.sh start 命令启动zookeeper
    参考https://blog.csdn.net/weixin_44854986/article/details/120068977

三、Zookeeper Java客户端搭建步骤

zookeeper比较常用的Java客户端有zkclient、curator。

  1. idea工具添加org.apache.zookeeper依赖
  2. 使用 zookeeper 原生 API,连接上一教程搭建的三台服务组成的集群,因为连接需要时间,用 countDownLatch 阻塞,等待连接成功,控制台输出连接状态!
  3. 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]);
        
    



六、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入门的主要内容,如果未能解决你的问题,请参考以下文章

Zookeeper Api(java)入门与应用(转)

Zookeeper Api(java)入门与应用(转)

Zookeeper Api(java)入门与应用(转)

直播丨Zookeeper:分布式系统从入门到实战

程序员入门笔记:zookeeper在dubbo起了什么作用

CK1957-Zookeeper核心学习教程