Zookeeper

网友投稿 906 2022-11-21

Zookeeper

Zookeeper

一 引言

在分布式环境下,如果舍弃SpringCloud,使用其他的分布式框架,那么注册心中,配置集中管理,集群管理,分布式锁,分布式任务,队列的管理想单独实现怎么办。

二 Zookeeper简介

1.本质

Zookeeper本质是一个文件系统--->可以进行文件操作和管理(文件增加,删除,修改等操作).

2.作用

①.可以对文件进行管理监听,当文件发生了变化后,可以发出相应的通知;②.结合dubbo,作为一个服务的注册中心,对服务进行管理(服务的注册/发现/剔除...);③.可以利用Zookeeper实现分布式锁.

三 Zookeeper架构

1.Zookeeper的架构图

2.Znode类型

四种Znode•持久节点:永久的保存在你的Zookeeper中。•持久有序节点:永久的保存在你的Zookeeper中,他会给你的节点添加一个有序的序号。/xx -> /xxOOOOOOl•临时节点:当存储的客户端和Zookeeper服务断开连接时,这个临时节点会被自动删除。•临时有序节点:当存储的客户端和Zookeeper服务断开连接时,这个临时节点自动删除,他会给你的节点添加一个有序的序号。/xx -> /xxOOOOOO!

3.Zookeeper的监听通知机制

四 Zookeeper常用命令

1.查询当前节点下的数据

例子 get /zookeeper

2.创建节点

create [-s] [-e] znode 名称 znode 数据 -s: sequence,有序节点-e: ephemeral,临时节点

3.修改节点值

set znode名称新数据

4.删除节点

delete znode 名称#没有子节点的znodermr znode 名称#删除当前节点和全部的子节点

五 Zookeeper集群

1.Zookeeper集群架构图

2. Zookeeper集群中节点的角色

•Leader:Master主节点•Follower (默认的从节点):从节点,参与选举全新的Leader•Observer:从节点,不参与投票•Looking:正在找Leader节点

3.Zookeeper投票策略

•每一个Zookeeper服务都会被分配一个全局唯一的myid, myid是一个数字。•Zookeeper在执行写数据时,每一个节点都有一个自己的FFO的队列。保证写每 一个数据的时候,顺序是不会乱的,Zookeeper还会给每一个数据分配一个全局 唯一的zxid,数据越新zxid就越大。选举Leader:•选举出zxid最大的节点作为Leader。•在zxid相同的节点中,选举出一个myid最大的节点,作为Leader。

六 搭建Zookeeper集群

1.yml文件

version: "3.1"services: zk1: image: zookeeper restart: always container_name: zk1 ports: - 2181:2181 environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181 zk2: image: zookeeper restart: always container_name: zk2 ports: - 2182:2181 environment: ZOO_MY_ID: 2 ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181 zk3: image: zookeeper restart: always container_name: zk3 ports: - 2183:2181 environment: ZOO_MY_ID: 3 ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181

七 Java操作Zookeeper

1.Java 连接 Zookeeper

1.ZkUtil

public class ZkUtil { public static CuratorFramework createCurator(){ //设置一个客户端连接Zookeeper服务器的重试策略:3秒内尝试连接3次服务器 RetryPolicy retryPolicy=new ExponentialBackoffRetry(3000,3); CuratorFramework framework=CuratorFrameworkFactory.builder() .retryPolicy(retryPolicy) .connectString("172.20.10.3:2181,172.20.10.3:2182,172.20.10.3:2183") .build(); //开启客户端 framework.start(); return framework; }}

2.测试-创建客户端

3.测试-创建节点

@Testpublic void test02() throws Exception { //创建节点 client.create() //设置节点是否是持久还是临时,及是否有序 .withMode(CreateMode.PERSISTENT) //设置节点路径和数据信息 .forPath("/zk","hello zk".getBytes());}

4.测试-获取子节点

5.测试-获取节点数据

6.测试-更新节点中的数据内容

7.测试-级联删除节点及其子节点

@Testpublic void test07() throws Exception { //可以在必要的情况下,级联删除节点及其子节点 client.delete().deletingChildrenIfNeeded().forPath("/zk");}

8.测试-判断某个节点是否存在

2.监听通知机制

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:面试题-Mysql优化
下一篇:Lambda函数式编程思想
相关文章

 发表评论

暂时没有评论,来抢沙发吧~