kafka问题

1. Kafka是如何保障数据不丢失的?

kafka如何保障数据不丢失,也就是kafka提供了什么机制或者架构来保障数据的可靠性。java

  • 分区副本架构
  • 数据复制同步

主要从如下三个方面概述markdown

1.Topic 副本因子个数:replication.factor >= 3
2.同步副本列表(ISR):min.insync.replicas = 2
3.禁用unclean选举: unclean.leader.election.enable=false
复制代码

1. 副本机制

  1. kafka的topic能够分为多个副本,该配置能够经过replication.factor实现。
  2. 副本类型能够分为领导者副本(leader )和追随者副本,每一个分区在建立的时候,都会选举一个副本成为领导者副本,其它的默认成为跟随者副本。(依赖于zookeeper实现
  3. 只有leader 副本才会提供对外的服务,follower 副本是不会处理任务服务请求的,只是作数据同步,数据备份。
  4. 为了提升数据的可用性,副本通常会分布在不一样的broker中,通常也建议把broker配置在不一样的机架上,提升可用性。

2. ISR(In-sync replica):同步副本列表

  1. leader副本和与leader副本保持同步的follower副本均在ISR中。
  2. replica.lag.time.max.ms这是配置follower副本与leader副本同步的最长时间,若是在该时间内follower副本没有与leader副本同步,则会将该follower踢出ISR。
  3. 为了提升kafka的可靠性,咱们通常须要将最小同步副本数量设置大一点,对于一个包含3 个副本的主题分区,若是min.insync.replicas=2 ,那么至少要存在两个同步副本才能向分区写入数据。

注意: 若是进行了上面的配置,此时必需要保证ISR中至少存在两个副本,若是ISR中的副本个数小于2,那么Broker就会中止接受生产者的请求。尝试发送数据的生产者会收到NotEnoughReplicasException异常,消费者仍然能够继续读取已有的数据。session

3. 禁用unclean选举

  1. 选择一个同步副本列表中的分区做为leader 分区的过程称为clean leader election
  2. 非同步副本中选取一个副本做为leader的过程叫作unclean leader election
  • 开启unclean leader election这种方式进行选举leader,能够经过配置unclean.leader.election.enable进行设置。
  1. 开启的优势缺点:
  • 背景:由于ISR是动态的,因此存在ISR列表中为空的状况,在leader挂了,其它follower没有同步时,将会产生这种状况,而一旦发生这种状况,整个kafka将不能提供服务了。
  • 高可用-开启(好比实时点击流分析系统):为了kafka集群可以一直提供服务(优势),能够开启unlean.leader选举,可是由于选举的是非ISR列表中的follower做为新的leader,由于这些follower上的信息可能与以前的leader上的数据相差比较大,那么新选举的follower成为leader后,由于没有同步老leader上的数据,就会产生数据丢失的状况(缺点)
  • 数据一致性-禁用unclean选举(应用:好比银行,要去数据一致性高):禁用的话,那么选举leader只能从ISR中选举,这样能够能够保障数据的一致性(固然,这个一致性不能彻底保障,由于follower中的数据是异步和leader同步的,若是数据没有同步完,leader就挂了,那么新选举的leader里面由于没有彻底同步老leader数据,就会存在数据部分丢失的可能性。除非设置里acks=all,确保了全部follower所有同步了leader,并响应给producer
follower和leader数据同步和以下两个参数关系密切:

replica.lag.time.max.ms:同步副本滞后与leader副本的时间
zookeeper.session.timeout.ms:与zookeeper会话超时时间
复制代码

2. 如何解决kafka数据丢失问题?

  • acks=all:全部副本同步后
  • 配置 retries > 0 的 Producer 可以自动重试消息发送,避免消息丢失。
  • 配置auto.offset.reset,这个参数有两种配置。一种是earliest:消费者会从分区的开始位置读取数据,无论偏移量是否有效,这样会致使消费者读取大量的重复数据,但能够保证最少的数据丢失。一种是latest(默认),若是选择了这种配置, 消费者会从分区的末尾开始读取数据,这样能够减小重复处理消息,但颇有可能会错过一些消息。

补充让kafka数据不丢失

  • 不要使用 producer.send(msg),而要使用 producer.send(msg, callback)。
  • 设置 acks = all (确保全部follower都同步数据完成在响应producer)
  • 设置 retries 为一个较大的值。(当producer发送消息失败,多尝试从新发送消息)
  • 设置 unclean.leader.election.enable = false。(禁用非同步follower参与竞选leader)
  • 设置 replication.factor >= 3。(配置分区副本数大于等于3)
  • 设置 min.insync.replicas > 1。(配置可用ISP同步副本数大于1)
  • 确保 replication.factor > min.insync.replicas。(分区副本数大于能够同步副本数配置)

这个和上面的推断结果差很少。架构

3. kafka能够保障永久不丢失数据吗?

Kafka 只对“已提交”的消息(committed message)作有限度的持久化保证负载均衡

    1. 已提交:就是数据已经记录在log文件中的数据,kafka响应给producer,数据已经接收成功的数据(acks=1,或者acks=all)
    1. 这些消息的日志文件所在的broker是正常的
  • 因此总而言之,kafka是能够作到保障永久不丢失数据的,只不过要有条件限制

4. 如何保障kafka中的消息是有序的?

  1. kafka是分区有序的,若是一个主题有多个分区,那么Kafka会按照key将其发送到对应的分区中,因此,对于给定的key,与其对应的record在分区内是有序的。

方案一: 对于须要保障消息有序的topic,设置单个分区,可是会影响吞吐量。异步

方案二: 设置两个参数:post

  • 消息发送失败是,重试次数,配置retries>0,还须要配置max.in.flight.requests.per.connections:1,该参数是保障消息写入的顺序,当尝试重发第一批消息的时候,就不会有其余消息尝试发送给broker。这种也会影响吞吐量,可是能够保障消息是顺序发送的。

5. 如何肯定kafka分区的数据量?

一个简单的计算公式为:分区数 = max(生产者数量,消费者数量)spa

生产者数量=总体生产吞吐量/每一个生产者对单个分区的最大生产吞吐量日志

消费者数量=总体消费吞吐量/每一个消费者从单个分区消费的最大吞吐量code

选择合适的分区数量能够达到高度并行读写和负载均衡的目的,在分区上达到均衡负载是实现吞吐量的关键。须要根据每一个分区的生产者和消费者的指望吞吐量进行估计。

6. 从新平衡kafka集群?

在下面状况发生时,须要重平衡集群:

  • 主题分区在整个集群里的不均衡分布形成了集群负载的不均衡。
  • broker离线形成分区不一样步。
  • 新加入的broker 须要从集群里得到负载。

使用kafka-reassign-partitions.sh命令进行重平衡

7. 如何查看消费组是否存在滞后消费?

备注:

参考以下

  1. kafka-问题
  2. java小咖秀
相关文章
相关标签/搜索