如果某 Topic 有 N 个 Partition,集群有(N+M)个 Broker,那么其中有 N 个 Broker 存储该 Topic 的一个 Partition,剩下的 M 个 Broker 不存储该 Topic 的 Partition 数据 。
如果某 Topic 有 N 个 Partition,集群中 Broker 数目少于 N 个,那么一个 Broker 存储该 Topic 的一个或多个 Partition 。
在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致 Kafka 集群数据不均衡 。
Producer:生产者 。即消息的发布者,生产者将数据发布到他们选择的主题 。 生产者负责选择将哪个记录分配给主题中的哪个分区 。即:生产者生产的一条消息,会被写入到某一个 Partition 。
Consumer:消费者 。可以从 Broker 中读取消息 。一个消费者可以消费多个 Topic 的消息;一个消费者可以消费同一个 Topic 中的多个 Partition 中的消息;一个 Partiton 允许多个 Consumer 同时消费 。
Consumer Group:Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制 。 组内可以有多个消费者,它们共享一个公共的 ID,即 Group ID 。组内的所有消费者协调在一起来消费订阅主题 的所有分区 。
Kafka 保证同一个 Consumer Group 中只有一个 Consumer 会消费某条消息 。
实际上,Kafka 保证的是稳定状态下每一个 Consumer 实例只会消费某一个或多个特定的 Partition,而某个 Partition 的数据只会被某一个特定的 Consumer 实例所消费 。
下面我们用官网的一张图, 来标识 Consumer 数量和 Partition 数量的对应关系 。
![10分钟带你逆袭Kafka!](http://img.jiangsulong.com/220412/16364AY3-4.jpg)
文章插图
由两台服务器组成的 Kafka 群集,其中包含四个带有两个使用者组的分区(P0-P3) 。消费者组 A 有两个消费者实例,组 B 有四个 。
对于这个消费组, 以前一直搞不明白, 我自己的总结是:Topic 中的 Partitoin 到 Group 是发布订阅的通信方式 。
即一条 Topic 的 Partition 的消息会被所有的 Group 消费,属于一对多模式;Group 到 Consumer 是点对点通信方式,属于一对一模式 。
举个例子:不使用 Group 的话,启动 10 个 Consumer 消费一个 Topic,这 10 个 Consumer 都能得到 Topic 的所有数据,相当于这个 Topic 中的任一条消息被消费 10 次 。
使用 Group 的话,连接时带上 groupid,Topic 的消息会分发到 10 个 Consumer 上,每条消息只被消费 1 次 。
Replizcas of partition:分区副本 。副本是一个分区的备份,是为了防止消息丢失而创建的分区的备份 。
Partition Leader:每个 Partition 有多个副本,其中有且仅有一个作为 Leader,Leader 是当前负责消息读写 的 Partition 。即所有读写操作只能发生于 Leader 分区上 。
Partition Follower:所有 Follower 都需要从 Leader 同步消息,Follower 与 Leader 始终保持消息同步 。Leader 与 Follower 的关系是主备关系,而非主从关系 。 ISR:
- ISR,In-Sync Replicas,是指副本同步列表 。ISR 列表是由 Leader 负责维护 。
- AR,Assigned Replicas,指某个 Partition 的所有副本, 即已分配的副本列表 。
- OSR,Outof-Sync Replicas,即非同步的副本列表 。
- AR=ISR+OSR
只有 Broker Controller 会向 Zookeeper 中注册 Watcher,其他 Broker 及分区无需注册 。即 Zookeeper 仅需监听 Broker Controller 的状态变化即可 。
HW 与 LEO:
- HW,HighWatermark,高水位,表示 Consumer 可以消费到的最高 Partition 偏移量 。HW 保证了 Kafka 集群中消息的一致性 。确切地说,是保证了 Partition 的 Follower 与 Leader 间数 据的一致性 。
- LEO,Log End Offset,日志最后消息的偏移量 。消息是被写入到 Kafka 的日志文件中的,这是当前最后一个写入的消息在 Partition 中的偏移量 。
- 对于 Leader 新写入的消息,Consumer 是不能立刻消费的 。Leader 会等待该消息被所有 ISR 中的 Partition Follower 同步后才会更新 HW,此时消息才能被 Consumer 消费 。
我相信你看完上面的概念还是懵逼的,好吧!下面我们就用图来形象话的表示两者的关系吧:
![10分钟带你逆袭Kafka!](http://img.jiangsulong.com/220412/1636464040-5.jpg)
推荐阅读
- 带你了解黑客使用的命令行浏览器,令人吃惊
- 10分钟教你Python+MySQL数据库操作
- 机架式服务器的详解,一文带你读懂
- 一文带你了解IPsec VPN基本原理与配置流程,干货值得收藏
- 带你了解香港服务器和美国服务器的区别
- 10分钟将你的Go工程转换为Go Module模式
- 带你了解太极拳的健身原理是什么
- 黄瓜|春天减肥,试试这5道“刮油菜”,10分钟端上桌,好吃解腻
- 齐刘海|素颜也好看的女生是什么样子的?女生护肤?带你get护肤小步骤!
- “疙瘩汤”的这个做法火了,10分钟出锅,好吃解馋,怎么也吃不够