kafka学习笔记(一)--脑裂
我知道你想裂,但你先别裂
目录
- 脑裂
- Kafka脑裂实验
- Kafka如何防止脑裂--Leader Epoch
- epoch的局限性
- ISR列表
- ISR列表的伸缩机制
脑裂
用集群部署的大多数的分布式系统无可避免会面临脑裂问题。简单来说,脑裂就是在同一时刻出现了两个“Leader(或叫Master)”。设想这样一个场景:某分布式系统的分别部署在A,B两机房,每个机房有若干个节点。在正常情况下,这个分布式系统通过一致性协议(如 Paxos 或 Raft)来选举出一个 Leader,所有的读写请求都会通过 Leader 进行处理,副本们同Leader保持一致,确保数据的一致性。
假设一天出现了某种故障,A 机房和 B 机房之间的通信中断,且Leader丢失。这时,A 机房和 B 机房的节点可能会各自进行Leader选举,导致出现两个 Leader。这就是脑裂现象。
此时,如果多个不同区域的客户端向系统发送请求,根据就近路由的原则,用户可能向A机房的 leader 发送写请求,也可能向 B 机房的 leader 发送写请求,那么这两个请求可能会导致系统状态不一致。
Kafka脑裂实验
通过制造网络分区实现脑裂场景,观察kafka做了些什么
- 准备一个kafka实例,包含三个broker(brokerA,brokerB,brokerC);
- 在kafka中创建一个Topic,设置副本数为3,min.insync.replicas=1,随意生产几条消息,确认集群正常运行;
- 查看Isr,找到Leader hostip
./kafka-topics.sh --describe --zookeeper <zk ip>:<port> --topic <topic>
./zookeeper-shell.sh <zk ip>:<port> get /brokers/ids/<leader id>
4. 制造网络分区:将Leader副本与其他Follower副本之间的网络连接断开。自建kafka集群可以通过修改iptables实现(此操作会造成节点之间网络不通,请谨慎操作):
# 在Leader上执行以下命令(假设是A),阻止与B和C之间的通信
iptables -A INPUT -s <broker_B_IP> -j DROP
iptables -A OUTPUT -d <broker_B_IP> -j DROP
iptables -A INPUT -s <broker_C_IP> -j DROP
iptables -A OUTPUT -d <broker_C_IP> -j DROP
- 生产几条消息,查看Isr
./kafka-topics.sh --describe --zookeeper <zk ip>:<port> --topic <topic>
这里有两种可能:
-
A节点被排除在ISR之外:leader发生变化。在这种情况下,ISR只包含B、C节点。
-
B、C节点被排除在ISR之外:由于B、C节点无法与A节点进行通信,它们可能会落后于A节点,导致B、C节点被排除在ISR之外。在这种情况下,ISR只包含A节点。
- 恢复网络连接
iptables -D INPUT -s <broker_B_IP> -j DROP
iptables -D OUTPUT -d <broker_B_IP> -j DROP
iptables -D INPUT -s <broker_C_IP> -j DROP
iptables -D OUTPUT -d <broker_C_IP> -j DROP
- 在网络连接恢复后,Kafka集群将自动恢复正常状态。ISR列表又重新包含了A,B,C三个节点。
Kafka如何防止脑裂–Leader Epoch
鉴于kafka的副本选举机制,kafka也会面临脑裂问题。为了解决脑裂,kafka从0.11.0.0开始引入Leader Epoch的概念。
epoch是一个递增的整数。每当一个当新的leader被选举出来时,epoch都会+1。kafka的所有副本都会维护一个leader-epoch-checkpoint的文件,当eppch发生更新时,kafka会将矢量<LeaderEpoch => StartOffset> 追加到这个文件中,其中StartOffset表示当前的epoch下写入第一条消息的偏移量。副本在同步数据时,会将自己最新的epoch值一同发送给leader。leader收到follower的请求后,会检查请求中的epoch值。如果请求中的epoch值与当前leader的epoch值一致,说明follower与leader之间的同步关系符合预期,leader会接受follower的请求,将自己的数据复制给follower。如果请求中的epoch值小于当前leader的epoch值,说明follower已经过时,leader会拒绝follower的请求,并更新follower的epoch值。
# 查看leader-epoch-checkpoint
# broker ip
tail -f /kafka-logs/<your—topic-partition>/leader-epoch-checkpoint
0
1
此外,在查看leader-epoch-checkpoint的时候可能会注意到replication-offset-checkpoint 文件。这个文件记录了follower副本已经成功同步的各个主题分区的Offset信息。当follower副本重新启动或发生故障恢复时,会根据这个文件从正确的位置继续同步数据。
leader-epoch-checkpoint和replication-offset-checkpoint文件在Kafka中分别负责管理leader副本和follower副本的状态信息。它们之间的关系在于它们共同参与了Kafka副本同步和故障恢复的过程,确保了Kafka集群在面临故障时能够正确地恢复状态,保证数据的一致性和可靠性。
epoch的局限性
Kafka利用epoch机制确保了在leader发生变更时,follower副本能够及时更新自己的状态,避免了脑裂问题。在leader切换的过程中,可能会出现数据不一致的情况,这种方法在某种程度上牺牲了一致性。
如何将不一致性带来的损失降到最低?
-用ISR
ISR列表
ISR(In-Sync Replicas)列表包含了分区的leader副本和已经成功同步了leader副本数据的follower副本。当选举发生时,新的leader会从ISR列表中选举出来,这样可以确保新的Leader拥有最新的数据,从而保证数据的一致性。
# 查看ISR列表
./kafka-topics.sh --describe --zookeeper <zookeeper_host>:<zookeeper_port> --topic <topic_name>
# ./kafka-topics.sh --describe --zookeeper localhost:15028 --topic topic0
Topic:topic0 PartitionCount:1 ReplicationFactor:3 Configs:retention.ms=43200000,cleanup.policy=delete,min.insync.replicas=1,max.message.bytes=1000012,retention.bytes=-1Topic: topic0 Partition: 0 Leader: 2 Replicas: 2,1,0 Isr: 2,1,0
# 其中,Isr字段表示ISR列表,包含了当前分区的Leader副本和已经成功同步了Leader副本数据的Follower副本。该分区的副本包括节点 2、1、0,目前处于同步复制(In-Sync Replica)状态的副本有节点 2、1、0。
# 针对该主题的一些配置包括保留时间为 43200000 毫秒、清理策略为删除、最小副本数为 1,最大消息字节数为 1000012,保留字节数为 -1
当Leader接收到客户端的写入请求后,它会将数据写入本地日志,并将数据发送给所有的Follower副本。当follower副本成功写入数据后,它会向Leader发送ACK确认。当leader收到ISR列表中的所有follower副本的ack后,它会认为写入操作成功完成,并向客户端返回成功响应。
当某个副本无法及时同步leader的数据时,它会被从ISR列表中移除转为OSR(Out-of-Sync Replicas)。当该副本恢复正常并成功同步了Leader的数据后,再将它重新加入到ISR列表中。
ISR列表的伸缩机制
- 此部分内容多数引用《深入理解Kafka:核心设计与实践原理 2019》第八章,朱忠华老师的这本书确确实实🐮好顶赞
失效副本:因同步失效被ISR剔除出去的就是失效follower副本,包含失效副本的分区称为 “同步失效分区”,即 under-replicated 分区。
怎么判定一个分区是否有副本处于同步失效的状态呢?
Kafka从0.9.x版本开始就通过唯一的broker端参数replica.lag.time.max.ms来抉择,当ISR集合中的一个follower副本滞后leader副本的时间超过此参数指定的值时则判定为同步失败,需要将此follower副本剔除出ISR集合。replica.lag.time.max.ms参数的默认值为10000。一般有三种情况会导致副本失效:
- follower副本进程卡住,在一段时间内根本没有向leader副本发起同步请求,比如频繁的GC。
- follower副本进程同步过慢,在一段时间内都无法追赶上leader副本,比如I/O开销过大。
- 新上线或刚刚恢复的follower,在追赶上leader之前也处于失效状态
“当follower副本将leader副本LEO(LogEndOffset)之前的日志全部同步时,则认为该 follower 副本已经追赶上 leader 副本,此时更新该副本的lastCaughtUpTimeMs 标识。
Kafka 的副本管理器会启动一个副本过期检测的定时任务,而这个定时任务会定时检查当前时间与副本的 lastCaughtUpTimeMs 差值是否大于参数replica.lag.time.max.ms 指定的值。千万不要错误地认为 follower 副本只要拉取 leader副本的数据就会更新 lastCaughtUpTimeMs。试想一下,当 leader 副本中消息的流入速度大于follower 副本中拉取的速度时,就算 follower 副本一直不断地拉取 leader 副本的消息也不能与leader副本同步。如果还将此follower副本置于ISR集合中,那么当leader副本下线而选取此follower副本为新的leader副本时就会造成消息的严重丢失。 ”–by《深入理解Kafka:核心设计与实践原理 2019》
Isr伸缩
“Kafka 在启动的时候会开启两个与 ISR 相关的定时任务,名称分别为“isr-expiration”和“isr-change-propagation”。isr-expiration任务会周期性地检测每个分区是否需要缩减其ISR集合。当检测到ISR集合中有失效副本时,就会收缩ISR集合。如果某个分区的ISR集合发生变更,则会将变更后的数据记录到 ZooKeeper 对应的/brokers/topics/<topic>/partition/<parititon>/state节点中。” --by《深入理解Kafka:核心设计与实践原理 2019》
踢出 ISR 列表:
重回 ISR 列表:
相关文章:

