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