Zookeeper-集群架构

Zookeeper集群架构

集群角色

  • Leader: 领导者

事务请求(写操作)的唯一调度者和处理者,保证集群事务处理的顺序性;集群内部各个服务器的调度者。对于create、setData、delete等有写操作的请求,则要统一转发给leader处理,leader需要决定编号、执行操作,这个过程称为事务。

  • Follower: 跟随者

处理客户端非事务(读操作)请求(可以直接响应),转发事务请求给Leader;参与集群Leader选举投票。

  • Observer: 观察者

对于非事务请求可以独立处理(读操作),对于事务性请求会转发给leader处理。Observer节点接收来自leader的inform信息,更新自己的本地存储,不参与提交和选举投票。通常在不影响集群事务处理能力的前提下提升集群的非事务处理能力。

#配置一个ID为3的观察者节点:
server.3=192.168.0.3:2888:3888:observer

Observer应用场景:

  • 提升集群的读性能。因为Observer和不参与提交和选举的投票过程,所以可以通过往集群里面添加observer节点来提高整个集群的读性能。

  • 跨数据中心部署。 比如需要部署一个北京和上海两地都可以使用的zookeeper集群服务,并且要求北京和香港客户的读请求延迟都很低。解决方案就是把香港的节点都设置为observer。

集群架构

leader节点可以处理读写请求,follower只可以处理读请求。follower在接到写请求时会把写请求转发给leader来处理。

Zookeeper数据一致性保证:

  • 全局可线性化(Linearizable )写入:先到达leader的写请求会被先处理,leader决定写请求的执行顺序。

  • 客户端FIFO顺序:来自给定客户端的请求按照发送顺序执行。

三节点Zookeeper集群搭建

环境准备:三台虚拟机

192.168.65.163
192.168.65.184
192.168.65.186

修改zoo.cfg配置,添加server节点配置

# 修改数据存储目录
dataDir=/data/zookeeper

#三台虚拟机 zoo.cfg 文件末尾添加配置
server.1=192.168.65.163:2888:3888
server.2=192.168.65.184:2888:3888
server.3=192.168.65.186:2888:3888

server.A=B:C:D

A 是一个数字,表示这个是第几号服务器; 集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面有一个数据 就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个server。

B 是这个服务器的地址;

C 是这个服务器Follower与集群中的Leader服务器交换信息的端口;

D 是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

创建 myid 文件,配置服务器编号

在dataDir对应目录下创建 myid 文件,内容为对应ip的zookeeper服务器编号,并且上下左右不要有空格

注意:添加 myid 文件,一定要在 Linux 里面创建,在 notepad++里面很可能乱码

启动zookeeper server集群

启动前需要关闭防火墙(生产环境需要打开对应端口)

# 分别启动三个节点的zookeeper server
bin/zkServer.sh start
# 查看集群状态
bin/zkServer.sh status

#centos7   
# 检查防火墙状态
systemctl status firewalld
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

Zookeeper四字命令使用

用户可以使用Zookeeper四字命令获取 zookeeper 服务的当前状态及相关信息。用户在客户端可以通过 nc(netcat) 向 zookeeper 提交相应的命令。

安装 nc 命令:
# centos 
yum install nc                

四字命令格式:
echo [command] | nc [ip] [port]

ZooKeeper 常用四字命令主要如下:

四字命令功能描述
conf3.3.0版本引入的。打印出服务相关配置的详细信息。
cons3.3.0版本引入的。列出所有连接到这台服务器的客户端全部连接/会话详细信息。包括"接受/发送"的包数量、会话id、操作延迟、最后的操作执行等等信息。
crst3.3.0版本引入的。重置所有连接的连接和会话统计信息。
dump列出那些比较重要的会话和临时节点。这个命令只能在leader节点上有用。
envi打印出服务环境的详细信息。
reqs列出未经处理的请求
ruok测试服务是否处于正确状态。如果确实如此,那么服务返回"imok",否则不做任何相应。
stat输出关于性能和连接的客户端的列表。
srst重置服务器的统计。
srvr3.3.0版本引入的。列出连接服务器的详细信息
wchs3.3.0版本引入的。列出服务器watch的详细信息。
wchc3.3.0版本引入的。通过session列出服务器watch的详细信息,它的输出是一个与watch相关的会话的列表。
wchp3.3.0版本引入的。通过路径列出服务器watch的详细信息。它输出一个与session相关的路径。
mntr3.4.0版本引入的。输出可用于检测集群健康状态的变量列表

ZooKeeper: Because Coordinating Distributed Systems is a Zoo

开启四字命令

//方法1: 在zoo.cfg 文件里加入配置项让这些指令放行
#开启四字命令
4lw.commands.whitelist=*

//方法2:在zk的启动脚本zkServer.sh中新增放行指令
#添加JVM环境变量-Dzookeeper.4lw.commands.whitelist=*
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

stat 命令

stat 命令用于查看 zk 的状态信息,实例如下:

 echo stat | nc 192.168.65.186 2181

