Kafka Producer Acks机制

news2024/12/29 10:51:13

Kafka Producer Acks

设置ACK

 props.put("acks", "all");

通过上述代码,配置kafka生产者发送消息后,是否等待Broker的回执信息。在集群环境下,该配置是kafka保证数据不丢的重要的参数之一,今天来学习一下,里面隐藏在该参数背后的原理和逻辑。

Kafka 生产者将消息发送至topic的Leader分区。由于Leader分区和Replica分区是异步复制,存在时间差。极端情况下,当消息被写入到Leader分区后,Leader分区奔溃,此时数据就会出现丢失。

因此kafka 生产者还可以指定ack的级别,以确保消息被成功写入之前必须写入最少的副本数。

acks=0

设置为0,生产者只管发送消息,不等待broker返回响应,这种设置安全级别最低。如果broker下线或发生异常,系统并不知道将丢失数据。该设置适用于允许数据丢失的场景,优势是producer吞吐量高,网络开销小

在这里插入图片描述

acks=1

设置为1,生产者发送数据后,等待Leader 分区返回结果确认。Leader分区返回响应,但是不保证消息复制到Replica分区。如果生产者没有收到Leader分区返回的响应结果, 生产者可以通过重试请求,保证数据不丢。如果Leader分区在消息复制之前发生意外,则存在丢失数据的风险

在这里插入图片描述

acks=all

生产者默认值设置为all,当消息被所有Replica副本同步完成时,生产者才认为消息已经写入成功。也可以将acks设置为-1,二者作用是相等的。

在这里插入图片描述

分区的Leader副本检查是否有足够的同步副本用于安全写入消息(由参数min.insync.replicates控制)。请求将存储在缓冲区中,直到Leader副本观察到跟随者副本复制了消息,此时成功的确认被发送回客户端。

可以在主题和broker级别配置min.insync.replicas。当数据写入所有同步副本-min.sync.replicas时,数据被视为已提交。值2表示至少有2个ISR副本(包括Leader副本)必须同时拥有数据。

如果希望确保已提交的数据写入多个副本,则需要将同步副本的最小数量设置为更高的值。例如主题有三个副本,并且将min.insync.replicas设置为2,则只有在三个副本中至少有两个副本同步时,才能写入主题中的分区。当所有三个副本都同步时,一切正常进行。如果其中一个副本不可用,也是如此。但是,如果三个副本中有两个不可用,代理将不再接受生产请求。相反,尝试发送数据的生产者将收到NotEnoughReplicasException。

在这里插入图片描述

高可用性

Kafka topic的副本设置为3,最多可以忍受2个broker失效,而保证数据不丢失。所以,通常来讲,N个副本,可以在N-1个副本丢失的情况下,仍然保证数据整体可用。

对于3个副本的topic,从读写两个方面分析下数据的高可用性

  • 读数据 - 只要有一个分区启动并被视为ISR,该主题将可供读取

  • 写数据

  • acks=0 & acks=1 - 只要有一个分区启动并被视为ISR,该主题将可以继续写入

  • acks=all

    min.insync.replicas=1 默认情况: topic必须有一个分区作为ISR,因此可以容忍2个broker关闭

    min.insync.replicas=2 : 主题必须至少有2个ISR启动,因此我们最多可以容忍一个代理关闭(在复制因子为3的情况下),并且我们保证每次写入时,数据至少会被写入两次

    min.insync.replicas=3: 这种场景要求最严格,不允许任何broker宕机

min.insync.replicas 参数在集群环境中是如此的重要,接下来学习下如何设置该参数。

Topic级别配置

min.insync.replicas默认配置为1,可以通过CLI工具更改topic的配置进行覆盖。接下来学习下如何使用工具进行个性化的配置

创建主题

使用工具创建一个3个分区,一个副本的topic

./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic configured-topic --partitions 3 --replication-factor 1

查看主题

查看主题是否创建成功

./bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic
Topic: configured-topic	TopicId: CDU7SBxBQ1mzJGnuH68-cQ	PartitionCount: 3	ReplicationFactor: 1	Configs:
	Topic: configured-topic	Partition: 0	Leader: 2	Replicas: 2	Isr: 2
	Topic: configured-topic	Partition: 1	Leader: 3	Replicas: 3	Isr: 3
	Topic: configured-topic	Partition: 2	Leader: 1	Replicas: 1	Isr: 1

