大数据下的协调者Zookeeper详解

news2024/11/23 8:42:06

Zookeeper框架

为什么要学习Zookeeper框架

1、Zookeeper是作为大数据生态圈框架中非常重要的一员
2、Zookeeper单独使用没有意义,主要是用来管理其他框架,被称为动物管理员
3、后期Hadoop的高可用框架、Kafka都需要依赖Zookeeper

Zookeeper的概述

1、Zookeeper本身是一个分布式集群
2、Zookeeper是协调服务框架,用来协调其他框架,让其他框架能够和睦的正常的工作
3、Zookeeper本身可以看做是一个数据库,是可以存数据的,一般存储的都是配置信息\
4、Zookeeper集群满足过半机制,最坏情况下只有有超过一半的机器在工作,这个集群就能正常运转

Zookeeper的他特点

1、全局数据一致性,ZK中只要有一个服务器有数据,其他的主机会跟着进行数据同步,所有主机的数据都完全一样,不会出现有的主机有数据,有的主机没有数据

2、顺序性:某一台主机比如创建了两个节点,创建顺序是A,B,其他的主机创建顺序也一定是A,B

3、时效性:在ZK集群创建节点这个过程所消耗的时间是近乎实时的

(重点)Zookeeper集群的角色

  • Leader

    1、集群的管理者,管理集群
    2、Leader既可以处理写请求(事务操作),也处理读请求(非事务操作)
    
  • Follower(正式工)

    1、集群的从角色
    2、Follower只能处理读请求(非事务操作),如果收到客户端的写请求,则必须转发给Leader
    3、各个Follower要不断的给Leader发送心跳包,告知其状态
    4、如果Leader挂掉,则会从剩余的Follower中重新选举出新的Leader,有投票权
    
  • Observer(临时工、外包工)

    Oberser除了不能选举新Leader之外,和Follower没有任何区别,类似被剥夺政治权利
    

(重点)Zookeeper的集群操作

方式1-绝对路径

#1-启动集群
/export/server/zookeeper-3.4.6/bin/zkServer.sh start

#2-停止集群
/export/server/zookeeper-3.4.6/bin/zkServer.sh stop

#3-查看集群状态
/export/server/zookeeper-3.4.6/bin/zkServer.sh status

方式2-环境变量

#配置环境变量之后使用该方式

#1-启动集群
 zkServer.sh start

#2-停止集群
 zkServer.sh stop

#3-查看集群状态
zkServer.sh status

方式3-shell脚本

#!/bin/bash
option=""
echo "你要进行什么操作?"
PS3="请输入你的选择:"
select var in "启动集群" "停止集群" "查看集群状态"
do
 echo ""
 echo ""
 case $var in
    "启动集群")
      option="start"
      echo ".........开始启动集群............"
     ;;
    "停止集群")
      option="stop"
      echo ".........开始停止集群............"
     ;;
    "查看集群状态")
      option="status"
      echo "........开始集群状态............"
     ;;
   *)
    echo "选择错误"
   ;;
 esac

 break;
done


for n in  1 2 3
do
 echo "---------node$n--------------"
 ssh root@node$n "source /etc/profile;zkServer.sh $option"
done

ZK的Znode节点特性

1、ZK的Znode节点是一个树形结构,最上边是根/节点
2、ZK的Znode节点既像文件(存数据),又像文件夹(可以有子节点)
3、ZK的Znode一般用来存储配置信息,数据量不会太大,每个Znode节点最多不超过1M数据
4、ZK的Znode节点必须使用绝对路径来访问,不能使用相对路径

ZK的Znode节点类型

PERSISTENT:永久节点
EPHEMERAL: 临时节点
PERSISTENT_SEQUENTIAL:永久节点、序列化
EPHEMERAL_SEQUENTIAL: 临时节点、序列化

(重点)ZK的Znode节点的Shell操作

进入Shell终端

#方式1-可以连接任意服务器
zkCli.sh -server node1:2181

#方式2-连接本主机
zkCli.sh 

Shell命令

