Zookeeper简介

news2024/11/20 1:53:00

引言

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

Zookeeper介绍

Zookeeper本身是Hadoop生态园的中的一个组件,Zookeeper强大的功能,在Java分布式架构中,也会频繁的使用到Zookeeper。

 Zookeeper就是一个文件系统 + 监听通知机制

 

Zookeeper安装

docker-compose.yml

version: "3.1"
services:
  zk:
   image: daocloud.io/daocloud/zookeeper:latest
   restart: always
   container_name: zk
   ports:
     - 2181:2181

 

Zookeeper架构

Zookeeper的架构图

  • 每一个节点都没称为znode

  • 每一个znode中都可以存储数据

  • 节点名称是不允许重复的

 

 

znode类型

四种Znode

  • 持久节点:永久的保存在你的Zookeeper

  • 持久有序节点:永久的保存在你的Zookeeper,他会给节点添加一个有序的序号。 /xx -> /xx0000001

  • 临时节点:当存储的客户端和Zookeeper服务断开连接时,这个临时节点自动删除

  • 临时有序节点:当存储的客户端和Zookeeper服务断开连接时,这个临时节点自动删除,他会给节点添加一个有序的序号。 /xx -> /xx0000001

 

zookeeper的监听通知机制

客户端可以去监听Zookeeper中的Znode节点。

Znode改变时,会通知监听当前Znode的客户端

 

启动Zookeeper

启动记得加./

 

 

 

Zookeeper常用命令

# 查询当前节点下的全部子节点
ls 节点名称
# 例子 ls /


# 查询当前节点下的数据
get 节点名称
# 例子 get /zookeeper


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


# 修改节点值
set znode名称 新数据


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

 

Zookeeper集群

Zookeeper集群架构图

 

Zookeeper集群中节点的角色

  • Leader:Master主节点

  • Follower (默认的从节点):从节点,参与选举全新的Leader

  • Observer:从节点,不参与投票

  • Looking:正在找Leader节点

 

Zookeeper投票策略

  • 每一个Zookeeper服务都会被分配一个全局唯一的myid,myid是一个数字。

  • Zookeeper在执行写数据时,每一个节点都有一个自己的FIFO的队列。保证写每一个数据的时候,顺序是不会乱的,Zookeeper还会给每一个数据分配一个全局唯一的zxid,数据越新zxid就越大。

选举Leader:

  • 选举出zxid最大的节点作为Leader。

  • 在zxid相同的节点中,选举出一个myid最大的节点,作为Leader。

 

搭建Zookeeper集群

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

Java连接Zookeeper

<dependencies>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.6.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.0.1</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

 

编写连接Zookeeper集群的工具类

public class ZkUtil {


    public static CuratorFramework getCf(){

       //超时时间和重试次数
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,2);

        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().retryPolicy(retryPolicy).connectString("192.168.59.12:2181,192.168.59.12:2182,60.192.168.59.12:2183").build();

        curatorFramework.start();

        return curatorFramework;


    }

}

 

Java操作Znode节点

查询

public class Demo2 {

    CuratorFramework cf = ZkUtil.cf();

    // 获取子节点
    @Test
    public void getChildren() throws Exception {
        List<String> strings = cf.getChildren().forPath("/");

        for (String string : strings) {
            System.out.println(string);
        }
    }

    // 获取节点数据
    @Test
    public void getData() throws Exception {
        byte[] bytes = cf.getData().forPath("/qf");
        System.out.println(new String(bytes,"UTF-8"));
    }

}

添加

    @Test
    public void testCreateNode() throws Exception {
        CuratorFramework cf = ZkUtil.getCf();
        //PERSISTENT 持久化的  所以这是一个持久的节点
        String s = cf.create().withMode(CreateMode.PERSISTENT).forPath("/java2203", "perfect".getBytes("utf-8"));
        System.out.println(s);
    }

 

