Kafka如何保证数据高可靠

news2025/1/18 18:56:07

这节课给大家分享一下Kafka的数据高可靠。为什么要讲这个?因为Kafka它本身不是一个金融级别数据可靠的分布式消息系统。

虽然说它存储到某个topic里的数据会先拆分多个partition,这体现了分治的一个思想。每一个partition在最终存储的时候会保存多个副本,不同的副本存储在不同的节点。这样的话任意一个节点挂掉,其实数据是不丢失的。

但实际上它是存在风险的,因为Kafka它利用了缓存。就是数据在真正落盘之前都要存在Block Case里进行缓存。以便增加磁盘的读写性能,缓存满了或者是失效了,缓存里的数据才会往磁盘里面进行溢写。

这种情况下就一定会带来风险,一旦你的集群断电了,缓存里的数据还没有来得及往磁盘溢写,那这个时候数据就丢失了。

当然在生产中可以有其他的选型,比如说RabbitMQ,它的性能大概是Kafka的一半甚至一半不到。它是数据直写磁盘的,这样的话它不存在数据安全性的问题。换来的代价是它的性能会下降,延迟会增加。

我们现在要做的是,在保证高性能的同时,还希望数据尽量不丢失。这能不能做到?当然能做到。

Kafka生产者产生数据进行消息发送,它会采用这种ack机制,去保证数据可靠性。Ack就是当生产者将数据写入到Kafka之后,Kafka会返回一个标志,这个标志叫ack。

min.insync.replicas

它这种ack的机制其实有三种级别,一种是默认级别,即将min.insync.replicas参数设置为1的时候。生产者只要将数据发送到leader副本,kafka就会返回ack,leader中的数据先在缓存中,数据写磁盘需要一段时间。这个过程中如果两个从副本没有同步数据,直接断电后就会丢数。

如果ack的级别配置成0,效率更高。不需要kafka返回任何ack的确认。这种的话性能更好,但是丢数的风险就更高。

当这种ack可以设为-1的时候,数据安全性是最高的。0安全级别最低,1安全级别中等。

-1这种情况是,当produce将数据发送到主副本以后,在ISR列表里面,也就是候选人列表中的从副本会立即从leader进行数据同步。完成数据同步以后,Kafka才会向生产者返回ack。生产者接收到ack后再继续发送其他的消息。

虽然说性能会有下降,但是数据可靠性提高了。

因为返回ack的时候,其实数据已经在多个节点里了。任意一个节点挂掉,其实对系统是没有影响的。

这里有一个细节,如果目前ISR里面的一个从副本,当它长时间与leader数据不同步,也就是落后了很多消息。超过一定时间之后它就会被移出ISR,ISR现在只剩一个从副本了。这个时候可靠性就会降级。

还有一种极端情况就是,两个follower都被移出ISR,ISR现在为空。这个时候ack这种-1级别,也被称为all级别,就降级成了1这个级别。

这种时候我们该怎么去限制?我们可以调整ISR最小副本数min.insync.replicas。

min.insync.replicas

这个参数它一定是配合ack等于all (-1)来使用。比如说min.insync.replicas限制为1,就是说ISR里面必须有1个副本,这样的话它才能保证数据的一个可靠性。如果小于1的话就是ISR为空,在生产者往Kafka里面写数据的时候就会报错。报NotEnoughReplicaseException异常。没有足够的副本,保证不了数据安全。

所以一般来说它俩是配合来使用的,避免ack=all降级为ack=1,能够提升我们数据安全级别。

ISR假设为空,或者小于最小副本数,生产者往Kafka写数据的时候一直会报错,不能说它一报错Kafka生产者就直接终止,我们肯定要设置一个重试次数,来提升程序的健壮性。

retries

即使我们ack开到all(-1),它数据还是先会写缓存,从副本同步的数据也在缓存里。当Kafka向生产者返回ack后,假设集群挂掉了。leader挂了,数据丢不丢失?不丢失,因为另外两个从副本也有数据。那现在整个集群同时宕机了,缓存中的数据肯定就都给清理掉了。就一定会出现数据丢失的情况。