1:创建普通永久节点
#不依赖当前会话,节点永远存在,除非手动删除
 create /app1 hello

2: 创建永久顺序(序列化)节点
#不依赖当前会话,节点永远存在,除非手动删除,会在节点名字的后边加上一串数字,数字越大,表示节点越新
#同一条创建命令多次创建不会失败
create -s /app2 world

3:创建临时节点
#依赖当前创建该节点的终端会话,如果会话(session)在,则节点在,如果会话消失,则节点消失
create -e /tempnode world

4:创建顺序的临时节点
#依赖当前创建该节点的终端会话,如果会话(session)在,则节点在,如果会话消失,则节点消失
#会在节点名字的后边加上一串数字,数字越大,表示节点越新,同一条创建命令多次创建不会失败

create -s -e /tempnode2 aaa

5、创建子节点
 create /app1/app11  hello


6:获取节点数据
   get  /app1
   get  /app1/app11

6:修改节点数据
   set /app1  hadoop
   set /app1/app11  hadoop

7:删除节点
  delete  /app1   #删除的节点不能有子节点
  rmr    /app1    #递归删除
  rmr    /app1/app11    #递归删除

ZK的Znode节点的属性

mZxid :Znode被修改的事务id,即每次对znode的修改都会更新mZxid。

ephemeralOwner:如果该节点为临时节点, ephemeralOwner值表示与该节点绑定的session id. 如果不是, ephemeralOwner值为0.

(重点)Zk的操作代码

package pack01_zookeeper_api;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.TreeCache;
import org.apache.curator.framework.recipes.cache.TreeCacheEvent;
import org.apache.curator.framework.recipes.cache.TreeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class ZookeeperDemo1 {
    CuratorFramework client;
    @Before
    public void init(){
        //1:定制一个重试策略
        /**
         *  3000:如果没有连接上ZK集群,则每隔3秒重试一次
         *  3:最多重试3次
         */
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,3);

        //2:获取ZK的客户端对象
        //String serverList = "192.168.88.161:2181,192.168.88.162:2181,192.168.88.163:2181";
        //需要配置:C:\Windows\System32\drivers\etc\hosts文件
        /*
            192.168.88.161 node1
            192.168.88.162 node2
            192.168.88.163 node3
         */
        String serverList = "node1:2181,node2:2181,node3:2181";
        client = CuratorFrameworkFactory.newClient(serverList, retryPolicy);

        //3:开启客户端
        client.start();
    }

    @After
    public void close(){
        //5:关闭客户端
        client.close();
    }


    //Znode的watch机制
    @Test
    public void test5ZnodeWatch() throws Exception {
        //1:将要监听的节点树存入缓存中
        TreeCache treeCache = new TreeCache(client, "/app1");

        //2:自定义监听 - 使能  使他能
        treeCache.getListenable().addListener(new TreeCacheListener() {
            //childEvent该方法自动执行,只要有事件被触发,则就会自动执行该方法
            @Override
            public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
                //因为不管是:增加/删除/修改节点,都会执行该方法,但是具体是因为哪一种才执行该方法,则需要进一步确认
                switch (treeCacheEvent.getType()) {
                    case NODE_ADDED:
                        System.out.println("监控到增加节点事件!");
                        System.out.println("有客户端上线了!");
                        break;
                    case NODE_REMOVED:
                        System.out.println("监控到节点移除事件!");
                        System.out.println("主节点挂掉了!");
                        System.out.println("让备用节点称为新的主节点!");
                        break;
                    case NODE_UPDATED:
                        System.out.println("监控到节点修改事件!");
                        //重新读取配置文件
                        break;
                    case CONNECTION_SUSPENDED:
                        break;
                    case CONNECTION_RECONNECTED:
                        break;
                    case CONNECTION_LOST:
                        break;
                    case INITIALIZED:
                        break;
                }

            }
        });

        //3:开启监听
        treeCache.start();

        //4:让程序挂起
        Thread.sleep(100000000);
    }


    //删除节点
    @Test
    public void test4DeleteZnode() throws Exception {
        client.delete().deletingChildrenIfNeeded().forPath("/app1");
    }

    //获取节点数据
    @Test
    public void test3GetZnodeData() throws Exception {
        byte[] bytes = client.getData().forPath("/app1");
        String data = new String(bytes);
        System.out.println(data);
    }



    //修改节点数据数据
    @Test
    public void test2SetZnode() throws Exception {
        client.setData().forPath("/app1","node1".getBytes());
    }

    //Znode节点的创建
    @Test
    public void test1CreateZnode() throws Exception {

        //4:进行ZK节点创建
        /*
          节点类型、节点路径、节点携带的初始数据
         */
        //创建永久节点-单级节点-携带初始化数据
        //client.create().withMode(CreateMode.PERSISTENT).forPath("/app1","windows_localhost".getBytes());
        //创建永久节点-多级节点-携带初始化数据
        //client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/xxx/yyy/zzz","windows_localhost".getBytes());
        //创建永久节点-单级节点-不携带初始化数据
        //client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/app2");

        //创建临时节点-单级节点-不携带初始化数据
        client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/tempnode");

        Thread.sleep(10000);

    }
}

