zookeeper相关,安装,认识......

news2024/11/25 20:48:08

目录

Zookeeper 1

第一章 Zookeeper简介... 1

1.1 Zookeeper概述和功能... 1

1.2 Zookeper安装... 1

1.3 Zookeper数据模型... 3

第二章 Zookeeper命令操作... 4

1.1 Zookeeper Client 4

1.2 Zookeeper JavaClient 6

第三章 集群角色... 28

                                              Zookeeper

第一章 Zookeeper简介

1.1 Zookeeper概述和功能

Zookeeper 是 Apache Hadoop 项目下的一个子项目, 翻译过来就是 动物园管理员,他是用来管 Hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员.简称zk.

Zookeeper 是一个分布式的、开源的分布式应用程序的协调服务。其本质上就是提供一种集中式信息存储服务.就是一个将数据存放到内存中,以树形结构存储数据的服务.我们根据其存储数据的特点可以实现分布式统一配置中心,分布式锁等功能,主要用于分布式应用程序的高性能协调,集群高可靠等.

主要功能:

配置管理

 

分布式锁

 

3.服务器动态上下线

 

1.2 Zookeper安装

上传解压

#进入到apps文件夹 使用rz上传 也可以直接拖拽到crt上传
cd /opt/apps  
#上传后解压
tar -zxvf zookeeper-3.5.6.tar.gz

配置

#1.进入到解压后的zk文件夹下 创建一个文件夹zkData
cd /opt/apps/zookeeper-3.5.6
mkdir zkData
#2.进入到zk的conf文件夹下 将zoo_sample.cfg改为zoo.cfg
cd conf
mv zoo_sample.cfg zoo.cfg
#3.修改zoo.cfg的配置
vi zoo.cfg
    #将第12行dataDir的值改为我们刚才创建的文件夹  12+shift+G 直接跳转
    dataDir=/opt/apps/zookeeper-3.5.6/zkData
    #在文件的最后配置server的信息和端口
    server.1=linux01:2888:3888
    server.2=linux02:2888:3888
    server.3=linux03:2888:3888
#4.进入到zkData文件夹下 添加linux01的myid为1
cd ../zkData
echo 1 > myid

分发

#进入到linux01的/opt/apps文件夹下
scp -r zookeeper-3.5.6 linux02:$PWD
scp -r zookeeper-3.5.6 linux03:$PWD
#设置linux02上zk的myid为2
echo 2 > /opt/apps/zookeeper-3.5.6/zkData/myid
cat  /opt/apps/zookeeper-3.5.6/zkData/myid
#设置linux03上zk的myid为3
echo 3 > /opt/apps/zookeeper-3.5.6/zkData/myid 
cat /opt/apps/zookeeper-3.5.6/zkData/myid 

启动

#zk没有一键启动我们需要挨个启动
/opt/apps/zookeeper-3.5.6/bin/zkServer.sh start
#zk查看状态
/opt/apps/zookeeper-3.5.6/bin/zkServer.sh status

一键启动脚本

#!/bin/bash
for hostname in linux01 linux02 linux03
do 
    echo "当前正在操作的主机$hostname"
    ssh $hostname "source /etc/profile ; /opt/apps/zookeeper-3.5.6/bin/zkServer.sh $1 ;exit"
done

1.3 Zookeper数据模型

ZooKeeper是一个树形目录服务,其数据模型和linux的文件系统目录树很类似,拥有一个层次化结构。

 

这里面的每一个节点都被称为: ZNode,每个节点上都会保存自己的数据和节点信息.节点可以拥有子节点,同时也允许少量(1MB)数据存储在该节点之下。

节点可以分为四大类:

- PERSISTENT持久化节点
- EPHEMERAL临时节点:-e
- PERSISTENT_SEQUENTIAL持久化顺序节点:-s
- EPHEMERAL_SEQUENTIAL临时顺序节点: -es

第二章 Zookeeper命令操作

1.1 Zookeeper Client

1.1.1 服务端命令

/opt/apps/zookeeper-3.5.6/bin/zkServer.sh start
/opt/apps/zookeeper-3.5.6/bin/zkServer.sh stop
/opt/apps/zookeeper-3.5.6/bin/zkServer.sh status
/opt/apps/zookeeper-3.5.6/bin/zkServer.sh restart

