图解Kafka | 彻底弄明白 Kafka 两个最重要的配置
我已经使用 Kafka 近两年了,我发现有两个配置很重要,但是不太容易理解。这两个配置分别是acks和min.insync.replicas。
本文将通过一些插图来帮助理解这2个配置,以便更好的使用Kafka为我们服务。
复制
我假设你已经熟悉 Kafka了 ,但为了更好地理解这些配置,还是有必要回顾一下Kafka的基础知识。
在Kafka中,每个主题的分区由一个 leader 副本 和若干个 follower 副本 组成,副本个数(leader副本和follower副本之和)可以通过replication.factor
进行配置,其默认值是3,这也是一般场景下推荐的值,这种设置能够提供一定的容错能力和数据冗余,确保数据的可靠性。见下图。
生产者客户端只会向leader副本写入数据,而follower副本只负责异步复制数据,不会对外提供服务,也就是说对于客户端而言,Kafka的Follower副本并不起直接作用。
由于分布式系统的复杂性,我们需要一种方法来判断这些follower是否跟上leader的步伐——它们是否将生产者写入到leader中的最新数据同步过来?
同步副本(In-sync Replicas)
在数据同步过程中,follower副本 相对于 leader副本 而言可能会有一定程度上的滞后。根据这个特性,Kafka 中的副本被分为两个集合:ISR(In-Sync Replicas) 和 OSR(Out-of-Sync Replicas)。
-
ISR集合:所有与 leader 副本保持一定程度同步的副本(包括 leader 副本在内)组成的集合。当Leader副本出现故障后,只有这个集合中的 副本才能被选举为leader((不过可以修改参数配置来改变这个行为)。)。
-
OSR集合:与 leader 副本同步滞后过多的副本组成的集合。
leader副本负责维护和跟踪 ISR 集合中所有 follower 副本的同步状态,当某个 follower 副本的滞后程度过高时,leader副本 会将它从 ISR 集合中剔除。当然,如果 OSR 集合中有 follower 同步进度追上了 leader,那么 leader 也会把它从 OSR 集合中转移至 ISR 集合。
acks配置
了解了 Kafka 的副本机制后,我们可以探讨 acks 配置了。
acks
是生产者客户端的一个配置选项,它表示生产者发送的消息要有多少个副本节点接收到,生产者才认为消息发送成功,其取值可以为0、1、-1(也可以表示为 all)。
acks=0
当 acks 设置为 0 时,生产者在发送消息后不需要等待来自broker的确认信息,生产者在消息发送出去后就认为写入成功。这种设置具有最高的效率,但最容易导致消息丢失,因为生产者不等待任何确认。
acks=1
当 acks 设置为 1 时,只要leader副本已经收到消息并将其写入本地日志中,就会返回ack给生产者,这种方式的安全性较高,但仍然存在一定的消息丢失风险:考虑到这样一个场景,生产者发送的消息确实成功写入到了leader副本,leader副本就会返回成功响应给生产者,但是这条消息还没来得及同步到follower副本中,此时leader副本崩溃,那么这条消息还是会丢失,因为新选举的leader副本中并没有这条对应的消息。
相对其它两种设置,ack=1这种配置性能和安全是最均衡的。
acks=all
当 acks 设置为 -1 或者all时,leader等待所有同步副本都收到该消息后才会返回ack给生产者。保证了只要有⼀个同步副本存在,消息就不会丢失,这种方式最安全,但性能最差。
min.insync.replicas
如果系统对数据安全性要求高,不允许丢数据,那么需要将acks配置为all。但是仅配置acks=all还是会存在问题。
如果一个分区有3个副本,正常情况ISR里面就是3个副本,但由于网络等问题ISR集合里面的副本数量可能会变化,当ISR集合的副本减少到只有 1 个时,也就是说leader是唯一同步副本,acks=all其实就退化成acks=1了(只需要leader副本保存好消息就返回ack),前面我们已经介绍过,acks = 1是会存在消息丢失的可能。
为了防止这种情况发生,可以使用 min.insync.replicas 配置。
min.insync.replicas是broker上的配置,它指定了当acks=all时,ISR 中必须存在的最少同步副本数量。如果 ISR 中的同步副本数量小于这个值,写入操作将会失败,对于不能忍受消息丢失的系统来说,写入失败总比写进去然后丢了强。
例如,在下图中,有2个同步副本(Broker 3 不是同步副本),并且在生产者上设置了acks=all, broker上设置了min.insync.replicas=2,那么意味着当两个同步副本都收到消息后,leader才会返回ack给生产者。
如果同步副本数量低于这个值,生产者将收到异常,下图中, Brokers 2 and 3都不是同步副本,同步副本只有leader1个,但是min.insync.replicas=2,也就是说同步副本数小于这个min.insync.replicas设置的值,因此,任何消息的写入都将会失败。
需要注意的是,对于下图这种情况,使用acks=0或acks=1配置的生产者会成功将消息6写入分区。
误区
一个常见的误解是:认为min.insync.replicas表示有多少副本需要收到消息才能让leader响应ack给生产者。
事实并非如此,实际上,min.insync.replicas表示在处理请求时需要存在的最少同步副本数量。
以下图为例。即使配置了min.insync.replicas=2,leader也不会在仅有2个副本确认的情况下响应ack给生产者,而是等待所有3个副本确认才会响应ack给生产者。
这就是全部内容!配合插图是不是很容易理解?
相关文章:

