当前位置: 首页 > news >正文

【大数据】Zookeeper 集群及其选举机制

Zookeeper 集群及其选举机制

  • 1.安装 Zookeeper 集群
  • 2.如何选取 Leader

1.安装 Zookeeper 集群

我们之前说了,Zookeeper 集群是由一个领导者(Leader)和多个追随者(Follower)组成,但这个领导者是怎么选出来的呢?我们貌似没有在配置文件中看到有关领导者和追随者的参数啊?

在此之前先来看看 Zookeeper 内部的一些机制:

  • 半数机制:只要有半数以上的节点存活,则集群可用,所以 Zookeeper 集群的节点数量适合为奇数。
  • 虽然在配置文件中没有指定领导者和追随者,但 Zookeeper 在工作时,有一个节点为 Leader,其它则为 Follower,而 Leader 是通过内部的选举机制临时产生的。

那么领导者到底是怎么选出来的呢?很简单,每台服务器都有一个 id(这里的 id 后面说),当启动的服务器超过半数的时候,就会选择 id 最大的 Server 成为领导者。比如有五台服务器,半数就是 2.5 2.5 2.5,因此当启动三台的时候就可以选出领导者。至于剩余的两台,启动之后只能成为追随者,因为领导者已经选出来了。关于这里的细节,一会儿再详细聊。

那么怎么指定服务器的 id 呢?还记得配置文件中的 dataDir 参数吗,在该参数指定的目录下创建一个 myid 文件(文件必须叫这个名字),然后在里面写上服务器的 id 即可。

[root@satori zkData]# echo 2 > myid

这里给 id 设置为 2,因为一会要搭建由三个节点组成的集群,而我希望当前节点成为 Leader,所以它的 id 应该为 2,其它的两个节点的 id 显然分别为 1 和 3。这样按着 id 从小到大的顺序启动时,该节点就会成为 Leader。

下面来我们来搭建 zookeeper 集群,总共三个节点:

  • IP:82.157.146.194,主机名:satori
  • IP:121.37.165.252,主机名:koishi
  • IP:123.60.7.226,主机名:marisa

satori 节点就是当前一直在用的节点,剩余的两个节点的 Zookeeper 也已经安装完毕。那么问题来了,我们要如何将这三个节点组成一个集群呢?显然还需要修改配置文件,先在 satori 节点进行修改。

# koishi 节点
server.1=121.37.165.252:2888:3888
# satori 节点
server.2=0.0.0.0:2888:3888
# marisa 节点
server.3=123.60.7.226:2888:3888

将集群中都有哪些节点写在 zoo.cfg 中,解释一下具体含义,首先两个冒号把等号右边分成了三部分,第一部分就不用说了,IP 地址或者主机名,用于定位节点; 2888 2888 2888 是 Leader 和 Follower 交换信息 的端口,因为副本要进行同步; 3888 3888 3888交换选举信息 的端口,因为要选出 Leader。

然后我们注意到 satori 节点的 IP 设置成了 0.0.0.0,这是因为当前的三个节点不在同一个网段,IP 用的都是公网 IP,而公网 IP 在绑定服务的时候会失败。所以在绑定的时候,其它节点的 IP 要写成公网 IP,自身节点的 IP 要写成 0.0.0.0。因此其它两个节点的 zoo.cfg 文件就应该这么改:

########## koishi 节点配置 ##########
# koishi 节点
server.1=0.0.0.0:2888:3888
# satori 节点
server.2=82.157.146.194:2888:3888
# marisa 节点
server.3=123.60.7.226:2888:3888########## marisa 节点配置 ##########
# koishi 节点
server.1=121.37.165.252:2888:3888
# satori 节点
server.2=82.157.146.194:2888:3888
# marisa 节点
server.3=0.0.0.0:2888:3888