1.1.2 客户端命令

连接服务端
/opt/apps/zookeeper-3.5.6/bin/zkCli.sh -server  linux001:2181
连接本地 
/opt/apps/zookeeper-3.5.6/bin/zkCli.sh 
​
查看命令帮助
help
​
查看
ls  目录
创建节点 
create  /节点名 描述 
create -e /节点名 描述   临时节点
create -s /节点名 描述   顺序节点 
create -e -s /节点 描述   临时顺序节点
​
​
查看节点 
get /节点名
设置节点描述
set /节点名 描述
删除节点 
delete /节点名
删除非空节点 
deleteAll /节点名

监听

ls -w 路径    
-- 监听根目录 所有子节点的变化  
ls - w /  

WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/


get -w 路径
-- 监听 /app3 节点数据的变化

WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/app3

1.2 Zookeeper JavaClient

1.2.1 Cuator介绍

Curator是 ApacheZooKeeper的Java客户端库.

常见的ZooKeeper Java APl :

  • 原生JavaAPI

  • zkClient

  • Curator

Curator项目的目标是简化ZooKeeper客户端的使用。

Curator最初是Netfix研发的,后来捐献了Apache基金会,目前是Apache的顶级项目。

http://curator.apache.org

坐标

 
            <!--curator-->
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>4.0.0</version>
            </dependency>

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

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>4.0.0</version>
        </dependency>

1.2.2 建立连接

/*
     CuratorFrameworkFactory
            静态方法获取连接对象
               static CuratorFramework newClient(String connectString, int sessionTimeoutMs, int connectionTimeoutMs, RetryPolicy retryPolicy)
                            String connectString:连接的字符串    zkserver地址:端口
                            int sessionTimeoutMs:会话超时时间 单位ms   默认 60 * 1000
                            int connectionTimeoutMs 连接超时时间 单位ms  默认 15 * 1000
                            RetryPolicy retryPolicy 重试策略   接口
                                             实现类ExponentialBackoffRetry
              static CuratorFramework newClient(String connectString, RetryPolicy retryPolicy)

     CuratorFramework
             方法
               void  start() 开始连接
 */
public class Test {
    public static void main(String[] args) {
        String connectString = "linux001:2181";
//        //基础等待时间 20  重试次数 10
        RetryPolicy r = new ExponentialBackoffRetry(20,10);
//        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient(connectString, r);
//        curatorFramework.start();;

        //第二种方式
        CuratorFramework client = CuratorFrameworkFactory.builder().
                                connectString(connectString)
                                .retryPolicy(r).build();
        client.start();
    }
}

1.2.3 创建节点

/*
    CuratorFramework
        创建节点
        create().forPath(节点) 创建节点 不指定数据 默认为 ip地址
        create().forPath(节点,byte[] data)  创建节点 指定数据 字节数组
        create().withMode().forPath(节点,byte[] data)  创建节点 指定节点类型 默认类型 持久化
                    CreateMode.EPHEMERAL 临时节点
                    CreateMode.PERSISTENT 持久节点
                    CreateMode.PERSISTENT_SEQUENTIAL 持久顺序节点
                    CreateMode.EPHEMERAL_SEQUENTIAL  临时顺序节点
        create().creatingParentsIfNeeded().forPath(节点,byte[] data) 创建多级节点
 */
public class Test {
    public static void main(String[] args) throws Exception {
        CuratorFramework client = CuratorUtils.getClient();
        client.start();

        //创建节点  由于指定了命名空间 所以会在 /doit下创建
        //没有指定数据 默认数据是当前客户端的ip地址
        //  client.create().forPath("/app1");

        //创建节点 指定数据
        //client.create().forPath("/app2","abc".getBytes());

        //创建临时节点  指定数据
//        client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3","aa".getBytes());
        //Thread.sleep(10000);

        //创建多级节点
        client.create().creatingParentsIfNeeded().forPath("/app3/p1/p", "abc".getBytes());

        client.close();
    }
}

1.2.4 查看节点