kafka学习笔记(一)--脑裂
我知道你想裂,但你先别裂 目录 脑裂Kafka脑裂实验Kafka如何防止脑裂--Leader Epochepoch的局限性ISR列表ISR列表的伸缩机制 脑裂 用集群部署的大多数的分布式系统无可避免会面临脑裂问题。简单来说,脑裂就是在同一时刻出现了两个“Leader(或…...

一看就懂的RxJava源码分析
一看就懂的RxJava源码分析 前言零、观察模式简介一、RxJava使用示例一二、示例一源码分析0. 示例一代码分解1. RxJava中的观察者是谁?2. RxJava中的被观察者又是谁?3. 观察者又是如何安插到被观察者中的?4. 示例一RxJava源码整体关系类图4. R…...

halcon中灰度图自动二值化
1、首先图片要先形成灰度图,如果下一句是二值化的那就删掉 dev_clear_window() read_image(Image, D:/desktop/tmpp/微信图片_20231201184731.png) * 转为灰度图 rgb1_to_gray(Image, GrayImage) 2、双击图像变量中的GrayImage 3、工具栏点击打开灰度直方图按钮&…...

Mybatis-Plus实体类注解怎么用
TableName 用在实体类上,指定实体类对应的表名称。 TableName(value "表名") TableId 用在属性上,指定主键字段的名称和类型。主键字段的名称一般是id,类型为自增。 TableId(value "id", type IdType.AUTO) TableFi…...

我是如何写作的?
以前是如何写作的 从小学三年级开始学写作文,看的作文书,老师布置作文题目,内容我都是自己写的。那时会积累一些好词,听到什么好词就记住了。并没有去观察什么,也没有好好花心思在写作上。总觉得我写的作文与真正好的…...

绩效考核实施之——如何做好部门间绩效的平衡?
绩效考核是企业人力资源管理的难点,而绩效考核的公正往往是绩效考核成败的关键, 如果绩效考核的不公平不合理,极易带来企业人员的负面情绪,甚至引起人才的流失。想要保证绩效考核的公平性,就要做好绩效的平衡…...

全新付费进群系统源码 完整版教程
首先准备域名和服务器 安装环境:Nginx1.18 MySQL 5.6 php7.2 安装扩展sg11 伪静态thikphp 后台域名/admin账号admin密码123456 代理域名/daili账号admin密码123456 一、环境配置 二、建站上传源代码解压 上传数据库配置数据库信息 三、登入管理后台 后台域名/ad…...

拉新地推任务管理分销助手公众号开发
拉新地推任务管理分销助手公众号开发 拉新地推任务管理分销助手公众号开发功能可以帮助企业进行地推任务的管理和分销助手的开发。以下是一些可能的功能介绍: 任务管理:这个功能可以让企业创建、分配和管理地推任务。管理员可以创建地推任务,…...

MySQL三范式
欢迎大家到我的博客浏览。MySQL三范式 | YinKais Blog 简介 三大范式是 MySQL 数据库设计表结构所遵循的规范和指导方法,目的是为了减少冗余,建立结构合理的数据库,从而提高数据存储和使用的性能。 三大范式之间是有依赖关系的,…...

玩转微服务-技术篇-JSDOC教程
一. 简介 JSDoc 3 是一个用于 JavaScript 的API文档生成器,类似于 Javadoc 或 phpDocumentor。可以将文档注释直接添加到源代码中。JSDoc 工具将扫描您的源代码并为您生成一个 HTML 文档网站。 JSDoc 是一种用于 JavaScript 代码文档注释的标记语言和工具。它不仅…...

Android12之logcat日志显示颜色和时间(一百六十七)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…...

【Windows】内网穿透实现hMailServer远程发送邮件
目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网…...

深信服技术认证“SCSA-S”划重点:SQL注入漏洞
为帮助大家更加系统化地学习网络安全知识,以及更高效地通过深信服安全服务认证工程师考核,深信服特别推出“SCSA-S认证备考秘笈”共十期内容,“考试重点”内容框架,帮助大家快速get重点知识~ 划重点来啦 深信服安全服务认证工程师…...

Leetcode-二叉树oj题
1.二叉树的前序遍历 144. 二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/这个题目在遍历的基础上还要求返回数组,数组里面按前序存放二叉树节点的值。 既然要返回数组,就必然要malloc一块空间,那么我们需…...

软件磁盘阵列(software RAID)
RAID-0 等量模式(各个磁盘平均存放文件) RAID-1 镜像模式(一个文件存放两个磁盘) RAID 01 RAID 10 组合模式 RAID 5 三块以上磁盘,记录文件和同位码(存放不通磁盘,通过同…...

浏览器安全攻击与防御
前言 浏览器是我们访问互联网的主要工具,也是我们接触信息的主要渠道。但是,浏览器也可能成为攻击者利用的突破口,通过各种手段,窃取或篡改我们的数据,甚至控制我们的设备.本文将向大家介绍一些常见的浏览器安全的攻击…...

vue生命周期、工程化开发和脚手架
1、前言 持续学习记录总结中,vue生命周期、工程化开发和脚手架 2、Vue生命周期 Vue生命周期:就是一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段:创建响应式数据 2.挂…...

文件搜索工具HoudahSpot mac中文版特点
HoudahSpot mac是一款文件搜索工具,它可以帮助用户快速准确地找到文件和文件夹,支持高级搜索和过滤,同时提供了多种视图和操作选项,方便用户进行文件管理和整理。 HoudahSpot mac软件特点 高级搜索和过滤功能:软件支持…...

maven中scope和optional区别
文章目录 1. Scope(作用范围):2. Optional(可选项): 1. Scope(作用范围): Maven的<scope>元素用于指定依赖项的作用范围,即依赖项在构建和运行时的可见…...

《ChatGPT实操应用大全》探索无限可能
🗣️探索ChatGPT,开启无限可能🚀 文末有免费送书福利!!! ChatGPT是人类有史以来最伟大的发明。他能写作、绘画、翻译、看病、做菜、编程、数据分析、制作视频、解高等数学题…,他会的技能…...

基于helm的方式在k8s集群中部署gitlab - 部署(一)
文章目录 1. 背景说明2. 你可以学到什么?3. 前置条件4. 安装docker服务(所有节点)5. 部署k8s集群5.1 系统配置(所有节点)5.2 安装kubelet组件(所有节点)5.2.1 编写kubelet源5.2.2 安装kubelet5.2.3 启动kubelet 5.3 集…...

flask web开发学习之初识flask(二)
文章目录 一、创建程序实例并注册路由1. 为视图绑定绑定多个URL2. 动态URL 二、启动开发服务器1. 自动发现程序实例2. 管理环境变量3. 使用pycharm运行服务器4. 更多的启动选项5. 设置运行环境6. 调试器7. 重载器 一、创建程序实例并注册路由 app.py # 从flask包中导入flask类…...

利用异或、取反、自增bypass_webshell_waf
目录 引言 利用异或 介绍 eval与assert 蚁剑连接 进阶题目 利用取反 利用自增 引言 有这样一个waf用于防御我们上传的文件: function fun($var): bool{$blacklist ["\$_", "eval","copy" ,"assert","usort…...

K8s Docker实践三
单主机创建多个node 在Mac桌面上部署多个Kubernetes节点可以使用Minikube工具。Minikube是一个轻量级的Kubernetes工具,它可以在单个主机上创建一个虚拟集群。以下是在Mac桌面上使用Minikube部署多个Kubernetes节点的步骤: 安装Minikube,运…...

记录 | pip加速配置
以下方法不仅适用于linux,也适用于mac 临时加速配置: pip install -i https://pypi.douban.com/simple --trusted-host pypi.douban.com matplotlib3.4.0其中可选源有: https://pypi.douban.com/simple http://mirrors.aliyun.com/pypi/sim…...

HarmonyOS开发—Arkts循环渲染(ForEach)深入运用详解【鸿蒙专栏-16】
文章目录 ArkTS ForEach接口详解与应用示例ForEach接口概述介绍接口描述参数说明键值生成规则默认规则组件创建规则首次渲染非首次渲染使用场景高级用法条件渲染逻辑LazyForEach的性能优化渲染结果预期ForEach的错误使用案例与性能降低渲染结果非预期渲染性能降低结语ArkTS For…...

uniapp挽留提示2.0
项目需求:有时候挽留的ui是全屏的,用page-container也可以。后来产品提了个问题,手机侧滑的时候没那么顺畅(就是一用侧滑,就显示出来,产品要的方案是如下图,emmm大概是这个意思) 后面…...

电源控制系统架构(PCSA)之系统分区电压域
目录 4.1 电压域 4.1.1 系统逻辑 4.1.2 Always-On逻辑 4.1.3 处理器Clusters 4.1.4 图形处理器 4.1.5 其他功能 4.1.6 SoC分区示例 本章描述基于Arm组件的SoC划分为电压域和电源域。 所描述的选择并不详尽,只是可能性的一个子集。目的是描述基于Arm组件的SoC…...

[Linux] 正则表达式及grep和awk
一、正则表达式 1.1 什么是正则表达式 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 正则表达式和通配符的区别 正则…...

ssm+java车辆售后维护系统 springboot汽车保养养护管理系统+jsp
以前汽车维修人员只是在汽车运输行业中从事后勤保障工作,随着我国经济的发展,汽车维修行业已经从原来的从属部门发展成了如今的功能齐备的独立企业。这种结构的转变,给私营汽修企业和个体汽修企业的发展带来了契机,私营企业和个体维修企业的加入也带动了整个汽修行业的整体水平…...