但是在 生产中,一个集群内的节点应该都位于同一网段,然后将配置文件中的 IP 全部换成内网 IP 即可。这样彼此之间可以通过内网访问,而内网的访问速度要远远快于公网,并且还不需要走公网的流量。但我当前的三台云服务器不在同一个网段,所以只能用公网 IP,并且绑定的时候,将节点自身的 IP 换成 0.0.0.0

至于等号左边的 server. 是固定的,后面的数字表示节点的 id,而节点 id 我们说了,通过在 myid 文件中进行指定。而节点 id 决定了,最终由谁担任领导者。其中 satori 节点的 id 2 2 2,刚刚已经改过了,然后将 koishimarisa 两个节点的 id 分别改为 1 1 1 3 3 3,然后就大功告成了。

然后我们来启动 Zookeeper,由于 satori 节点的 Zookeeper 已经启动了,我们在修改完配置文件之后,需要重新启动。

在这里插入图片描述

但是我们查看状态的时候,发现出错了,相信原因很好想。因为配置文件中指定了三个节点,而剩余两个节点的 Zookeeper 还没启动。下面我们来启动一下,然后再次查看状态。

在这里插入图片描述

当剩余的两个节点启动之后,再次查看状态,发现 Mode 变成了 Leader。显然集群已经启动成功,至于剩余的两个节点,显然就是 Follower。

在这里插入图片描述
在这里插入图片描述
此时集群就启动成功了,但是关于领导者和追随者的选举问题,我们还得再说一说。

2.如何选取 Leader

领导者选举分为两种情况:

  • 集群第一次启动的时候,选举领导者。
  • 运行过程中领导者挂了,从追随者当中选择一个作为领导者。

我们先来看第一种情况,假设集群当中有 5 个节点,id 分别为 1 到 5,来看看选举过程是怎样的?这里 5 个节点按照 id 从小到大顺序启动。
在这里插入图片描述

  • 首先 server1 启动,发起一次选举,每个节点都有投票权,并且默认都会投给自己。此时 server1 1 1 1 票,但还不够半数以上( 3 3 3 票),选举无法完成,于是 server1 将状态保持为 LOOKING
  • 然后 server2 启动,再发起一次选举,重新投票。server1server2 仍会把票投给自己,然后再交换选票信息。由于 server1 发现 server2id 比自己大,于是会将自己的票改投给 server2。此时 server1 0 0 0 票,server2 2 2 2 票,但仍然没有哪个节点拥有超过半数的票,选举无法完成,server1server2 状态都保持为 LOOKING
  • 接下来 server3 启动,再发起一次选举,相信整个过程不需要解释了。老规矩还是先投给自己,再交换选票信息,然后 server1server2 发现自己的 id 都没有 server3 大,于是都会将票改投给 server3。此时 server1server2 的票数为 0 0 0server3 的票数为 3 3 3,由于 server3 的票数已超过半数,所以成功当选为 Leader,状态变为 LEADING。而 server1server2 则成为 Follower,状态改为 FOLLOWING
  • 所以 5 5 5 个节点,启动 3 3 3 个之后就能选择出 Leader。然后 server4 又启动了,于是也发起一次选举,并把票投给自己。但 server1server2server3 已经不是 LOOKING 状态,所以它们不会更改自己的选票信息,最终结果 server3 仍有 3 3 3 票,server4 只有 1 1 1 票。少数服从多数,于是会再将自己的选票交给 server3,成为 Follower,状态改为 FOLLOWING
  • 同理,最后 server5 启动,结果就是 server3 4 4 4 票,自己只有 1 1 1 票。少数服从多数,于是将自己的选票交给 server3,成为 Follower。

所以整个过程,关键点有两个

  • 每个 server 启动之后都会发起选举,并将票投给自己。然后交换选票信息,并将票投给 id 最大的 server
  • 一旦选择出 Leader,其它节点自动成为 Follower。而后启动的 server,不论 id 多大,也只能成为 Follower。