ZK的选举机制

场景1-集群首次启动选举

在这里插入图片描述

场景2-Leader宕机重新选举

在这里插入图片描述

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

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

相关文章

C++回顾(二十四)—— set / multiset容器

24.1 set概述 set是一个集合容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作…

Spring——AOP核心概念和AOP入门案例

AOP:面向切面编程,一种编程范式,指导开发者如何组织程序结构 作用:在不惊动原始设计的基础上进行功能增强 Spring理念:无侵入式编程 比如测试一个方法的万次执行时间,原本没有Aop需要这样写 public void save() {Long stSystem.currentTim…

Java开发 - 消息队列之Kafka初体验

目录 前言 Kafka 什么是Kafka Kafka软件结构 Kafka的特点 怎么启动Kafka 下载Kafka 配置Kafka Zookeeper 启动Kafka Kafka案例 添加依赖 添加配置 配置启动类 创建生产者 创建消费者 测试 结语 前言 前几日总结了消息队列的一些知识,相信看完的同…

【博客631】监控网卡与进程网络IO使用情况

监控进程的网络IO使用情况 1、vnstat 由于 vnstat 依赖于内核提供的信息,因此执行以下命令来验证内核是否提供了 vnStat 所期望的所有信息: # vnstat --testkernel This test will take about 60 seconds. Everything is ok.不带任何参数的 vnstat 将…

设计模式(十九)----行为型模式之命令模式

1、概述 日常生活中,我们出去吃饭都会遇到下面的场景。 定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。命…

UE官方教程笔记03-功能、术语、操作简介

对官方教程视频[官方培训]03-UE功能、术语、操作简介 | 徐良安 Epic的笔记这一部分基本都是走马观花的简单介绍功能世界创建建模Mesh editingtool是一个全新的建模工具,具备大多数的主流建模软件的核心功能HOUDINI ENGINE FOR UNREALHoudini编辑器,可以用…

springboot2集成knife4j

springboot2集成knife4j springboot2集成knife4j 环境说明集成knife4j 第一步:引入依赖第二步:编写配置类第三步:测试一下 第一小步:编写controller第二小步:启动项目,访问api文档 相关资料 环境说明 …

C++回顾(二十一)—— list容器

21.1 list概述 list是一个双向链表容器&#xff0c;可高效地进行插入删除元素。list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[]操作符。It(ok) it5(err)需要添加头文件&#xff1a;#include <list> 21.2 list构造 &#xff08;1&#xff09;默认构造…

摘花生(简单DP)

Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它上面所有的花生。Hel…

手写代码理解vue响应式原理

vue2响应式应用了Object.defineProperty&#xff0c;vue3中的响应式则是运用proxy。 目录标题1、defineProperty2、代码理解defineProperty3、手写vue2响应式原理4、vue2监听数组响应式5、Proxy理解6、总结1、defineProperty Object.defineProperty(obj, prop, descriptor) ob…

【8.索引篇】

索引分类 索引和数据就是位于存储引擎中&#xff1a; 按「数据结构」分类&#xff1a;Btree索引、Hash索引、Full-text索引。按「物理存储」分类&#xff1a;聚簇索引&#xff08;主键索引&#xff09;、二级索引&#xff08;辅助索引&#xff09;。按「字段特性」分类&#…

linux字符设备和块设备的区别 以及网络设备

一、字符设备 1、字符设备以字节为单位。大多数设备是字符设备&#xff0c;因为他们不需要缓冲而且不以固定块大小进行操作。 2、字符设备无需缓冲直接读写。 3、字符设备只能被顺序读写。 二、块设备 1、块设备只能以块为单位接受输入和输出。 2、块设备对I/0请求有对应的缓冲…

建立自己的博客

环境安装&#xff1a; w10系统安装 第一步&#xff1a;安装git Git 官网: https://git-scm.com/ 第二步&#xff1a;安装Node.js Node.js官网&#xff1a;https://nodejs.org/zh-cn/ 使用cmd检测&#xff1a; node -v 第三步&#xff1a;安装Hexo Hexo官网&#xff1a;htt…

PyInstaller 将DLL文件打包进exe

PyInstaller 将DLL文件打包进exe方法1&#xff1a;通过--add-data命令方法2&#xff1a;通过修改 .spec扩展&#xff1a;博主热门文章推荐&#xff1a;方法1&#xff1a;通过–add-data命令 注意&#xff1a;这里 dll末尾添加的.为当前目录&#xff0c;则该dll要放到main.py同一…

【零基础入门学习Python---Python的五大数据类型之字符串类型】

一.Python的五大数据类型之字符串类型 在Python中,变量用于存储数据。变量名可以是任何字母、数字和下划线的组合。Python支持多种数据类型,包括数字、字符串、列表、元组和字典。这篇文章我们就来学习一下五大数据类型中的字符串类型。 1.1 什么是字符串? 字符串是Pyth…

[acwing周赛复盘] 第 94 场周赛20230311

[acwing周赛复盘] 第 94 场周赛20230311 一、本周周赛总结二、 4870. 装物品1. 题目描述2. 思路分析3. 代码实现三、4871. 最早时刻1. 题目描述2. 思路分析3. 代码实现四、4872. 最短路之和1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 又是笨比的一周&…

保姆级图文教程 - VirtualBox安装配置Kali Linux

文章目录下载Kali Linux虚拟机包安装Kali用户配置网络配置静态ipDHCP分配IP换deb源下载Kali Linux虚拟机包 官网地址&#xff1a;https://www.kali.org/get-kali/#kali-virtual-machines 我们选择virtualbox版的&#xff0c;就是最中间的那个。 安装Kali 将压缩包解压&…

计算机网络:传输层概述

传输层 只有主机才有的层次 传输层的功能&#xff1a; 1.传输层提供进程与进程之间的逻辑通信。 2.复用&#xff1a;应用层的所有进程可以都使用一同传输层协议。 3.分用&#xff1a;传输层从网络层收到数据后&#xff0c;交付给指明的应用进程。 4.传输层对收到的报文进行差错…

二十一、Django-restframework之序列化器补充

一、常用序列化器字段 序列化器字段处理基元值和内部数据类型之间的转换。它们还处理输入值的验证&#xff0c;以及从它们的父对象检索和设置值。 &#xff08;1&#xff09;核心参数 每个序列化器字段类构造函数至少接受这些参数。一些字段类还接受额外的&#xff0c;字段特…

STM8S系列基于IAR标准外设printf输出demo

STM8S系列基于IAR标准外设printf输出demo&#x1f4cc;STM8S/A标准外设库&#xff08;库版本V2.3.1&#xff09;&#x1f4cd;官网标准外设库&#xff1a;https://www.st.com/zh/embedded-software/stsw-stm8069.html ⛳注意事项 &#x1f6a9;在内存空间比较有限的情况下&am…