修改

   @Test
    public void testUpdate() throws Exception {


        CuratorFramework cf = ZkUtil.getCf();
        Stat stat = cf.setData().forPath("/java2203", "great".getBytes());
        System.out.println(stat);
    }

删除

    @Test
    public void testDelete() throws Exception {
        CuratorFramework cf = ZkUtil.getCf();
        cf.delete().deletingChildrenIfNeeded().forPath("/java2203");

    }

查看znode的状态

@Test
public void stat() throws Exception {
    Stat stat = cf.checkExists().forPath("/qf");
    System.out.println(stat);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink 运行架构

1 Flink 运行时的组件 Flink 运行时架构主要包括四个不同的组件&#xff0c;它们会在运行流处理应用程序时协同工作&#xff1a;作业管理器&#xff08;JobManager&#xff09;、资源管理器&#xff08;ResourceManager&#xff09;、任务管理器&#xff08;TaskManager&#…

一篇文章让你掌握HTML(下)

目录 1. 列表标签 1.1 无序列表 1.2 有序列表 1.3 自定义列表 2. 表格标签 2.1 表格的基本标签 2.2 表格相关属性 2.3 表格标题和表头单元格标签 2.4 表格的结构标签 2.5 合并单元格 3. 表单标签 3.1 input系列标签 3.1.1 input系列标签-文本框 3.1.…

MATLAB-非线性方程(组)求解

求非线性方程或方程组解的问题也就是求函数零点的问题。对于任意函数&#xff0c;在求解范围内可能有零点&#xff0c;也可能没有;可能只有一个零点&#xff0c;也可能有多个甚至无数个零点。MATLAB没有可以求解所有函数零点的通用命令&#xff0c;下面将分别讨论一元函数和多元…

Nginx入门知识

一、什么是NginxNginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协议下发行。其特点是占有内存少&#xff0c;并发能力强&am…

JavaScript 字符串

文章目录JavaScript 字符串JavaScript 字符串字符串长度特殊字符字符串可以是对象字符串属性和方法字符串属性字符串方法JavaScript 字符串 JavaScript 字符串用于存储和处理文本。 JavaScript 字符串 字符串可以存储一系列字符&#xff0c;如 “John Doe”。 字符串可以是插…

如何连接远程mysql数据库(原创)

一、连接远程数据库&#xff1a;&#xff08;前提本地也有mysql的客户端&#xff09; 1、显示密码 如&#xff1a;MySQL 连接远程数据库&#xff08;192.168.5.116&#xff09;&#xff0c;端口“3306”&#xff0c;用户名为“rfid_hh”&#xff0c;密码“123456” C:/>mysq…

20230107报警器的测试

20230107报警器的测试 2023/1/7 13:01 新款夹子户外报警器防盗报警器果园自动打电话无线距离防水报警器 拼多多的货。不到30&#xffe5;&#xff0c;也就那么回事了&#xff0c;没有太高期望。 需要在微信公众号注册。 拿掉强磁铁之后&#xff0c;GSM模块通电了&#xff01;…

英国学校遭遇机密数据大规模泄露

在 2022 年发生攻击事件后&#xff0c;来自 14 所英国学校的机密数据已被黑客在线泄露。 泄露的文件包括孩子的 SEN 信息、学生护照扫描件、员工工资表和合同细节。在受影响的学校拒绝支付攻击者的赎金要求后&#xff0c;信息被泄露。 据报道&#xff0c;攻击和泄密是由威胁行…

前端开发--JavaScript高级

JavaScript高级这一篇就够了JavaScript高级1、基础总结深入1.1 数据类型的分类和判断1.2 数据,变量, 内存的理解1.3 对象的理解和使用1.4 函数的理解和使用2、函数高级2.1 原型与原型链2.2 执行上下文与执行上下文栈2.3 作用域与作用域链2.4 闭包2.5 内存溢出与内存泄露3、对象…

DC-1靶场实操

靶场部署 下载网址&#xff1a;Vulnerable By Design - Search: DC- ~ VulnHub tips&#xff1a;强烈建议各位师傅们使用迅雷或idm要不然下载靶场将是一个十分痛苦的环节 之后环境搭建操作步骤一致故此处搭建环境以DC-1为例 将下好的压缩包解压&#xff0c;你就会看到一个.…

2023春招面试专题:高并发解决方案

如何理解高并发&#xff1f; 高并发意味着大流量&#xff0c;需要运用技术手段抵抗流量的冲击&#xff0c;这些手段好比操作流量&#xff0c;能让流量更平稳地被系统所处理&#xff0c;带给用户更好的体验。 我们常见的高并发场景有&#xff1a;淘宝的双11、春运时的抢票、微…

kaggle平台学习复习笔记 | 计算机视觉

目录1.The Convolutional Classifier2.Convolution and ReLU3.Maximum Pooling4.The Sliding Window5.Custom Convnets6.Data Augmentation1.The Convolutional Classifier 使用Keras创建第一个计算机视觉模型。 用于图像分类的网络由两部分组成&#xff1a;卷积层和密集层 卷…

华为云服务器无法正常访问端口

出错场景&#xff1a; 2023年1月7日22:05:32 在新服务器上运行自己服务端软件&#xff0c;其他客户端无法访问端口 进行连接。 服务端的程序启动了&#xff0c;客户端无法交互&#xff0c;连接失败。 首先检查能不能ping通 ping IP地址–发现是可以ping通的&#xff0c;再测…

活动星投票国风正当红网络评选微信的投票方式线上免费投票

“国风正当红”网络评选投票_第三方投票平台_优秀微信小程序_小程序投票优势近些年来&#xff0c;第三方的微信投票制作平台如雨后春笋般络绎不绝。随着手机的互联网的发展及微信开放平台各项基于手机能力的开放&#xff0c;更多人选择微信投票小程序平台&#xff0c;因为它有非…

python小游戏————兔子

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

【宝典】OpenStack集群、k8s集群与docker等集群综合巡检shell脚本

目标:学会编写高质量脚本的方法 高质量脚本应该至少满足两点: 1、当前最优 学会根据架构,设计出符合要求又便于理解的shell脚本 2、后期更新方便 优秀的shell脚本,具备伸缩性,既适用当前平台状态,又可以保证后期增加或下线哪个服务,脚本里增加代码不用改整体代码逻辑的…

JAVAEE-多线程(3)

volatile关键字 volatile禁止了编译器优化&#xff0c;还可以禁止指令重排序&#xff0c;避免了直接读取CPU寄存器中的缓存数据&#xff0c;而是每次都重新读内存。 因为编译器每次正常执行都是把主内存的数据加载到工作内存中&#xff0c;再进行计算处理。volatile即使保证每…

梦想cms1.4代码审计

目录 一、环境配置 二、代码审计 1、后台漏洞 &#xff08;1&#xff09;BookAction.class.php &#xff08;2&#xff09;BackdbAction.class.php任意文件删除 2、前台漏洞 &#xff08;1&#xff09;TagsAction.class.php &#xff08;2&#xff09;BookAction.cla…

深入理解数据结构 —— 树状数组

什么是树状数组 我们知道&#xff0c;前缀和数组能解决任意一段区间的累加和问题 但这建立在数组中的元素不发生变化的情况&#xff0c;如果可以修改原始数组中的某个元素&#xff0c;为了让前缀和数组正确&#xff0c;就需要在前缀和数组中修改该元素位置后面的所有的数&…

数组模拟实现单链表、双链表、栈、队列

文章目录 前引 一、数组模拟实现单链表 1、1 数组模拟的单链表解析 1、2 数组模拟实现单链表例题 二、数组模拟实现双链表 2、1 数组模拟实现双链表解析 2、2 数组模拟实现双链表例题 三、数组模拟实现栈 3、1 数组模拟实现栈解析 3、2 数组模拟实现栈例题 四、数组模拟实现队…