/*
     查看节点
     * 1. 查询数据:get: getData().forPath()
     * 2. 查询子节点: ls: getChildren().forPath()
     * 3. 查询节点状态信息:ls -s:getData().storingStatIn(状态对象).forPath()
 */
public class Test02 {
    public static void main(String[] args) throws Exception {
        CuratorFramework client = CuratorUtils.getClient();
        client.start();

        //查询节点数据
        byte[] bytes = client.getData().forPath("/app1");
        System.out.println(new String(bytes));

        //查询子节点
        List<String> list = client.getChildren().forPath("/");
        for (String s : list) {
            System.out.println(s);
        }

        //查询节点状态信息  ls -s
        Stat s = new Stat();
        client.getData().storingStatIn(s).forPath("/app1");
        System.out.println(s.getCzxid());


        client.close();
    }
}

1.2.5 修改数据

/**
     * 修改数据
     * 1. 基本修改数据:setData().forPath()
     * 2. 根据版本修改: setData().withVersion().forPath()
     * * version 是通过查询出来的。目的就是为了让其他客户端或者线程不干扰我。
     */
public class Test03 {
    public static void main(String[] args) throws Exception {

        CuratorFramework client = CuratorUtils.getClient();
        client.start();

        //基本修改数据
//        client.setData().forPath("/app1","v1".getBytes());
//        byte[] bytes = client.getData().forPath("/app1");
//        System.out.println(new String(bytes));

        //查询版本
        Stat s = new Stat();
        client.getData().storingStatIn(s).forPath("/app1");
        int version = s.getVersion();
        //使用版本进行设置
        client.setData().withVersion(version).forPath("/app1");
        byte[] bytes = client.getData().forPath("/app1");
        System.out.println(new String(bytes));
        
        client.close();
    }
}

1.2.6 删除节点

/**
     * 删除节点: delete deleteall
     * 1. 删除单个节点:delete().forPath("/app1");
     * 2. 删除带有子节点的节点:delete().deletingChildrenIfNeeded().forPath("/app1");
     * 3. 必须成功的删除:为了防止网络抖动。本质就是重试。  client.delete().guaranteed().forPath("/app2");
     * 4. 回调:inBackground
     */
public class Test04 {
    public static void main(String[] args) throws Exception {
        CuratorFramework client = CuratorUtils.getClient();
        client.start();

        //删除单个节点
     //   client.delete().forPath("/app1");

        //删除带子节点的节点
//        client.delete().deletingChildrenIfNeeded().forPath("/app3");

        //必须成功的删除:为了防止网络抖动。本质就是重试。
//        client.delete().guaranteed().forPath("/aa");

        client.delete().guaranteed().inBackground(new BackgroundCallback() {
            @Override
            public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
                System.out.println("我被删除了");
                System.out.println(event);
            }
        }).forPath("/app2");
        client.close();
    }
}

1.2.7 注册监听

监听数据变化

public class Test05 {
    public static void main(String[] args) throws Exception {
        CuratorFramework client = CuratorUtils.getClient();
        client.start();


        //创建 NodeCache对象
        NodeCache nodeCache = new NodeCache(client,"/app1");

        //2.注册监听
        nodeCache.getListenable().addListener(new NodeCacheListener() {
            @Override
            public void nodeChanged() throws Exception {
                System.out.println("节点变化了");

                byte[] data = nodeCache.getCurrentData().getData();
                System.out.println(new String(data));
            }
        });


      //3. 开启监听.如果设置为true,则开启监听是,加载缓冲数据
        nodeCache.start(true);

        
//        Thread.sleep(1000000);

    }
}

监听子节点变化

public class Test06 {
    public static void main(String[] args) throws Exception {
        CuratorFramework client = CuratorUtils.getClient();
        client.start();

        PathChildrenCache pathChildrenCache = new PathChildrenCache(client,"/app3",true);

        pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
            @Override
            public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
                System.out.println("子节点变化了");
                System.out.println(pathChildrenCacheEvent);

                PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();
                if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
                    byte[] data = pathChildrenCacheEvent.getData().getData();
                    System.out.println(new String(data));
                }
            }
        });

        pathChildrenCache.start();
        
        Thread.sleep(1000000);
    }
}
/*
     TreeCache 相当于 NodeCache与PathChildrenCache组合
        监听当前节点 与 子节点
 */