以上就是集群第一次启动的时候,选举领导者。

但如果在运行过程中,领导者挂了该怎么办呢?显然要再选举出一个新的领导者。所以当集群中的追随者发现自己连接不上领导者的时候,就会开始进入 Leader 选举,但此时是存在两种可能的。

  • 领导者真的挂了。
  • 领导者没有挂,只是追随者因为某些原因无法和领导者建立连接。比如 server5 发现连接不上 server3 了,于是它认为领导者挂了,便开启 Leader 选举。但事实上 server3 并没有挂,其它追随者都能正常连接,只是 server5 因为某些原因连接不上罢了。

先来解释第二种情况,server5 认为 server3 挂了之后,便会发起 Leader 选举,呼吁其它追随者进行投票。但是其它追随者发现领导者并没有挂,于是会拒绝 server5 的选举申请,并告知它当前已存在的领导者信息。对于 server5 而言,只需要和已存在的领导者重新建立连接,并进行数据同步即可。

server3:老子还没挂呢!!!😤

但如果是第一种情况,领导者真的挂了,该怎么办?比如这里的领导者 server3,在运行的时候,节点突然宕机了。

要解释这个问题,我们需要引入一些新的概念。

  • sid:就是我们一直说的服务器 id,用于唯一标识集群中的节点。
  • zxid:事务 id,客户端在发起一次写请求的时候,都会带有 zxid,用于标识一次服务器状态的变更。所以 Zookeeper 也是有事务的,保证每次写数据的时候,要么全部写完,要么不写,不会出现只写一半的情况。另外每个节点都有自己的 zxid,它们的值也不一定相同。
  • epoch:Leader 任期的编号,就好比古代皇帝,每个皇帝在当政的时候都有自己的年号。并且每投完一次票,这个编号就会增加。

现在假设 server3 挂了,那么要重新选举 Leader,而选举规则如下:

  • 先比较节点之间的 epochepoch 大的直接当选。
  • epoch 相同,再比较 zxidzxid 大的当选。
  • epochzxid 都相同,则比较 sidsid 大的当选。

关于这么做背后的原理,我们先暂且不表,等到后面介绍 Paxos 协议的时候再细说。而且这里的 epoch 具体是干什么用的,估计也有人不太清楚,这些我们也留到后面再说。

相关文章:

【大数据】Zookeeper 集群及其选举机制

Zookeeper 集群及其选举机制 1.安装 Zookeeper 集群2.如何选取 Leader 1.安装 Zookeeper 集群 我们之前说了,Zookeeper 集群是由一个领导者(Leader)和多个追随者(Follower)组成,但这个领导者是怎么选出来的…...

Redis 过期策略

我们在set key的时候可以设置key的过期时间,哪redis是怎么处理过期的key的呢? 有三种过期策略 定时过期:每个设置过期时间的key会创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对…...

RT_Thread 调试笔记:串口打印、MSH控制台 相关

说明:记录日常使用 RT_Thread 开发时做的笔记。 持续更新中,欢迎收藏。 1.打印相关 1.打印宏定义,可以打印打印所在文件,函数,行数。 #define PRINT_TRACE() printf("-------%s:%s:%d------\r\n", __FIL…...

(适趣AI)Vue笔试题

📑前言 本文主要是【Vue】——(适趣AI)Vue笔试题的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 …...

Matytype的安装问题(word及PPT报错问题)

