Kafka零数据丢失的配置方案

简介: 这两年大数据行业发展前景较好,行业工程师薪资高、人才少、竞争压力小,很多人也因此想要转型成为大数据工程师,但也正是因为行业新、人才少,很多技术解决方案也是缺少很优质的答案。
+关注继续查看

这两年大数据行业发展前景较好,行业工程师薪资高、人才少、竞争压力小,很多人也因此想要转型成为大数据工程师,但也正是因为行业新、人才少,很多技术解决方案也是缺少很优质的答案。今天,我给大家详细剖析一个大数据工程师面试中的高频面试题——Kafka是如何保证数据零丢失的?

如果要想保证Kafka数据不丢, 要从Kafka的三个地方入手:生产者、服务端和消费者。

生产者

01 / API使用
在生产中Kafka生产者的开发我们都会用异步调用的方式,异步调用方式有如下两个API:

1)producer.send(msg) 不带回调方法2)producer.send(msg,callback) 带回调方法

记得要使用带有回调方法的API,我们可以根据回调函数得知消息是否发送成功,如果发送失败了我们要进行异常处理,比如存储到其他介质来保证消息不丢。
02 / 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。

03 / 重试次数设置所以acks的值要设置为-1。

为了保证数据不丢,我们尽可能的设置较大的重试次数(参数是retries),如果重试失败了,对异常进行处理,可以把消息保存到另外安全到地方。

服务端

01 / unclean.leader.election.enable

这个参数是控制leader replica出问题了以后follower replica竞选leader replica资格的,我们把设置为false,意思就是如果follower replica如果落后leader replica太多就不能参与竞选。
02 / replication.factor
这个参数设置的是partition副本的个数,如果我们要想保证数据不丢,这个副本数需要设置成大于1。
03 / min.insync.replicas

这个参数要跟生产者里的acks参数配合使用,当生产者acks=-1时,服务端的ISR列表里的所有副本都写入成功,才会给生产者返回成功的响应。而min.insync.replicas这个参数就是控制ISR列表的,假设min.insync.replicas=1,这就意味着ISR列表里可以只有一个副本,这个副本就是leader replica,这个时候即使acks设置的是-1,但其实消息只发送到leader replica,以后就返回成功的响应了。
因为ISR只有一个副本,我们知道这种情况是有可能会丢数据的,所以min.insync.replicas这个值需要大于1的(如果ISR列表里面副本的个数小于min.insync.replicas,生产者发送消息是失败的),并且是min.insync.replicas <= replication.factor

消费者

01 / 手动提交offset
消费者是可以自动提交offset的,但是如果是自动提交offset,可能会丢数据,比如消费者每隔3秒提交一次offset,假如偏移量成功提交了,但是数据处理失败了,这个时候就会丢数据。所以把enable.auto.commit设置成false就行。
当然,我们也只是有限度的保证Kafka数据不丢,因为我们知道Kafka的数据首先是写到操作系统缓存的,假如我们用了上面的配置方案,数据写入成功了,还没落到磁盘,但是集群停电了,这个时候也是会丢数据的!

Kafka 是一种高吞吐量的分布式发布订阅消息系统,它能够解决和处理的问题还有很多。当然了,要想成为一名合格的大数据工程师,还要具备系统的大数据技术知识体系,并熟练使用技术解决不同工作场景中遇到的问题。像Zookeeper、Hadoop、Flume......​

相关文章
|
27天前
|
消息中间件 Java Kafka
SpringBoot整合Kafka(SASL认证配置、处理毒丸消息)
SpringBoot整合Kafka(SASL认证配置、处理毒丸消息)
98 0
|
2月前
|
消息中间件 Java Kafka
SpringBoot整合Kafka简单配置实现生产消费
本文基于SpringBoot整合Kafka,通过简单配置实现生产及消费,包括生产消费的配置说明、消费者偏移设置方式等。更多功能细节可参考
|
6月前
|
消息中间件 存储 Java
Kafka kafka在windows下的安装与配置
Kafka kafka在windows下的安装与配置
199 0
|
8月前
|
消息中间件 Ubuntu Java
Kafka安装并配置SASL_PLAINTEXT认证
Kafka安装并配置SASL_PLAINTEXT认证
544 0
|
11月前
|
消息中间件 XML Java
SSM集成kafka——注解,xml配置两种方式实现
SSM集成kafka——注解,xml配置两种方式实现
206 0
SSM集成kafka——注解,xml配置两种方式实现
|
12月前
|
消息中间件 监控 Kafka
Java--Apache kafka安装和配置
Apache kafka的下载安装和配置。
173 0
Java--Apache kafka安装和配置
|
12月前
|
消息中间件 监控 Java
Apache kafka安装和配置
Apache kafka是一个分布的、分区的、复制的提交日志服务,它使用独一无二的设计,提供了消息系统功能。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。
159 0
Apache kafka安装和配置
|
消息中间件 大数据 Kafka
D011 复制粘贴玩大数据之安装与配置Kafka集群
Kafka的获取 上传安装包到集群 安装Kafka集群 Kafka集群校验
67 0
D011 复制粘贴玩大数据之安装与配置Kafka集群
|
消息中间件 Java 应用服务中间件
Kafka配置公网访问,直接暴露方式与nginx代理方式(绝对没问题)
Kafka配置公网访问,直接暴露方式与nginx代理方式(绝对没问题)
3224 1
|
消息中间件 分布式计算 Hadoop
推荐文章
更多