这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
Kafka的大概架构图如下:
主要角色
- Producer:消息的生产者,可以有多个
- Consumer:消息的消费者,可以有多个
- Broker:存储kafka的机器节点,可以有多个
Topic & Partition
所有的消息订阅,都需要指定一个主题。一个主题可以对应多个分区,但是一个分区只能单属于一个主题。
一个分区可以看成是一个append-only的日志文件。 分区分布在多个broker上以追求高性能。
每个分区都有一个offset标记位,来保证分区内的顺序性。因此每个分区内是有序的,但是分区和分区间是无法保证顺序的。(即:Kafka 保证的是分区有序而不是主题有序)。
topic创建完了,可以继续修改分区数量,来实现数据的水平扩展。如果一个主题只对应一个文件,那么这个文件所在的机器 I/O 将会成为这个主题的性能瓶颈,而分区解决了这个问题。(分区提高了吞吐)
副本
为了提升容灾,为分区添加了副本机制。在同一时刻,不能保证副本之间完全同步。副本是:一主多从结构,leader负责处理读写请求,follower只负责和leader做数据同步。副本一定处于不同的broker中,leader出现了问题,follower会选举新leader来实现故障的转移。
副本同步的一些概念:
-
ISR
- 和leader 保持一定同步的副本集合(in-sync-replicas)
-
OSR
- 和leader 落后太多的副本结合 (out-of-sync-replica)
-
HW
- High Watermark 高水位。只有HW之前的数据才可以被消费,后面的这段窗口不可以被消费。
-
LEO
- Log End Offset:代表当前分区的log文件中,待写入的offset,这是针对每个分区的。每个分区和副本都维护一个LEO,LEO等于当前日志文件最后一条的offset+1。
当 follower 副本落后 太多或失效时, leader 副本会把它从 ISR 集合中剔除,如果 OSR 集合中有 follower 副本追上了 leader 副本,那么 leader 副本会把它从 OSR 集合转移至 ISR 集合 。一般意义上:leader失效的时候,只有ISR的副本可以选为leader,OSR的没有任何机会。
HW的原理类似于木桶理论,最高的水位取决于这些分区副本桶中最短的那块木板。 HW就是最短的那个高度。
Kafka的复制机制既不是完全的同步复制, 也不是单纯的异步复制。
- 同步复制: 所有副本都收到消息,才认为该消息成功提交,但是十分的影响性能
- 异步复制:只要被 leader 副本写入就被认为已经成功提交
kafka都不能简单算这2种中的一种。而是采用ISR 的方式则有效地权衡了数据可靠性和性能之间的关系。kafka为了追求高性能通过异步写入,副本主动拉取变更,但不保证强一致。但维持公共状态的HW位置,保证消息可靠。