kafka数据不丢失不重复_如何配置 KAFKA 使其消息不会丢失

不可靠的KAFKA

这里的不可靠是指代KAFKA其设计之初就为高性能而设计,其是允许消息丢失的,但经过多个版本的升级之后,通过KAFKA的相关配置,我们可以将其作为可靠的队列(不丢消息的队列)。

在本文里,不会具体列出要改哪个参数,需要改的参数请大家自行翻文档找出来,这样理解会更为深刻。

发送消息到KAFKA时产生的消息丢失

在一些比较旧的版本,KAFKA客户端发送消息到KAFKA服务器时,由于客户端不等待服务器回应,直接返回,等待发送异步进行。因此其在发送环节就可能存在消息丢失。

为了避免消息丢失,我们需要用新版客户端,并配置客户端发送消息时同步等待返回结果

KAFKA服务器宕机导致的消息丢失(磁盘缓存丢失)

KAFKA自身不管理LOG写入磁盘的缓存,将其交由操作系统处理。因此在默认配置下,如果KAFKA宕机,则会因为数据没有FLUSH到磁盘而丢失数据。

为了保证数据不丢失,KAFKA提供的现成方法有两个,

每条消息都Flush一次; 每条都Flush一遍,必然不可行,因为其速度会变得很慢。官方也不建议这么做。(如果其有类似Group Commit的优化机制的话,我觉得可以使用,但是貌似曾经有人提过这个PR,没有被采纳,其认为用集群就可解决这个可靠性问题)

构建集群,以提高可用性。 官方推荐的方法。只要挂的机器不要超过强制写入的机器,那么就可以保证数据不丢失。但需要注意的是,KAFKA组成的集群必须在不同机房。不然机房一断电,集群内的KAFKA就会出现消息丢失。

KAFKA复制模式导致的丢失

KAFKA的副本模式为主备复制模式,这个模式下有两种形式 同步复制模式 以及 异步复制模式。

异步复制模式: 客户端将信息发送到主副本,主副本收到信息写到本地缓存后即返回ACK给客户端。然后异步地将数据发送给备份。本配置为默认配置,其高效,但主挂掉,则消息丢失。 同步复制模式: 客户端将信息发送到主副本,主副本收到信息,写到本地缓存,并发送给所有从机,从机都写到缓存后给主机反馈,主机都收到反馈后再反馈给客户端

需要修改复制模式为同步复制

KAFKA选举导致的消息丢失

KAFKA有一个配置,是否允许在不得已的情况下,允许在非同步状态下的副本成为主副本。其默认是打开的,结果就导致存在丢失消息的可能性。需要将其关闭

未被确认的消息不会被消费

KAFKA使用主从同步复制的时候,没有被完全复制(完全复制的消息会在HW(High water Mark之下))的信息不会被消费。 一个Broker若需要从非ISR状态进入到ISR状态前,会将其在HW之前的消息记录给truncate掉,并尝试跟上Master里的记录。跟上后,将会恢复ISR状态。

KAFKA的主节点选举通过ZK中登记的序号决定,更细节可查看KAFKA同步复制模式选举过程,以上为默认实现,不需修改,也无法修改

已确认的消息如果存在ISR状态的副本的话,就不会丢失记录

原Master挂掉后,新选出的Master不会丢弃HW之后的消息,新Master会将这些HW之后的副本再次发送给其余的副本。因此即使高水位信息没有传递给新的Master副本也没有问题。

ISR分区过少导致失去容灾特性

默认配置下,ISR分区个数可以为1时依然可以写数据。但当出现这种情况的时候,就失去了容灾性。只要主分区挂掉,那么数据就丢失。

KAFKA有配置可以指定写入时最少的ISR数量,少于特定值,就不再ACK。如一共三台BROKER,我们可以指定ISR最少数量为2,那么只有1台处于ISR状态的话,COMMIT将无法执行。

是否设置该值,视具体情况而定,若无法容忍丢失,则设置该值为2,NAME 。追求可用性,则不设置。

个人建议设置为2,无论副本数量有多少

KAFKA如何处理网络分区情况?