ruok 命令

ruok 命令用于查看当前 zkserver 是否启动,若返回 imok 表示正常。

echo ruok | nc 192.168.65.186 2181

Zookeeper选举原理

ZooKeeper的Leader选举过程是基于投票和对比规则的,确保集群中选出一个具有最高优先级的服务器作为Leader来处理客户端请求。以服务启动期间选举为例:

投票对比规则:

  • 首先比较epoch,选取具有最大epoch的服务器。epoch用于区分不同的选举轮次,每次重新选举时都会增加epoch。

  • 如果epoch相同,则比较zxid(事务ID),选取事务ID最大的服务器。zxid表示最后一次提交的事务ID。

  • 如果zxid也相同,则比较myid(服务器ID),选取服务器ID最大的服务器。

/**
 * Check if a pair (server id, zxid) succeeds our
 * current vote.
 *
 */
protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) {
    LOG.debug(
        "id: {}, proposed id: {}, zxid: 0x{}, proposed zxid: 0x{}",
        newId,
        curId,
        Long.toHexString(newZxid),
        Long.toHexString(curZxid));

    if (self.getQuorumVerifier().getWeight(newId) == 0) {
        return false;
    }

    /*
     * We return true if one of the following three cases hold:
     * 1- New epoch is higher
     * 2- New epoch is the same as current epoch, but new zxid is higher
     * 3- New epoch is the same as current epoch, new zxid is the same
     *  as current zxid, but server id is higher.
     */

    return ((newEpoch > curEpoch)
            || ((newEpoch == curEpoch)
                && ((newZxid > curZxid)
                    || ((newZxid == curZxid)
                        && (newId > curId)))));
}

zxid的数据结构

根据这个工具类,可以得出zxid的数据结构的一些信息。

1、zxid是一个64位的整数,由高32位的epoch和低32位的counter组成。

2、epoch表示ZooKeeper服务器的逻辑时期(logical epoch),它是一个相对时间的概念,用于区分不同的Leader选举周期。

3、counter是一个在每个时期(epoch)内递增的计数器,用于标识事务的顺序。

public class ZxidUtils {