图解Kafka | 彻底弄明白 Kafka 两个最重要的配置
我已经使用 Kafka 近两年了,我发现有两个配置很重要,但是不太容易理解。这两个配置分别是acks和min.insync.replicas。 本文将通过一些插图来帮助理解这2个配置,以便更好的使用Kafka为我们服务。 复制 我假设你已经熟悉 Kafka了 ÿ…...
创建线程的三种方式
创建线程的三种方式 1. Thread 匿名内部类 Slf4j public class CreateThread {public static void main(String[] args) {Thread t1 new Thread("t1") {Overridepublic void run() {log.info("hello world");}};t1.start();} }2.定义 Runable public s…...
官宣|Apache Flink 1.20 发布公告
作者:郭伟杰(阿里云), 范瑞(Shopee) Apache Flink PMC(项目管理委员)很高兴地宣布发布 Apache Flink 1.20.0。与往常一样,这是一个充实的版本,包含了广泛的改进和新功能。总共有 142 人为此版本做出了贡献,…...

HarmonyOS应用一之登录页面案例
目录: 1、代码示例2、代码分析3、注解分析 1、代码示例 实现效果: /** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance w…...

KubeSphere 部署 Kafka 集群实战指南
本文档将详细阐述如何利用 Helm 这一强大的工具,快速而高效地在 K8s 集群上安装并配置一个 Kafka 集群。 实战服务器配置(架构 1:1 复刻小规模生产环境,配置略有不同) 主机名IPCPU内存系统盘数据盘用途ksp-registry192.168.9.904840200Harbor 镜像仓库…...

手把手教你安装音乐制作软件FL Studio 24.1.1.4285中文破解版
在当今数字化时代,音乐创作不再局限于传统的乐器和录音室,而是借助先进的音乐制作软件,如FL Studio,实现了前所未有的便捷与高效。FL Studio,以其强大的功能、直观的界面和丰富的插件资源,成为了众多音乐制…...
SDL 与 OpenGL 的关系
OpenGL 和 SDL 是两个不同的库,但它们可以配合使用来创建图形应用程序。 SDL(Simple DirectMedia Layer) SDL 是一个跨平台的多媒体库,用于处理图形、声音、输入和其他游戏开发所需的功能。它简化了窗口创建、事件处理和图形上下…...

考研数学 线性代数----行列式与矩阵
核心框架 前置知识 正式内容 知识点1:单位矩阵 知识点2:可逆矩阵 知识点3: |A|与可逆 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识点: 知识…...

Golang实现简单的HTTP服务,响应RESTful请求判断形状大小
题目要求: 题目 1.shape 接口有面积Area() float64和 周长Perimeter()fioat64 两个法。为Circle Rectangle实现shape 接口。 2.实现isGreater(shape1,shape2 shape)boo1 函数,用于比较两个形状的大小,并使用单元测试验证 3.实现http.Handle…...

使用C语言构建Lua库
Lua 本身是用 C 语言编写的,因此使用 C 编写扩展可以更好地与 Lua 引擎集成,减少性能瓶颈,同时C 语言提供了对底层硬件和操作系统功能的直接访问能力,让 Lua 可以通过 C 扩展来实现对文件系统、网络等高级功能的支持。因为C 语言非…...

愤怒的江小白,这几年怎么了?
近日,东方甄选和江小白的纠纷引发了广泛关注。 8月8日晚间,东方甄选直播间中,主播天权在带货某款白酒产品时突然对比点评江小白产品,称江小白“不是白酒”:“你现在去看江小白的包装,上面是没有‘白酒’这…...

Unity教程(十)Tile Palette搭建平台关卡
Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…...

如何防止员工私自拷贝公司内部文件?安企神帮你解决泄密之忧
在企业运营中,保护公司的机密信息至关重要。员工私自拷贝公司内部文件不仅可能导致商业秘密泄露,还可能损害公司的声誉和经济利益。下面我们将介绍一些有效的方法来防止这种情况的发生,并以“安企神”软件为例进行详细说明。 1. 明确规章制度…...
Linux应急响应检查工具
最近一直在优化的 linux 应急检查脚本,也是我一直在应急使用的工具 https://github.com/sun977/linuxcheckshoot 脚本包含两个检查工具,详情可看 README 或者 Banner linuxGun.sh 和 linuxcheck.sh 区别 1、linuxcheck.sh 是完整的 linux 系统检查脚本,…...
CP AUTOSAR标准之EEPROMAbstraction(AUTOSAR_SWS_EEPROMAbstraction)(更新中……)
1 简介和功能概述 EEPROM抽象层的功能、API和配置(见图1)。 图1:内存硬件抽象层模块概览 EEPROM抽象(EA)从设备特定的寻址方案和分段中抽象出来,并为上层提供虚拟寻址方案和分段以及“几乎”无限数量的擦除周期。 3 相关文献 3.1 输入文件 [1]基础软件模块列表AUTO…...
重启redis服务时报错:Failed to start redis.service: Unit not found
重启redis服务时报错:Failed to start redis.service: Unit not found redis配合安全修改了bind和auth配置,重启的时候报错了,试了很多方法,最后才通过日志解决了 1 重新加载systemd 配置并启动: sudo systemctl da…...

Hive3:识别内部表、外部表及相互转换
一、识别方法 查看内部表信息 desc formatted stu;查看外部表信息 desc formatted test_ext1;通过Table Type对应的值,我们可以区分外部表和内部表。 二、相互转换 内部表转外部表 alter table stu set tblproperties(EXTERNALTRUE);外部表转内部表 alter ta…...
Android笔试面试题AI答之Kotlin(7)
文章目录 29.简述Kotlin 中的内联类,什么时候需要内联类?内联类的特点何时需要内联类示例注意 30. 什么是 Coroutine Scope,它与 Coroutine Context 有什么不同?Coroutine Scope(协程作用域)Coroutine Cont…...

高辐照整车太阳辐照模拟系统试验舱
概览 高辐照整车太阳辐照模拟系统试验是一种模拟太阳辐照对汽车及其零部件影响的测试方法,主要用于评估汽车在长期日照条件下的性能和可靠性。该试验通常遵循特定的标准,如GB/T 2423.24-1995、DIN 75220、BMW PR306等,旨在模拟自然环境中的太…...

如何制作优秀的年终总结PPT?
制作优秀的年终总结PPT,是每位职场人士在年底时的一项重要任务。 一个优秀的年终总结PPT不仅能够清晰地展示你过去一年的工作成果,还能让领导对你的工作能力和态度留下深刻印象。 下面,我将从几个方面详细讲解如何制作这样的PPT,…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...