参考数据《Apache Kafka实战》
Kafka功能架构
Kafka 的标准定位是分布式流式处理平台
核心架构如上图所示:主要功能包括了
- 生产者发送消息给 Kafka 服务器。
- 消费者从 Kafka 服务器读取消息。
- Kafka 服务器依托 ZooKeeper 集群进行服务的协调管理 。
消息
如上图所示,kafka的消息具有以下特性
- 首先, Kafka 中的消息格式由很多字段组成,其中的很多宇段都是用于管理消息的元数据宇段,对用户来说是完全透明的。
- Kafka 使用紧凑的二进制字节数组来保存上面这些字段, 设计时特意避开了繁重的 Java 堆上内存分配,使用页缓存
topic和partition
topic 是一个逻辑概念,代表了一类消息。通常我们可以使用不同的 topic 来区分不同的业务。
每个 Kafka topic 都由若干个 partition 组成,Kafka 的 partition 是不可修改的有序消息日志。用户对partition 唯一能做的操作就是在消息序列的尾部追加写入消息。每条消息会被分配一个初始的序列号,可以唯一定位到某 partition 下的一条消息,成为消息位移(offset)。
offset
Kafka 消费者端也有位移( offset)的概念。区别在于
- 每条消息在某个 partition 的位移是固定的,但消费该 partition 的消费者的位移会随着消费进度不断前移
-消费者位移不可能超过该分区最新一条消息的位移 。
Kafka 中的一条消息其实就是一个<topic,partition,offset>三元组(tuple),通过该元组值我们可以在 Kafka 集群中找到唯一对应的那条消息。
replia
partition 是有序消息日志,为了实现高可靠性,Kafka保存了多个备份日志,在 Kafka 中被称为副本( replica ),它们存在的唯一目的就是防止数据丢失。副本分为两类 : 领导者副本( leader replica )和追随者副本( follower replica )
- leader 对外提供服务
- follower 只是被动地追随 leader 的状态,保持与 leader 的同步。follower 存在的唯一价值就是充当 leader的候补:一旦 leader 挂掉立即就会有一个追随者被选举成为新的 leader 接替它的工作。
ISR
就是与 leader replica 保持同步的 replica 集合。Kafka 为 partition 动态维护 一个 replica 集合。该集合 中的所有 replica :
- 保存的消息日志都与leader replica 保持同步状态。
- 只有这个集合中的 replica 才能被选举为 leader,
- 只有该集合中所有 replica 都接收到了同一条消息, Kafka 才会将该消息置于“己提交”状态,即认为这条消息发送成功。
正常情况下, partition 的所有 replica (含 leader replica )都应该与 leader replica 保持同步,即所有 replica 都在 ISR 中。但是因为各种各样的原因,可能存在 replica 开始落后于 leader replica 的进度 。滞后一定程度 Kafka 会将这些 replica “踢”出 ISR,同时追上之后的replica也可以被重新加入到ISR。