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);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试 - 区间交集 - 深度优先搜索dfs算法(滥用)(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述备注用例1、输入2、输出3、说明 四、解题思路1、核心思路&#xff1a;2、具体步骤 五、Java算法源码再重新读一遍题目&#xff0c;看看能否优化一下~解题步骤也简化了很多。 六、效果展示1、输入2、输出3、说明 华为OD机试 2…

Actuator内存泄露及利用Swagger未授权自动化测试实现

目录 0x00 前言 0x01 Actuator 泄露及利用 1、Actuator heapdump 内存泄露 2、知道泄露后如何进一步利用 3、如何发现 Actuator 泄露&#xff08;白盒/黑盒&#xff09; 0x02 Swagger自动化测试 1、什么是Swagger&#xff1f; 2、PostmanBurpSuiteXray 联动 3、思考 0x…

某电子文档安全管理系统 SQL注入漏洞复现

漏洞介绍 亿赛通电子文档安全管理系统 (简称: CDG)是一款电子文档安全加密软件&#xff0c;该系统利用驱动层透明加密技术&#xff0c;通过对电子文档的加密保护&#xff0c;防止内部员工泄密和外部人员非法窃取企业核心重要数据资产&#xff0c;对电子文档进行全生命周期防护…

大创项目推荐 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

OpenCV技术应用(9)— 视频的暂停播放和继续播放

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教大家如何控制视频的暂停播放和继续播放&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍…

Python算法例19 创建最大数

1. 问题描述 给定两个长度分别是m和n的数组&#xff0c;数组的每个元素都是数字0~9&#xff0c;从这两个数组当中选出k个数字来创建一个最大数&#xff0c;其中k满足k&#xff1c;mn&#xff0c;选出来的数字在创建最大数里的位置必须与在原数组内的相对位置一致。返回k个元素…

Git报错x509: certificate signed by unknown authority

下载报错&#xff1a; Error downloading object: model-00001-of-00008.safetensors (ed3ac49): Smudge error: Error downloading model-00001-of-00008.safetensors (ed3ac4983f682a999b0e4b6f072aad294c4fd9a7e968e90835ba5c4b466d3c7c): LFS: Get https://cdn-lfs.huggin…

TDengine 创始人陶建辉受邀参与 TOP100Summit,发表工程师文化主题演讲

在 AGI 时代&#xff0c;数字化成为组织形态的重要特征&#xff0c;它可以帮助组织实现上下一致的目标和信息的高频传递&#xff0c;从而实现战略目标的协同和敏捷进化。在这样的大背景下&#xff0c;开发者们面临的实际挑战是如何避免技术和业务之间的割裂。 12 月 14-17 日&…

Google Play不会凭空消失,这篇文章带你重新找回丢失的它

你是不是因为不小心从手机上删除了Google Play而难过?或者你是否注意到你的Android设备上缺少Google Play图标?你一定很担心你现在会如何下载应用程序。别担心。在这篇文章中,我们将告诉你如何恢复已删除的谷歌商店。 Google Play可以卸载吗 让我们明确一点:除了一些特殊…

若依(ruoyi)管理系统标题和logo修改

1、网页上的logo 2、页面中的logo 进入ruoyi-ui --> src --> assets --> logo --> logo.png&#xff0c;把这个图片换成你自己的logo 3、网页标题 进入ruoyi-ui --> src --> layout --> components --> Sidebar --> Logo.vue&#xff0c;将里面的…

如何在centos装maven

1&#xff1a;进入maven官方网址&#xff1a; Maven – Welcome to Apache Mavenhttps://maven.apache.org/index.html点击 然后找一个版本&#xff0c;比如3.8.2 centos点击这个&#xff1a; 将这个下下来后到虚拟机里解压&#xff0c;tar -zxvf 这个gz文件 然后配置环境变…

Java多线程,一文掌握Java多线程知识文集。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…