public class Test07 {
    public static void main(String[] args) throws Exception {
        CuratorFramework client = CuratorUtils.getClient();
        client.start();
        TreeCache treeCache = new TreeCache(client,"/app4");
        treeCache.getListenable().addListener(new TreeCacheListener() {
            @Override
            public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
                System.out.println(treeCacheEvent);
            }
        });

        treeCache.start();


        Thread.sleep(10000000);
    }
}

第三章 集群角色

在ZooKeeper集群服中务中有三个角色:

Leader 领导者 :

1. 处理事务请求
2. 集群内部各服务器的调度者

Follower 跟随者 :

  1. 处理客户端非事务请求,转发事务请求给Leader服务器

  2. 参与Leader选举投票

Observer 观察者:

  1. 处理客户端非事务请求,转发事务请求给Leader服务器

 

选举机制

假设3台linux 
linux01 启动 投自己一票 广播 
linux02 启动 收到linux01 广播   投自己一票 
linux01 发现 linux02的id比自己的id大  投linux02一票 
linux02 投票超过半数 选为 leader  
linux03 启动 由于已经有了leader  follower 

如果leader宕机

看谁的版本号新 谁为leader
如果版本号相同 谁id大 谁是leader

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

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

相关文章

详解Servlet API

目录 前言 HttpServlet HttpServletRequest 代码实例 打印请求信息 通过URL中的queryString进行传递。 通过post请求的body&#xff0c;使用form表单传递 通过POST 请求中的 body 按照 JSON 的格式进行传递 HttpServletResponse 核心方法代码实例 设置状态码 自动刷…

【C++初阶】string 类的认识与学习

在学习string类之前&#xff0c;先在这里推荐2个好用的网站&#xff0c;可以用来查阅C的相关知识 https://cplusplus.com https://en.cppreference.com/w/ 上面的是非官方的&#xff0c;下面的官方的&#xff0c;但是个人感觉还是上面的好用。 一.string 类是什么 简单来说&…

State of GPT (ChatGPT 原理及现状介绍)

State of GPT 演讲信息&#xff1a; 演讲人&#xff1a;Andrej Karpathy (现在OpenAI任职)&#xff0c;之前是特斯拉视觉研发负责人&#xff0c;斯坦福深度学习入门课程 CS231N 讲师演讲主题&#xff1a;受到微软 BUILD2023 邀请&#xff0c;介绍 GPT 的原理及研发现状&#x…

VMware虚拟机安装Ubuntu 22.04详细教程(2023年新版教程)

VMware虚拟机安装Ubuntu 22.04详细教程&#xff08;保姆级教程&#xff09; 大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢…

代码创作世界——pytorch深度学习框架数据类型

代码创作世界——pytorch深度学习框架数据类型 torch中的数据类型张量&#xff08;tensor&#xff09; pytorch中的 在数学中&#xff0c;一个单独的数可以成为标量&#xff0c;一行或者一列数组可以称为向量&#xff0c;一个二维数组称为一个矩阵&#xff0c;矩阵中的每一个元…

编译安装nginx服务

目录 编译安装nginx服务 1.关闭防火墙&#xff0c;将安装nginx所需软件包传到/opt目录下 2.安装依赖包 3.创建运行用户、组&#xff08;Nginx服务程序默认以nobody身份运行&#xff0c;建议为其创建专门的用户账号&#xff0c;以便更准确的控制访问权限&#xff09; 4.编译…

11.PasswordEncoder详解与实战

security/day07 这节课我们开始讲PasswordEncoder&#xff0c;如果大家还有印象的话&#xff0c;我们前面有提到过PasswordEncoder: 为什么密码使用{noop}开头呢&#xff1f;我们也做出了相应的解释&#xff0c;这节课开始带大家真正的了解PasswordEncoder, PassworderEncoder…

Android以aar包形式引入hunter-timing,Java(4)