修改配置

将 min.insync.replicas 参数设置为 2

./bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --add-config min.insync.replicas=2

重新查看主题信息

./bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic configured-topic
Topic: configured-topic	TopicId: CDU7SBxBQ1mzJGnuH68-cQ	PartitionCount: 3	ReplicationFactor: 1	Configs: min.insync.replicas=2
	Topic: configured-topic	Partition: 0	Leader: 2	Replicas: 2	Isr: 2
	Topic: configured-topic	Partition: 1	Leader: 3	Replicas: 3	Isr: 3
	Topic: configured-topic	Partition: 2	Leader: 1	Replicas: 1	Isr: 1

删除配置

可以通过 --delete-config 参数选项 删除配置

./bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type topics --entity-name configured-topic --delete-config min.insync.replicas

Broker级别配置

静态配置

min.insync.replicas默认配置为1,可以通过修改配置文件config/server.properties修改默认属性。配置修改需要重启服务才能生效

min.insync.replicas=2

动态配置

kafka-configs CLI工具脚本可以动态更新broker配置,无需重启应用。使用方式如下:

  • 修改配置
$ ./bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type brokers --entity-default --add-config min.insync.replicas=2 
Completed updating default config for brokers in the cluster.
  • 查看配置
$ ./bin/kafka-configs.sh --bootstrap-server localhost:9092 --describe --entity-type brokers --entity-default
Default configs for brokers in the cluster are:
  min.insync.replicas=2 sensitive=false synonyms={DYNAMIC_DEFAULT_BROKER_CONFIG:min.insync.replicas=2}
  • 删除配置
./bin/kafka-configs.sh --bootstrap-server localhost:9092 --alter --entity-type brokers --entity-default  --delete-config min.insync.replicas

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Elasticsearch分片

了解分片的基本原理,对Elasticsearch性能调优有帮助。 关系梳理 ES底层使用的是Lucene库,ES的分片(shard )是Lucene的索引,ES的索引是分片的集合,Lucene的索引是由多个段(segment)…

青岛OJ如何导入题库详细图示

打开你的后台管理 找到问题位置 增加题目是可以编辑题目,导入数据。 导入导出是用题目和数据直接导入的。 这个ID的话就是题目ID不能设置一样的 然后题目输入输出就都不说了 按照格式就可以了,这里说一下Tag是标签,每次都要设置&#xff…

shell-条件测试

1、编写一个 Shell脚本,程序执行时从键盘读入一个目录名,如果用户输入的目录不存在,则提示file does not exist;如果用户输入的不是目录则提示用户必须输入目录名;如果用户输入的是目录则显示这个目录下所有文件的信息…

小程序版 Three.js 框架下载及目录配置

1.库文件说明 由于微信官方提供的threejs适配库已经很久没有更新,而且开发者普遍反映使用起来很难用。 我这里分享的是独立的库文件,不需要npm安装,下载后将库文件放到项目中即可使用。 2.下载后的压缩包文件 3.解压后的文件夹结构 4.文件…

Vue2和Vue3的双向数据绑定原理

目录前言:vue2.x 是如何实现响应式系统的:defineProperty 的痛点:Object.defineProperty 代码的使用Proxy 方法的理解Proxy 代码的使用:总结:前言: 今天小编给大家讲解一下,Vue2和Vue3的双向数据…

CAPL学习之路-测试功能集函数(诊断测试)

