kafka零数据丢失的配置方案
讨论一下kafka参数的配置
1、acks 参数配置
acks这个参数有三个值:0,1,-1,但是不用的参数对应的含义不同,那如果我们想要保证数据不丢失,acks 值应该设置为哪个参数呢?
0:代表生产者只要把消息发送出去以后就认为消息发送成功了,这种方式有可能会导致数据丢失,因为有可能消息发送到服务端以后服务端存储失败了。
1:代表生产者把消息发送到服务端,服务端的 leader replica 副本写成功以后,就返回生产者消息发送成功了,这种方式也有可能导致丢数据,因为有可能刚好
数据写入到leader replica,然后返回处理成功的响应给生产者,假如这个时候leader replica 在的服务器出问题了,follower replica 还没来得及同步数据,这个时候是会
丢失数据的。
-1(all):代表生产者把消息发送到服务端,服务端的ISR列表里所有的 replica都写入成功以后,才会返回成功响应给生产者。
假设ISR列表里面有该分区的三个replica(一个leader replica,两个follower replica ),那么acks=-1 就意味着消息要写入到 leader replica,并且两个 follower replica从
leader replica 上同步数据成功,服务端才会给生产者发送消息 发送成功的响应。
所以ISR列表里面的replica 就非常关键。如果我们想要保证数据不丢,那么acks的值设置为-1,并且还需要保证ISR列表里面是1个副本以上。
所以 acks的值要设置为-1。
2、ISR到底指的是什么东西?
既然大家已经知道了Partition的多副本同步数据的机制了,那么就可以来看看ISR是什么了。
ISR全称是 "In-Sync Replicas",也就是保持同步的副本,它的含义就是,跟leader 始终保持同步的 follower有哪些。
大家可以想一下,如果说某个follower所在的broker因为JVM Full GC之类的问题,导致自己卡顿了,无法及时从Leader拉取同步数据,那么是不是会导致Follower
数据被Leader要落后很多?
所以这个时候,就意味着follower已经跟leader不再处于同步的关系了。但是只要follower一直及时从leader同步数据,就可以保证他们是处于同步的关系的。
所以每个Partition 都有一个ISR,这个ISR里一定会有Leader自己,因为Leader肯定数据是最新的,然后就是那些跟Leader保持同步的follower,也会在ISR里。
3、kafka的存储机制

由于生产者生产的消息会不断追加到log文件末尾,为防止log文件过大导致数据定位效率低下,kafka采取了分片和索引机制。
它将每个partition 分为多个 segment,每个segment对应两个文件:".index"索引文件和 ".log" 数据文件。(一个分区下面有多个log文件,每个log文件大概有1G)
这些文件位于同一文件下,该文件夹的命名规则为 topic 名 - 分区号。
例如:first 这个topic 有三个分区,则其对应的文件夹为 first-0,first-1,first-2。
index和log 文件以当前 segment 的第一条消息的 offset命名。下图为 index文件和log文件的机构示意图:

