Kafka常见问题

217 阅读3分钟

1、Kafka的基本概念
broker:多个broker组成kafka,broker中存储partition
partition:分区。一个主题中的消息会有存储在多个partition中
topic:主题。消费者生产者的消息中心,存储数据的逻辑容器
producer:生产者。生产消息发送至主题中
consumer:消费者。订阅主题的消息

2、kafka多副本机制
kafka中一个主题下单partition的消息都会有多个partition的备份。主要用来保证存储安全
参数acks=all 代表的是生产者发送消息的时候所有的副本同步完之后才确认发送成功
request.required.acks =0/1/-1

3、多分区的优势

  • 多个partition可以提高单主题下的消息处理速率
  • 多个partition分布在不同的broker可以保证可用性

4、Kafka如何保证高可用?

  • 多副本机制。保证消息存储的安全可靠,leader副本异常时,从follower副本中选取一个leader副本
  • 分区机制。

5、kafka消费位移提交时机

  • 拉取消息之后,消费完成之前。容易造成消息丢失
  • 拉取消息之后,消费完成之后。容易造成消息重复消费

①、kafka针对消费位移提交的默认配置:

enable.auto.commit=true  // 自动提交开启   
auto.commit.interval.ms=5000[ms]   // 自动提交时间间隔:5s

②、自动提交存在的问题:消息丢失,消息重复

  • 消息重复:第一次拉取消息到X,第二次拉取消息到X+Y,消费者处理位置为X+1+Y,此时消费者异常,再次重新拉取的时候消息集是[X,X+Y] 消息重复拉取并消费
  • 消息丢失:一次拉取的消息集,存储在本地缓存中并异步消费,第二次拉取的消息集放置到本地缓存,本地机器异常重启时本地缓存清空,再次拉取时消息已被poll过,导致消息丢失

③、kafka支持手动提交

  • commitSync:同步手动提交
  • commitAsync:异步手动提交。
    异步提交失败再重试提交时会存在消费位移覆盖的情况。使用递增序号的机制避免位移覆盖的情况,提交位移时与当前序号值做判断:>= 序号值,失败可以重试;<序号值,失败不重试

⑤、那该如何配置才能保证消息不丢失

  • 消息发送时多副本的配置:一般是-1,或者是副本数-1
  • 消息发送时失败重试的配置:重试、重试时间间隔
  • Broker端选举leader副本的配置:与leader副本差距大的follower不参与leader选举
  • 消费位移提交的配置:自动提交 + 手动提交 || 手动提交

6、Kafka什么时候会重平衡?

  • 消费组下面消费实例发生变化的时候
  • 主题下partition变化时

7、什么是重平衡
重平衡可以理解为重新分配消费者下面消费实例对主题分区的对应关系

8、Kafka的重平衡实现原理?
每个Broker都会存在一个Coordinator,Coordinator用来处理消费组的Rebalance

消费组如何确定自己的Coordinator所在的Broker?

  • 在__consumer_offsets主题中找到消费组对应的partition
  • 找到partition后找出leader副本分区对应的broker,也就是处理该消费组的Coordinator所在的Broker

9、如何提高消费速率?
并行处理消息