Android以aar包形式引入hunter-timing&#xff0c;Java&#xff08;4&#xff09; &#xff08;1&#xff09;参照这篇文章&#xff1a; https://zhangphil.blog.csdn.net/article/details/130603231https://zhangphil.blog.csdn.net/article/details/130603231 生成.aar文件…

路径规划算法:基于象群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于象群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于象群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法象群…

python基础知识(六):列表

目录 1. 列表及其创建2. 列表的特点3. 获取指定元素的索引4. 获取列表中指定索引的元素5. 列表的切片操作6. 列表元素的判断及遍历7. 列表元素的添加操作8. 列表的删除9. 列表元素的修改10. 列表元素的排序11. 列表生成式 1. 列表及其创建 列表由一系列按特定顺序排列的元素组…

如何设计一份优秀的 PPT 文档?

设计一份优秀的 PPT 需要考虑以下几个方面&#xff1a; 目标和受众&#xff1a;明确你的 PPT 的目标是什么&#xff0c;以及你的受众是谁。这将帮助你确定内容的重点和风格。结构和流程&#xff1a;确定清晰的结构和流程&#xff0c;使你的 PPT 有逻辑性。使用标题、副标题和分…

算法与数据结构(三)——排序算法大总结

六大排序算法&#xff1a;插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序 一、插入排序二、选择排序三、冒泡排序四、归并排序 一、插入排序 1.从第一个元素开始&#xff0c;该元素可以认为已经被排序 2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫…

三、DMSP/OLS、NPP/VIIRS等夜间灯光数据能源碳排放空间化——灯光指数计算(二)

一、前言 续上一节,建成区提取方式有很多种,本文主要介绍一种区别于参考比较法、突变检测法等的领域分析提取建成区范围。 本文以广州市为例,基于领域分析提取2020年广州市建成区范围。 二、具体步骤 (1)加载数据并将广州市夜间灯光数据提取出来 (2)搜索"邻域…

【前端】Vue项目中 JSON 编辑器的使用

Vue项目中 JSON 编辑器的使用 一、背景描述二、vue-json-edit2.1 依赖安装2.2 示例代码2.3 效果图 三、vue-json-pretty3.1 依赖安装3.2 示例代码3.3 效果图 四、bin-code-editor4.1 依赖安装4.2 示例代码4.3 效果图 五、vue-json-views5.1 依赖安装5.2 示例代码5.3 效果图5.4 …

json库——jsoncpp

一、jsoncpp简介 JsonCpp是一个开源的C库&#xff0c;用于解析和生成JSON&#xff08;JavaScript Object Notation&#xff09;数据格式。JSON是一种轻量级的数据交换格式&#xff0c;广泛用于各种应用程序和网络服务中。 JsonCpp提供了简单和易用的API&#xff0c;可以方便地解…

C Primer Plus第十七章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 有些题目函数定义在书本存在&#xff…

路径规划算法:基于鸽群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于鸽群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于鸽群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法鸽群…

Python编程面试题及答案(20例)

以下是一些常见的Python编程面试题以及它们的答案&#xff1a; 1.解释Python中的 GIL&#xff08;全局解释器锁&#xff09;是什么&#xff0c;它对多线程编程有什么影响&#xff1f; 答案&#xff1a;GIL是Python解释器中的一个机制&#xff0c;它确保在任何给定时间只有一个…

超详细Redis入门教程——Redis 主从集群(上)

前言 本文小新为大家带来 Redis 主从集群 相关知识&#xff0c;具体内容包括主从集群搭建&#xff08;包括&#xff1a;伪集群搭建与配置&#xff0c;分级管理&#xff0c;容灾冷处理&#xff09;&#xff0c;主从集群搭建&#xff08;包括&#xff1a;主从复制原理&#xff0c…

MySQL数据库从入门到精通学习第7天(表数据的增、删、改操作)

表数据的增、删、改操作 使用INSERT...VALUES语句插入数据修改数据删除数据 使用INSERT…VALUES语句插入数据 语法&#xff1a; INSERT [INTO] 数据表名[(字段名...)] VALUES ({值 | DEFAULT},...),()...; [INTO] 数据表名&#xff1a;可选项&#xff0c;用于指定被操作的数…