特别针对:mathtype安装了多次,又卸载了多次的用户。 Word报弹错错误:参考 mathtype安装后,打开word出现没找到dll的错误,这个问题较好解决。 如何解决MathType兼容Office 2016-MathType中文网 PPT(PowerPoi…...

docker拉取镜像提示 remote trust data does not exist for xxxxxx

1、How can I be sure that I am pulling a trusted image from docker 2、docker: you are not authorized to perform this operation: server returned 401. 以上两个问题可以试试以下解决办法 DOCKER_CONTENT_TRUSTfalse 本人是使用jenkins部署自己的项目到docker容器出现…...

ElasticSearch Nested类型全文检索、聚合查询

ElasticSearch Nested类型全文检索、聚合查询 Nested类型全文检索 创建索引 PUT /products1 {"mappings": {"properties": {"fulltext": {"type": "text"},"name": {"type": "text","…...

专业级的渗透测试服务,助力航空业数字化安全启航

​某知名航空公司是中国首批民营航空公司之一,运营国内外航线200多条,也是国内民航最高客座率的航空公司之一。在数字化发展中,该航空公司以数据驱动决策,通过精细化管理、数字创新和模式优化等方式,实现了精准营销和个…...

【docker】安装 Redis

查看可用的 redis版本 docker search redis拉取 redis最新镜像 docker pull redis:latest查看本地镜像 docker images创建挂在文件 mkdir -pv /test1/docker_volume/redis/datamkdir -pv /test1/docker_volume/redis/confcd /test1/docker_volume/redis/conf/touch redis.con…...

pinia的独立维护,统一导出及持久化

目录 1.说明及示例 2.注意 1.说明及示例 在src下创建store文件夹,在store文件夹下创建index.js文件,内容如下: import { createPinia } from "pinia"; // pinia的持久化 import piniaPluginPersistedstate from "pinia-pl…...

【AI视野·今日Robot 机器人论文速览 第六十七期】Mon, 1 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Mon, 1 Jan 2024 Totally 16 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers MURP: Multi-Agent Ultra-Wideband Relative Pose Estimation with Constrained Communications in 3D Environments Authors A…...

FBL刷写

刷写 1、刷写需求的理解2、刷写流程2.1、预编程阶段:保证在编程阶段的动作能够正常操作,控制器给响应。整车功能不会出现问题 刷写某一控制器时,避免其他控制器集DTC,85控制DTC; 28 通信控制.保证总线负载率不要过高(下…...

OpenCV-Python(24):模板匹配

原理及介绍 模板匹配是一种常用的图像处理技术,它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动,并计算它们的相似度,找到相似度最高的位置即为匹配…...

机器学习--回归算法

🌳🌳🌳小谈:一直想整理机器学习的相关笔记,但是一直在推脱,今天发现知识快忘却了(虽然学的也不是那么深),但还是浅浅整理一下吧,便于以后重新学习。 &#x1…...

计算机网络——多址复用技术

1. 频分多址(FDMA) 1.1 基本原理 频率分配:在FDMA系统中,整个可用的频带被分割成多个较小的频带或通道。每个通道分配给一个用户。 时间利用:用户在分配给他们的频道上持续进行通信,不受时间限制。 1.2 优…...

stm32 HAL库 4096线ABZ编码器

[TOC]目录 ABZ编码器 4096线 买的是这个 AB相代表计数方向,Z代表过零点 cubemx配置 定时器Encoder 也可以选上DMA 中断 Z相GPIO中断 找一个空闲管脚 打开对应中断 代码 不用DMA int main(void) {short Enc_cnt 0;HAL_TIM_Encoder_Start_IT(&ht…...

Java爬虫之Jsoup

1.Jsoup相关概念 Jsoup很多概念和js类似,可参照对比理解 Document :文档对象。每份HTML页面都是一个文档对象,Document 是 jsoup 体系中最顶层的结构。 Element:元素对象。一个 Document 中可以着包含着多个 Element 对象&#…...

如何在 C# 12 中使用主构造函数

C# 12 中最引人注目的新功能之一是对主构造函数的支持。主构造函数的概念并不新鲜。包括 Scala、Kotlin 和 OCaml 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。 在本文中,我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提…...

Zookeeper之Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有: ZooKeeper官方的Java客户端API。第三方的Java客户端API,比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…...

将文本文件导入Oracle数据库的简便方法:SQL Loader Express

需求 我有一个文本文件dbim.txt,是通过alert log生成的,内容如下: 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表: create table dbim(a varchar(16));我想把日志文件导入Or…...

终极视频硬字幕提取指南:本地OCR识别87种语言的完整解决方案

终极视频硬字幕提取指南:本地OCR识别87种语言的完整解决方案 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字…...

春节不用愁对联:春联生成模型实战,3步生成专属春联

春节不用愁对联:春联生成模型实战,3步生成专属春联 1. 传统年味遇上AI科技 每到春节,家家户户贴春联是延续千年的传统习俗。一副好春联既要对仗工整,又要寓意吉祥,还要符合自家特色,这让不少人为之头疼。…...

SenseVoiceSmall实战案例:如何用AI分析会议录音中的情绪变化

SenseVoiceSmall实战案例:如何用AI分析会议录音中的情绪变化 1. 会议录音分析的痛点与解决方案 在日常工作中,会议录音分析一直是个耗时费力的任务。传统方法需要人工反复听取录音,不仅效率低下,还容易遗漏关键信息。特别是会议…...

为什么你的FastAPI AI接口在K8s里流式失败?——基于eBPF追踪的12层网络栈+ASGI生命周期时序图(含cgroup内存隔离失效证据)

第一章:FastAPI 2.0 异步 AI 流式响应对比评测报告FastAPI 2.0 原生强化了对 async/await 的深度支持,尤其在处理大语言模型(LLM)的逐 token 流式生成场景中,显著提升了吞吐量与首字节延迟(TTFB&#xff09…...

GLM-4V-9B GPU高效利用:通过dtype对齐+4-bit量化实现A10G 24GB满载运行

GLM-4V-9B GPU高效利用:通过dtype对齐4-bit量化实现A10G 24GB满载运行 1. 引言 最近在折腾多模态大模型本地部署的朋友,可能都遇到过类似的问题:模型参数动辄几十上百亿,显存要求高得吓人,好不容易找到个能在消费级显…...

系统移植-STM32MP1_TF-A概述

文章目录 1 设备安全2 TF-A简介3 ARMv7和ARMv8权限等级3.1 ARMv7-A工作模式3.2 ARMv8工作模式 4 TF-A不同启动阶段4.1 bl14.2 bl24.3 bl314.4 bl324.5 bl33 5 STM32MP1中的TF-A5.1 STM32MP1_TF-A框架5.1.1 STM32MP1下的bl15.1.2 STM32MP1下的bl25.1.3 STM32MP1下的bl325.1.4 ST…...

Double Q-learning实战:如何用Python解决过估计问题(附代码示例)

Double Q-learning实战:如何用Python解决过估计问题(附代码示例) 强化学习中的Q-learning算法因其简洁高效而广受欢迎,但在某些场景下会出现严重的过估计问题。本文将深入探讨这一现象的本质,并手把手教你用Python实现…...

解决ModelScope与datasets版本兼容性问题的最佳实践

1. 为什么ModelScope和datasets版本兼容性这么重要? 第一次用ModelScope加载数据集时,我就被报错整懵了。明明按照官方文档安装了最新版,却提示"ImportError: cannot import name _FEATURE_TYPES from datasets"。后来才发现是Mode…...

CUA Computer SDK:虚拟机自动化的终极解决方案,让AI代理掌控桌面级交互

CUA Computer SDK:虚拟机自动化的终极解决方案,让AI代理掌控桌面级交互 【免费下载链接】cua Create and run high-performance macOS and Linux VMs on Apple Silicon, with built-in support for AI agents. 项目地址: https://gitcode.com/GitHub_T…...

老旧Mac升级指南:OpenCore Legacy Patcher实现Monterey系统适配

老旧Mac升级指南:OpenCore Legacy Patcher实现Monterey系统适配 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着macOS系统不断迭代,许多经典Ma…...