kafka 主题和分区

97 阅读3分钟

主题

kafka中消息以主题为单位进行归类,生产者负责将消息 发送到特定的主题。而消费者负责订阅主题并进行消费。

分区

主题是一个逻辑上的概念,一个主题可以细分为多个分区。一个分区只属于一个主题。同一个主题下的不同分区 包含的消息是不同的。分区在存储层面可以看作是一个可追加的日志文件,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量。kafka保证的是分区有序而不是主题有序。

kafka中的分区可以分布在不同的服务器(broker)上,也就是说,一个主题可以横跨多个broker,以此来提供比单个broker更强大的性能。

每一条消息被发送到broker之前,会根据分区规则选择存储到哪个具体的分区。如果分区规则设置合理,所有的消息都可以均匀分配到不同的分区中。

副本

kafka为分区引入多副本机制,通过增加副本数量可以提升容灾能力。同一分区的不同副本保存的是相同消息。但在同一时刻,副本间的消息可能不同。副本之间关系是一主多从,leader副本负责读写请求,follower副本只负责于leader副本的消息同步。副本处于多个broker中,在某个broker失效时,kafka通过多副本机制实现故障的自动转移。

  • AR(assigned replicas): 分区中的所有副本
  • ISR(in sync replicas): 所有与leader副本保持一定程度同步的副本
  • OSR(out of sync replicas): 与leader副本同步滞后过多的副本

AR = ISR + OSR

生产者

生产者参数

acks: 这个参数用来指定分区中必须要有多少个副本收到这条消息,之后生产者才会认为这条消息是成功写入的。

  1. acks = 1 时,生产者发送消息之后,只要分区的leader副本成功写入消息,那么它就会收到服务端的成功响应
  2. acks = -1 时,生产者发送消息之后,需要等待ISR 的所有副本都成功写入之后才能够收到来自服务端的成功响应。
  3. acks = 0 时,生产者发送消息之后不需要等待任何服务端的响应。

消费者

消费组是一个逻辑上的概念,它将旗下的消费者归为一类,每一个消费者只隶属于一个消费组。

消费者和消费者组这种模型可以让整体的消费能力具备横向伸缩性,我们可以增加或者减少消费者的个数来提高或降低 整体的消费能力。如果消费者过多,出现消费者的个数大于分区个数的情况,就会有消费者分配不到任何分区。

kafka实现高可靠机制

  1. 增加副本数
  2. acks = -1
  3. 将enable.auto.commit 参数设置为false 来执行手动移位提交

数据丢失的场景