Kafka是一个分布式系统,易于向外扩展。它同时为发布和订阅提供高吞吐量。它支持多订阅者,当失败时能自动平衡消费者。消息的持久化。
kafka架构
从图上看到主要包含三个组件,producer, consumer, zookeeper, broker。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。Producer使用push(推)模式将消息发布到broker,Consumer使用pull(拉)模式从broker订阅并消费消息。
常见术语:
1.topic&partition
一个topic可以认为一个一类消息,每个topic将被分成多个partition,每个partition在存储层面是append log文件。任何发布到此partition的消息都会被追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量),offset为一个long型的数字,它唯一标记一条消息。每条消息都被append到partition中,是顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。
2.segment
段。将 partition 进一步细分为了若干的 segment,每个 segment 文件的最大大小相等。
3.Consumer Group
consumer group 是 kafka 提供的可扩展且具有容错性的消费者机制。组内可以有多个消费者,它们共享一个公共的 ID,即 group ID。组内的所有消费者会协调在一起平均消费订阅主题的所有分区。
4.isr
5.watermark
LW是Low Watermark的缩写,俗称“低水位”,代表AR集合中最小的logStartOffset值,副本的拉取请求(FetchRequest,它有可能触发新建日志分段而旧的的被清理,进而导致logStartoffset的增加)和删除请求(DeleteRecordRequest)都可能促使LW的增长
LSO特指LastStableOffset。它具体与kafka的事物有关。消费端参数——isolation.level,这个参数用来配置消费者事务的隔离级别。字符串类型,“read_uncommitted”和“read_committed”,表示消费者所消费到的位置,如果设置为“read_committed",那么消费这就会忽略事务未提交的消息,既只能消费到LSO(LastStableOffset)的位置,默认情况下,”read_uncommitted",既可以消费到HW(High Watermak)的位置。
HighWatermark,高水位,表示 Consumer 可以消费到的最高 partition 偏移量。HW保证了 Kafka 集群中消息的一致性。确切地说,是在 broker 集群正常运转的状态下,保证了partition 的 Follower 与 Leader 间数据的一致性,ISR集合中最小的LEO即为分区的HW,对消费这而言只能消费HW之前的消息
LEO,Log End Offset,日志最后消息的偏移量。消息是被写入到 Kafka 的日志文件中的,这是当前最后一个写入的消息在 Partition 中的偏移量。 对于 leader 新写入的消息,consumer 是不能立刻消费的。leader 会等待该消息被所有ISR 中的 partition follower 同步后才会更新 HW,此时消息才能被 consumer 消费。LEO的大小相当于当前日志分区中最后一条消息的offset值加1。分区ISR集合中的每个副本都会维护自身的LEO,而ISR集合中最小的LEO即为分区的HW,对消费这而言只能消费HW之前的消息
6.isr
osr是与leader副本同步滞后过多的副本(不包括leader)列表
ISR就是那些与Partition Leader保持同步的列表
AR=ISR+OSR。在正常情况下,所有的follower副本都应该与leader副本保持一定程度的同步,即AR=ISR,OSR集合为空