这两年大数据行业发展前景较好,行业工程师薪资高、人才少、竞争压力小,不少人也所以想要转型成为大数据工程师,但也正是由于行业新、人才少,不少技术解决方案也是缺乏很优质的答案。今天,我给你们详细剖析一个大数据工程师面试中的高频面试题——Kafka是如何保证数据零丢失的?面试
若是要想保证Kafka数据不丢, 要从Kafka的三个地方入手:生产者、服务端和消费者。缓存
生产者安全
01 / API使用
在生产中Kafka生产者的开发咱们都会用异步调用的方式,异步调用方式有以下两个API:服务器
1)producer.send(msg) 不带回调方法2)producer.send(msg,callback) 带回调方法异步
记得要使用带有回调方法的API,咱们能够根据回调函数得知消息是否发送成功,若是发送失败了咱们要进行异常处理,好比存储到其余介质来保证消息不丢。
02 / acks参数设置分布式
acks这个参数有三个值:0,1,-1,可是不一样的参数对应的含义不一样,那若是咱们想要保证数据不丢,acks值应该设置为哪一个参数呢?请看下面的表格:ide
表明生产者只要把消息发送出去之后就认为消息发送成功了,这种方式有可能会致使数据丢失,由于有可能消息发送到服务端之后服务端存储失败了。函数
1oop
表明生产者把消息发送到服务端,服务端的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......
更多免费技术资料及视频