.index 文件存储大量的索引信息, .log文件存储大量的数据,索引文件中的元数据指向对应数据文件中 Message 的物理偏移量。
4、kafka的 zero-copy 零拷贝技术
在kafka中消息存储模式中,数据存储在底层文件系统中。当有Consumer订阅了相应的topic消息,数据需要从磁盘中读取然后将数据写回到套接字中(socket)。
此动作看似只需较少的cpu活动,但它的效率非常低。首先内核读出全盘数据,然后将数据跨越内核用户推到应用程序,然后应用程序再次跨越内核用户将数据推回,
写出到套接字。应用程序实际上在这里担当了一个不怎么高效的中介角色,将磁盘文件的数据转入套接字。
数据每遍历用户内核一次,就要被拷贝一次,这会消耗CPU周期和内存带宽。幸运的是,您可以通过一个 零拷贝 的技巧来消除这些拷贝。
使用零拷贝的应用程序要求内核直接将数从磁盘文件拷贝到套接字,而无需通过应用程序。零拷贝不仅大大的提高了应用程序的性能,
而且还减少了内核与用户模式间的上下文切换。
java 类库通过 java.nio.channels.FileChannel 中的 transferTo() 方法来在 Linux和Unix系统上支持零拷贝。可以使用transferTo() 方法直接将
字节从它被调用的通道上传输到另外一个可写字节通道上,数据无需流经应用程序。
kafka零数据丢失的配置方案的更多相关文章
- Spark Streaming容错的改进和零数据丢失
本文来自Spark Streaming项目带头人 Tathagata Das的博客文章,他现在就职于Databricks公司.过去曾在UC Berkeley的AMPLab实验室进行大数据和Spark ...
- Kafka设计解析(十一)Kafka无消息丢失配置
转载自 huxihx,原文链接 Kafka无消息丢失配置 目录 一.Producer端二.Consumer端 Kafka到底会不会丢数据(data loss)? 通常不会,但有些情况下的确有可能会发生 ...
- Kafka SSL安装与配置
1.概述 最近有同学咨询说,Kafka的SSL安全认证如何安装与使用?今天笔者将通过以下几个方面来介绍Kafka的SSL: Kafka 权限介绍 Kafka SSL的安装与使用 Kafka Eagle ...
- Atitit.兼具兼容性和扩展性的配置方案attilax总结
Atitit.兼具兼容性和扩展性的配置方案attilax总结 文件配置法1 Jdbc多数据源文件配置发1 Bat文件配置法1 改进的文件配置法(采用类似i18n技术) 推荐1 使用自动化pc_id的方 ...
- Spring MVC之视图解析器和URL-Pattern的配置方案
上期讲解了第一入门案例之后接下来了解一下视图解析器与URL-Pattern的配置方案 先来说视图解析器,在上次博客文章中我们完成了入门案例,接下来我们就在上一个例子中完善一下体出视图解析器 <? ...
- Spark集群 + Akka + Kafka + Scala 开发(1) : 配置开发环境
目标 配置一个spark standalone集群 + akka + kafka + scala的开发环境. 创建一个基于spark的scala工程,并在spark standalone的集群环境中运 ...
- Apache安全配置方案
Apache安全配置方案 from:http://drops.wooyun.org/%e8%bf%90%e7%bb%b4%e5%ae%89%e5%85%a8/2727 apache的一些配置主要是通过 ...
- web.config中sessionState节点的配置方案
web.config中sessionState节点的配置方案 web.config关于sessionState节点的配置方案,sessionState有五种模式:Custom,off,inProc,S ...
- gVim 配置方案 采用Vundle管理插件
在Linux下配置vim非常简单,尤其是采用Vundle来管理插件,使得一切用起来得心应手. Maple大神在github上公布了自己的vim配置方案,相当方便好用.详见 https://github ...
随机推荐
- 【转载】PHP 程序员进阶之路
原文:没有Nginx,你还能做什么? PHP程序员的未来不是Java,Java拯救不了你. 已经1368年了,你扪胸自问,没有了Nginx的你,还能用PHP做什么.有一些高端的刁民会愤怒地说:&quo ...
- 如何写好技术文档——来自Google十多年的文档经验
本文大部分内容翻译总结自<Software Engineering at Google> 第10章节 Documentation. 另外,该书电子版近日已经可以免费下载了 https:// ...
- (原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF
一.前言 进程间通信技术的应用非常广泛,在Windows下常用的实现方式有:管道.Socket.消息.本地文件.共享内存等,每种方式都有各自适应的场景. 在进行大数据交换时,最优的方式便是共享内存. ...
- [ZJOI2010]基站选址,线段树优化DP
G. base 基站选址 内存限制:128 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离 ...
- 冒泡排序、选择排序、直接插入排序、快速排序、折半查找>从零开始学JAVA系列
目录 冒泡排序.选择排序.直接插入排序 冒泡排序 选择排序 选择排序与冒泡排序的注意事项 小案例,使用选择排序完成对对象的排序 直接插入排序(插入排序) 快速排序(比较排序中效率最高的一种排序) 折半 ...
- Spring Cloud Gateway自定义异常处理Exception Handler
版本: Spring Cloud 2020.0.3 常见的方法有 实现自己的 DefaultErrorWebExceptionHandler 或 仅实现ErrorAttributes. 方法1: Er ...
- 获取浏览器中url的参数
例如: 浏览器的地址是:http://localhost:8080/src/views/moneyDetail?id=10 vue 获取浏览器的参数 获取id的参数:this.$route.query ...
- CVE-2018-12613总结
1.漏洞基础介绍 1.1漏洞背景 phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库.借由此We ...
- cs派生msf shell
msf5 > use exploit/multi/handler [*] Using configured payload windows/meterpreter/reverse_http ms ...
- Android Jetpack 架构组件最佳实践之“网抑云”APP
背景 近几年,Android 相关的新技术层出不穷.往往这个技术还没学完,下一个新技术又出来了.很多人都是一脸黑人问号? 不少开发者甚至开始哀嚎:"求求你们别再创造新技术了,我们学不动了!& ...