所以我们也印证了前面说的,为什么Kafka它不是一个金融级别可用的,或者金融级别数据安全的消息系统。原因就在这里。

当然每个产品有它自己的使用场景,Kafka本身就是用来抗压的,它的性能越高越好,数据可靠性的要求要低一些。

这个时候有的同学就很矛盾了,我既想用Kafka的这种高性能高吞吐,但是我又不希望它丢数,我们换一种思路该怎么办?

先依赖Kafka,让它完成抗压的作用,数据可靠性既然不能依赖Kafka来完成,可以依赖谁来完成?依赖生产者。

生产者在将数据,向Kafka里写入的时候,能不能顺手将这个数据写到数据库里呢?比如Mysql。写入完成后再把数据推到Kafka中。

当然不写数据库也可以,可以先本地做备份,备份完以后再往Kafka里推送。一旦Kafka发生丢数,没关系,生产者可以拿到备份的数据进行补数操作。

如果补数的时候数据重复了,这个时候灵活一点,消费者这里是不是可以去重?

Kafka的数据可靠性,就讲到这里,谢谢大家。

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

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

相关文章

117.【微信小程序】

微信小程序 (一)、微信小程序概括1.微信小程序简介(1).小程序与普通网页开发的区别 2.注册微信小程序账号(1).注册小程序账号(2).获取小程序的AppID 3.安装微信开发者工具(1).微信开发者工具的简介:(2).微信开发者工具的下载 4.创建第一个小程序(1).创建小程序步骤(2).开发者工…

域横向移动-传递攻击atschtasks

横向移动就是拿下对方一台主机后,以拿下的那台主机作为跳板,对内网的其他主机再进行后渗透,拿到其他内网主机的权限的过程。叫做横向移动。横向移动的主要目的就是扩大战果。 传递攻击主要建立在明文和hash值获取基础上进行攻击。 at和scht…

Typora改变字体颜色