    public static long getEpochFromZxid(long zxid) {
        return zxid >> 32L;
    }
    public static long getCounterFromZxid(long zxid) {
        return zxid & 0xffffffffL;
    }
    public static long makeZxid(long epoch, long counter) {
        return (epoch << 32L) | (counter & 0xffffffffL);
    }
    public static String zxidToString(long zxid) {
        return Long.toHexString(zxid);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode—46.全排列【中等】

2023每日刷题&#xff08;六十六&#xff09; Leetcode—46.全排列 算法思想 对于排列来说&#xff0c;我们需要考虑数字之间的相对顺序&#xff0c;不同的相对顺序会产生不同的排列方式。此外&#xff0c;序列中的每个数字一定存在于每个排列当中。因此&#xff0c;不能依次…

【学习笔记】Java函数式编程02——Stream流

文章目录 三、Stream流3.1 概述3.2 快速入门3.2.1 数据准备3.2.2 场景练习3.2.2.1 场景一、遍历所有作家并打印:star:使用stream()流的forEach方法 3.2.2.2 场景二、打印所以年龄小于18的作家名字&#xff0c;并且注意去重:star:distinct()方法:star:filter()方法 3.2.2.3 场景…

【数据结构和算法】定长子串中元音的最大数目

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一&#xff1a;滑动窗口 2.2 方法二&#xff1a;滑动窗口优化版 三、代码 3.1 方法一&#xf…

Python-基于fastapi实现SSE流式返回(类似GPT)

最近在做大模型对话相关功能&#xff0c;需要将对话内容流式返回给前端页面&#xff08;类似GPT的效果&#xff09;。下面直接说下如何实现&#xff1a; 1.首先导入fastapi和sse流式返回所需要的包 from fastapi import APIRouter, Response, status from sse_starlette.sse …

【数据结构和算法】子数组最大平均数 I

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 滑动窗口含义 2.2 滑动窗口一般解法 2.3 方法一&#xff1a;滑动窗口 三、代码 3.1 方法一&#…

数据挖掘体系介绍

数据挖掘是什么&#xff1f; 简而言之&#xff0c;对数据进行挖掘&#xff0c;从中提取出有效的信息。一般我们会把这种信息通过概念、规则、规律、模式等有组织的方式展示出来&#xff0c;形成所谓的知识。特别是在这个大数据时代&#xff0c;当数据多到一定程度&#xff0c;…

Jenkins 执行远程脚本的插件—SSH2 Easy

SSH2 Easy 是什么&#xff1f; SSH2 Easy 是一个 Jenkins 插件&#xff0c;它用于在 Jenkins 构建过程中通过 SSH2 协议与远程服务器进行交互。通过该插件&#xff0c;用户可以在 Jenkins 的构建过程中执行远程命令、上传或下载文件、管理远程服务器等操作。 以下是 SSH2 Eas…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表)

一、模型user对象>和数据库的字段关联 & 自动生成 【其中涉及删除表数据&#xff0c;一切又从零开始】 二、模型user对象>和数据库的字段关联 2.1在model文件夹下&#xff0c;新建 user对象 2.1.1 概念 大家可以想象我们现在的数据是存储在数据库里的&…

HOT 100 最难的题居然是游戏厂的最爱

写在前面 翻看 网易 历年笔面题单的时候&#xff0c;发现一道有意思的题目。 该题评论区&#xff0c;网易 的踪影很少&#xff0c;反而被那些在 4399 笔试中遇到的同学所攻陷&#xff1a; 好嘛&#xff0c;所以这道题还是「游戏厂」的最爱&#xff1f;&#xff01;&#x1f923…

Ubuntu 常用命令之 fdisk 命令用法介绍

fdisk 是一个用于处理磁盘分区的命令行工具,它在 Linux 系统中广泛使用。fdisk 命令可以创建、删除、更改、复制和显示硬盘分区,以及更改硬盘的分区 ID。 fdisk 命令的常用参数如下 -l:列出所有分区表-b:设置扇区大小,如果不设置,默认为 512 字节-u:改变显示/输入单位-…

亚马逊鲲鹏系统引爆广告点击率提升秘籍

在竞争激烈的电商市场&#xff0c;提高广告点击率成为各大卖家争相追求的目标。而如今&#xff0c;亚马逊鲲鹏系统的强大功能再次为卖家们打开了广告优化的新大门。其中&#xff0c;搜索广告功能更是成为提高关键词排名的利器。本文将详细介绍如何通过亚马逊鲲鹏系统实现点击广…

全球知名的五款JavaScript混淆加密工具详解

​ 现在市场上有很多好用的混淆加密工具&#xff0c;其中一些比较流行且受欢迎的工具包括&#xff1a; 1、UglifyJS&#xff08;罗马尼亚&#xff09;&#xff1a;UglifyJS是一个非常流行的 JavaScript工具库&#xff0c;它可以压缩、混淆、美化和格式化 JavaScript 代码。使用…

A01、关于jvm执行子系统

1、Class 类文件结构 1.1、Java跨平台的基础 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码&#xff08;ByteCode&#xff09;是构成平台无关性的基石&#xff0c;也是语言无关性的基础。Java虚拟机不和包括Java在内的任何语言绑定&#xff0c;它只与 “…

新三板炒股开户需要满足哪些条件?交易规则有哪些?

新三板是全国中小企业股份转让系统&#xff0c;属于场外市场&#xff0c;不能满足在主板上市的中小企业就可以申请在新三板挂牌交易。 一、新三板开通条件 新三板分为2个层级&#xff1a; 创新层&#xff1a;开通前10个交易日日均资产100万及以上&#xff0c;两年的股票交易经…

Jenkins 构建触发器指南

目录 触发远程构建 (例如&#xff0c;使用脚本) 描述 配置步骤 安全令牌 在其他项目构建完成后触发构建 描述 配置步骤 定时触发构建 描述 配置步骤 GitHub钩子触发GITScm轮询 描述 配置步骤 Poll SCM - 轮询版本控制系统 描述 触发远程构建 (例如&#xff0c;使…

基于SSM的双减后初小教育课外学习生活活动平台的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

基于EasyDarwin、ffmpeg实现rtsp推流

目录 1 安装EasyDarwin 2 编译安装ffmpeg 3 启动EasyDarwin 4 ffmepg推流 5 百度网盘备份 某项目中测试时需要用到推流&#xff0c;于是用EasyDarwin、ffmpeg实现了RTSP推流&#xff0c;简单记录下过程&#xff0c; 1 安装EasyDarwin 这个可以去官网下载&#xff1a;Eas…

SearchWP WordPress高级网站内容搜索插件

点击阅读SearchWP WordPress高级网站内容搜索插件原文 SearchWP WordPress高级网站内容搜索插件是一个非常强大的工具&#xff0c;可以显着增强您网站的搜索功能。通过向网站访问者提供高度相关和精确的搜索结果&#xff0c;它可以有效地简化他们的搜索过程&#xff0c;促进发…

快速能访问服务器的文件

1、背景 访问ubuntu上的文件 2、方法 python3 -m http.server 8081 --directory /home/ NAS 共享访问协议 — NFS、SMB、FTP、WebDAV 各有何优势&#xff1f;http://1 Ubuntu 搭建文件服务器&#xff08;Nginx&#xff09;

SCA面面观 | SCA关键技术深度解析

数字时代的软件开发普遍遵循敏捷实践&#xff0c;发布和部署周期都很短&#xff0c;开发团队非常依赖开源来加速创新迭代速度。因此&#xff0c;对团队项目中包含的每个开源组件进行跟踪非常重要&#xff0c;可以避免法律风险&#xff0c;保持强大的安全态势。 在DevSecOps环境…