TestCollectDiagEcuInformation 向诊断目标的诊断类下的所有诊断服务发送诊断请求,并将诊断响应写入测试报告中 testcase TCExample() {int status;status = TestCollectDiagEcuInformation( "Door", "Sessions");if( status == 0)TestStepPass( "EC…

javaweb项目接入CAS单点认证(含自身系统的三员过滤)

一、搭建cas server 1.下载war包 2.打开cmd窗口执行以下命令,命令如下(指定ip): keytool -genkey -v -alias casbm -keyalg RSA -keystore D:\cas\keystore\casbm.keystore -ext SANIP:192.168.2.166 3.我们生成秘钥库后需要从秘钥库中导出证书&#x…

D. Distinct Characters Queries(set维护)

Problem - 1234D - Codeforces 给你一个由小写拉丁字母组成的字符串s和对这个字符串的q个查询。 回顾一下,字符串s的子串s[l;r]就是字符串slsl1...sr。例如,"codeforces "的子串是 "code"、"force"、"f"、&quo…

spring6(概念;ioc详解,各种数据的注入方式)

第一章 启示录 一个普通的三层架构,不借助spring的情况下。需要程序员自己去new对象。 如果使用这种方式,那么代码上就把功能写死了,这时候需要更改一个数据库连接。这是时候数据交互层的代码就需要修改。这违背了OCP开闭原则。 1.1 OCP开闭…

Bert 得到中文词向量

通过bert中文预训练模型得到中文词向量和句向量,步骤如下: 下载 bert-base-chiese模型 只需下载以下三个文件,然后放到bert-base-chinese命名的文件夹中 得到中文词向量的代码如下 import torch from transformers import BertTokenizer,…

can8.0-基础知识

1、canopen协议概述 1.1对象字典 CANopen 协议采用了带有 16 位索引和 8 位子索引的对象字典,对象字典的结构如表 1.2 常用的通信对象 1) 网络管理对象 (NMT) 2) 服务数据对象 (SDO) 3) 过程数据对象 (PDO) 4) 同步对象 (SYNC) 5) 紧急报文 (EMCY) 1.3 通信对象…

PISR 数据库,区块链和大数据的下一个最佳结合

据集合。如今,在大数据时代,数据管理越来越受到重视,已经成为一项非常重要的资产。因此,数据安全也变得越来越重要,应该引起重视。尽管现有数据库可以满足单个公司的存储依赖性,但它们很难确保公司之间协作…

React学习03-基于脚手架的React应用

初始化脚手架 使用 npx 创建 npx create-react-app 项目名使用 npm install 创建 全局安装create-react-app包: npm install -g create-react-app创建脚手架: create-react-app 项目名npm 镜像 执行 create-react-app时,还会自动安装一…

C++程序员学习资料汇总

小白入门 计算机网络微课堂(有字幕无背景音乐版) 非常适合小白学习,没有废话,非常生动 《计算机是怎样跑起来的》 《程序是怎样跑起来的》 《网络是怎样连接的》 基础 资料名备注状态阅读时间《深入理解计算机系统》很多大厂面…

实验室预约系统|基于Springboot+Vue实现学校实验室预约管理系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

JAVA中那些令人眼花缭乱的锁

一、开局一张图带你了解java相关的锁 二、乐观锁和悲观锁 1、悲观锁 悲观锁对应于生活中悲观的人,悲观的人总是想着事情往坏的方向发展。 举个生活中的例子,假设厕所只有一个坑位了,悲观锁上厕所会第一时间把门反锁上,这样其他…

python pyqtgraph绘图库

pyqtgraph官网 PyQtGraph被大量应用于Qt GUI平台(通过PyQt或PySide),因为它的高性能图形和numpy可用于大量数据处理。 特别注意的是,pyqtgraph使用了Qt的GraphicsView框架,它本身是一个功能强大的图形系统; 我们将最优…

知识付费海哥:这样做课,不赚钱都难

现在不少人开始了开发网课,卖网课赚钱, 但是在网课开发时,很多人开始的时候,关注的点就错了! 自己喜欢钓鱼,就开发钓鱼的课, 自己喜欢演讲,就开发演讲的课, 自己喜欢…

Dubbo入门(二)——IDEA下Dubbo+Zookeeper搭建

目录一、Zookeeper1.1 下载1.2 安装1.3 修改配置文件1.4 启动二、Dubbo插件搭建三、手动创建3.1 创建项目3.1.1 pom依赖3.2 api模块3.2.1 pom依赖3.2.2 实体类3.2.3 service接口3.3 provider3.3.1 pom依赖3.3.2 配置文件3.3.3 mapper3.3.4 service实现类3.3.5 启动类3.4 consum…

冶金工艺流程(钢铁全流程)

工艺图 工艺讲解 生产流程从矿石原料采集开始,对于低品位的矿石,必须在冶炼前经选矿工序先选出铁精矿,然后进一步制成烧结矿或球团矿。 ————————————————————————————— 高炉冶炼是一个连续的、大规模的高温生产过程。铁矿石…