方法一:下载AutoHotkey并创建快捷键的方法(推荐) 第一步:在官网(https://www.autohotkey.com/)下载 AutoHotkey并傻瓜式安装,安装在任意盘符下均可; 第二步:在安装目录…

STM32F4_I2C(从机EEPROM/MPU-6050)协议详解

目录 1. I2C是什么 2. I2C物理层介绍 3. I2C协议层介绍 3.1 I2C基本读写过程 3.1.1 通讯复合格式 3.2 通讯的起始和停止信号 3.3 数据有效性 3.4 地址及数据方向 3.5 响应 4. STM32的I2C特性及架构 4.1 I2C架构剖析 5. I2C通讯过程 5.1 主发送器 5.2 主接收器 6…

Windows文件自动备份——“使用文件历史记录进行备份”

一、背景 因为有一些重要的文件需要经常改动,同时也有“找到某文件某历史版本”的需求,但考虑到时常手动备份比较麻烦,就想到了使用Windows自带的文件备份功能——“使用文件历史记录进行备份”来帮助进行文件的备份和版本管理。 二、环境 1…

一个测试开发人员在字节的7年,太真实了...

测试这条路是坎坷的,我自己深有体会。 我们的起点低,基础差。 测试这个职位也很尴尬,很少有公司会有针对性的对测试人员做成长规划,也很少有公司会那么重视测试人员, 也许进了像 BATJ 这样的大厂会好一点。 但是大多数…

nacos2.2.1搭建

springboot 3.0集成nacos2.2.1内容可评论区Q我 搭建环境: Java版本:11.0.18 系统:window7 数据库:mysql8.0.29 第一步,下载nacos,下载地址: https://github.com/alibaba/nacos/releases/d…

HACKABLE: III实战演练

文章目录 HACKABLE: III实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、查看网站源码4、扫描目录5、访问网址6、查看并下载7、访问网站8、查看文件9、解密10、访问网站11、访问网站12、查看文件13、解密14、访问网站15、访问网站16、下载图片17、隐写1…

CrossOver软件好用吗?最新版22.1.1有哪些优势功能

CrossOver2023是一款系统兼容软件 让您可以在Mac和Linux系统上运行Win应用,不必重启系统,不必使用虚拟机。通过CrossOver, 您可以从dock直接启动Wind应用,与您的Mac和Linux系统功能无缝集成。crossover兼容软件是可以在苹果电脑中…

oracle的基本使用(建表,操作表等)

一、表空间,用户 1、创建表空间 使用system登录 创建表空间 waterboss 为表空间名称datafile 用于设置物理文件名称size 用于设置表空间的初始大小autoextend on 用于设置自动增长,如果存储量超过初始大小,则开始自动扩容next 用于设置每次…

tiechui_lesson14_网络连接请求的拦截

这一节主要学习网络请求的过滤,铁锤大佬讲了些关于IRP的知识。 笔记 先祭出一张灵魂作画,这是用来描述IRP的流转形式的。 通过这幅图着重解释了一下IoSkipCurrentIrpStackLocation(pirp);的过程,就是在流转到当前的IRP请求之后&#xff0c…

Jarvis OJ pwn——level1

checksec&& 运行 ida main函数里的vulnerable_function函数存在溢出 给输入分配的栈空间为0x88 利用思路 ret2shellcode 代码 Author : 白银 Date : 2023-05-27 14:43:28 LastEditors : 白银 LastEditTime : 2023-05-27 16:52:19 FilePath : /pw…

五十行代码教你写一个简单的内存池(二级指针的应用)

固定大小内存的内存池实现 该内存池是一个很简单的内存池,只能申请固定大小的内存,仅供学习 要点: 构造隐式链表二级指针 存储结构 typedef struct mempool_s{int block_size; // 每一块的大虚哎int free_count; // 剩余有多少块是可以…

C#医院LIS系统源码 LIS实验室管理信息系统源码 LIS检验系统源码

1、LIS系统技术框架 (1)总体框架: SaaS架构的Client/Server应用 服务可伸缩,多服务协同 服务可拆分,功能易扩展 (2)技术细节: 体系结构:Client/Server架构 客户端…

资深SRE带你看阿里云香港故障

一、故障背景 12月18日阿里云香港Region发生重大故障,多个重要互联网服务受到影响,包括澳门日报、金融管理局、澳门银河、莲花卫视、澳门水泥厂等基础服务,澳觅和MFood等外卖平台,多个区块链交易所也受到影响。详情见官方故障报告…

第12课【DMA 直接数据访问】直接数据访问 效率 数据总线冲突 通道 仲裁器

目录 简介功能框图请求通道仲裁器 使用配置传输方向数据量传输模式 实例分析存储器间传输存储器到外设 简介 DMA(Direct Memory Access 直接内存访问)指的是STM32中的一个外设。它可以在无需CPU介入的情况下,实现外设和存储器之间或存储器与…

毕业季,给大家用python画一个飞机吧~预祝大家一帆风顺

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 今天我们主要用到turtle这个模块,它是python自带的, 所以无需安装,我们直接导入使用就好了~命令如下: import turtle那这个模块有什么作用呢? 它是python中…

LeetCode刷题(ACM模式)-02链表

参考引用:代码随想录 注:每道 LeetCode 题目都使用 ACM 代码模式,可直接在本地运行,蓝色字体为题目超链接 0. 链表理论基础 0.1 链表定义 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成&#xff1a…

01背包问题-递推公式的自我理解与LeetCode 416. 分割等和子集

学算法好痛苦,完全是对我智力的一次次折磨,看了好多博客,对二维dp数组的理解都是直接搬了代码随想录,搬了随想录又没详细解释,大家都是一眼看懂的吗,好吧() LeetCode 416. 分割等和子…

华侨大学主题模版

华侨大学主题模版 适用于 课程作业、实验报告、项目策划、毕业论文、毕设答辩... 这是一个非官方项目,仅供个人学习研究。 🚀 指南 📖 仓库简介 该仓库提供了一系列适用于课程作业、实验报告、项目策划、毕业论文、毕设答辩等场景的华侨大…