如果MASTER与其他的副本与ZK是联通的,但是MASTER与其他副本之间出现了网络分区,那么ISR就只能为1。

消息保存的策略的设置

建议保留消息的策略基于时间。如保留21天

客户端宕机导致的消费位置丢失

KAFKA在分区中的消费位置由客户端管控,其有可能没有及时保存到KAFKA中,导致消费位置丢失。 若消费位置丢失,则消费可能从上一个保存的消费位置重新进行消费。所以在不能接受重复消息的系统需要自行定制对于消息的幂等处理

(死信是否会丢失?)

At Least Once

实际上我们对可靠消息系统的要求通常是At least Once,经过上述配置已经基本达到了At Least Once的要求

消息消费失败的重试设置

需要设计一个死信队列,消费失败的消息需放入里面,以免影响后续其他消息消费

参考

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

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

相关文章

聊聊 vue 生命周期

一、常用的常用的生命周期钩子: mounted: 发送 ajax 请求、启动定时器、绑定自定义事件、订阅消息等【初始化操作】 mounted() {console.log(vm 实例被挂载之后:mounted);this.timer setInterval(() > {...} }beforeDestroy: 清除定时器、解绑自定…

程序员你真的理解final关键字吗?

文章目录1、修饰类2、修饰方法3、修饰变量4、final变量修饰变量(成员变量、局部变量)4、1 final修饰成员变量:4、2 final修饰局部变量:5、final变量和普通变量的区别6、final与static的藕断丝连7、关于final修饰参数的争议前言 提…

axios vue 动态date_Web前端Vue系列之-Vue.js 实战

课程简介:课程目标:通过本课程的学习,让大家掌握Vue.js的进阶知识并在项目中应用。适用人群:具有一定vue开发基础的开发人员。课程概述:Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式Jav…

Static静态代码块以及各代码块之间的执行顺序

文章目录代码块的分类1、静态代码块(也叫静态块、静态初始化块)2、构造代码块(也叫构造初始化块)3、代码块(又叫普通代码块、初始化块)执行顺序的代码测试继承中各代码块的执行顺序前言 在Java中&#xff0…

vue 组件 - 非单文件组件

一、定义组件 const school Vue.extend({name: xuexiao, // ----------------------------> 指定组件在开发者工具中显示的名字template: // ----------------------------> 模板<div>... 此处是结构</div>,data() { // ---------------------------->…

matlab安装好 启动总是闪退_在Ubuntu16.04下安装MATLAB2017b

1. 前言最近在折腾Ubuntu系统的高端机子&#xff0c;matlab这家伙的交互和可视化太方便了&#xff01;于是想在Linux下安装matlab&#xff0c;在各个版本中&#xff0c;matlab2017的性价比是非常高的&#xff0c;因此选择安装介个。阅读了很多帖子&#xff0c;综合找到几个靠谱…

vue 脚手架

一、 脚手架 初始 全局安装脚手架 npm i -g vue/cli切换到项目根目录&#xff0c;使用 vue create 项目名称 创建项目使用 npm run serve | yarn serve 启动项目 如果中途卡顿 使用 npm 淘宝镜像 npm config set registry --> https://registry.npm.taobao.orgvue 隐藏了…

这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析

前言 package com.jvm.classloader;class Father2{public static String strFather"HelloJVM_Father";static{System.out.println("Father静态代码块");} }class Son2 extends Father2{public static String strSon"HelloJVM_Son";static{Syste…

bigdecimal js 判断等于0_为啥阿里禁用BigDecimal的equals方法做等值比较

BigDecimal&#xff0c;相信对于很多人来说都不陌生&#xff0c;很多人都知道它的用法&#xff0c;这是一种java.math包中提供的一种可以用来进行精确运算的类型。很多人都知道&#xff0c;在进行金额表示、金额计算等场景&#xff0c;不能使用double、float等类型&#xff0c;…

脚手架 - ref

被用来给元素或子组件注册引用信息&#xff08;id的替代者&#xff09;应用在 html 标签上获取的是真实 DOM 元素&#xff0c;应用在组件标签上的是组件实例对象 VueComponent{}使用方式 (1). 打标识 <!-- 给真实 DOM 元素打标识 --> <h1 ref"xxx">...&…

git提交到github总是要输入密码_GitHub不为人知的秘密

本来想叫《GitHub骚操作》的&#xff0c;发现相关的文章已经有很多&#xff0c;而且和我本章要讲的内容完全不同&#xff0c;所以就换了这个也算贴切的标题。起因之前写过一篇文章《VM Manager 插件分享》&#xff0c;事后我发现有个地方不对劲&#xff01;看之前文章标题大家应…

MyBatis中大于号以及小于号的表达方式

mybatis使用的是xml格式的文件。使用>和<号的时候&#xff0c;会存在与xml的标签的规范冲突。 1.场景还原 在实际项目中&#xff0c;有很多需求需要通过设定一个具体的时间段来搜索或过滤所需的数据&#xff0c;今天笔者就mybatis中时间比较涉及到的大于&#xff0c;小于…

脚手架 - props

一、props — 让组件接收外部传过来的数据 传递数据 <Example name"xxx"/>接收数据 // 1. 只接收 props: [name]// 2. 接收并限制类型 props: {name: String }// 3. 接收、限制类型、必要性、默认值 props: {name: {type: String, // 类型required: true, /…

mybatis plus当月数据查询_Springboot+mybatis(plus)+druid多数据源

前言:我不太喜欢AOP读自定义注解来切换数据源.因为如果我一个业务里需要同时查2个数据源的数据而又不想把这个业务拆成2个方法的时候,就比较麻烦了.所以我打算根据package来扫描注入不同的DataSource.可能是我搜索的姿势不太对 , 资料比较少.也会碰到不少坑.所以记录一下.正文:…

mybatis里mapper.xml中SQL语句if语句嵌套if语句

为了实现一个sql可以根据条件不同实现sql语句的动态查询&#xff0c;所以在使用mybatis时&#xff0c;对应的mapper.xml的sql语句可以根据条件值的不同执行不同的sql语句&#xff0c; 最开始在我的where子句中我的if语句是这么写的&#xff1a; <where><if test"…

脚手架 mixin (混入)

可以把多个组件共用的配置提取成一个混入对象 使用方式&#xff1a; 定义混合 {data() {},methods() {}... }使用混合 // 1. 引入混合 import {hunhe1, hunhe2} from /..mixin/// 1. 在 main.js 中全局混入&#xff1a; Vue.mixin(hunhe1)// 2. 局部混入 mixins: [hunhe1]

ug冲模标准件库_昆山兴模lt;携手gt;武汉益模,打通冲模“智能设计+精益管理”的最后一道关卡...

武汉益模科技股份有限公司是国内领先的工业互联网及智能制造的解决方案提供商&#xff0c;为模具、装备、军工、汽车、家电及等有柔性化生产需求的工厂提供专业的智能设计/信息化管理/智能加工/数字化工厂等工业软件、工业机器人自动化以及智能装备&#xff0c;拥有麦格纳、安波…

SpringBoot 异常回滚 事务的使用___Springboot @Transactional 事务不回滚

Springboot中事务的使用&#xff1a; 1、启动类加上EnableTransactionManagement注解&#xff0c;开启事务支持&#xff08;其实默认是开启的&#xff09;。 2、在使用事务的public&#xff08;只有public支持事务&#xff09;方法&#xff08;或者类-相当于该类的所有public…

简述网络调研的作用_利用龙伯球透镜天线提升高铁4G网络覆盖

透镜天线&#xff0c;一种能够通过电磁波&#xff0c;将点源或线源的球面波或柱面波转换为平面波从而获得笔形、扇形或其他形状波束的天线。通过合适设计透镜表面形状和折射率 n&#xff0c;调节电磁波的相速以获得辐射口径上的平面波前。透镜天线吸收了许多光信息工程技术&…

脚手架 插件

一、定义插件 plugin.js --> export default{} --> install() --> // 全局过滤器 Vue.filter(myFilter, function (value) {return value.slice(0, 4); });// 全局指令 Vue.directive("fbind", {bind(element, binding) {element.value binding.value;},i…