kafka 是基于公布、订阅模式的音讯队列,由 scala 写成,吞吐强悍,实用于大数据实时处理。
架构
topic:
producer:生产者
consumer group:生产组,内含多个消费者。
consumer:消费者从 broker 拉取音讯,以适当速度生产音讯。
offset:偏移量,相当于音讯在队列里的地位。
broker:kafka 集群由多个实例组成,每个实例称为 broker。一个 broker 能够被多个 topic 共用。
partition:一个 topic 分成多个 partition,每个 partition 解决一部分音讯,每个 partition 内有序,每个 partition 只能由一个 consumer 生产,一个 consumer 能够生产多个 partition,partition 数 <=consumer 数。通过分区能够不便扩大,进步并发。
Replication:一个 partition 分成 leader 和多个 follower,他们都成为 replication,散布在多个 broker 上,replication 数不能超过 broker 数。
原理
写入形式
producer 采纳 push 模式将音讯公布到 broker,每条音讯都被 append 到 patition 中,被赋予了一个惟一的 offset 值。属于 程序写磁盘,程序写比随机写要起码提速 3 个数量级!
分区形式
1. 指明 partition
2. 没指明,但又 key,将 key 的 hash 值对分区数取余
3. 没有 key,第一次调用时随机生成一个整数,尔后每次自增,用这个数对分区数取余(round-robin 算法)
存储构造
每个 partition 分为多个 segment,每个 segment 有一个.INDEX 寄存索引(log 文件中音讯的偏移地址)和一个.LOG 存放数据。index 和 log 文件以本人第一条音讯的偏移量命名。
数据可靠性
at least once
at most once
exactly once
生产者信息发送至 Broker
- producer 从 ZK 找到指标 Partition 的 Leader 元数据。
- producer 发送音讯给 Leader。
- Leader 承受音讯长久化,而后依据 acks 配置抉择如何同步 Follower。
- Follower 依照后面说的同步数据后给 Leader 回复 ack。
-
Leader 跟 Follower 同步结束后 Leader 给 producer 回复 ack。
acks 配置
request.required.acks = 0
producer 不期待 broker 的 ack,提供了一个最低的提早,broker 接管到还没有写入磁盘就曾经返回,当 broker 故障时有可能失落数据,对应 At Most Once 模式。
request.required.acks = 1
默认值,producer 期待 broker 的 ack,partition 的 leader 落盘胜利后返回 ack,如果在 follower 同步胜利之前 leader 故障,那么将会失落数据;认为 leader 返回 信息就胜利了。
request.required.acks = -1 / all
producer 期待 broker 的 ack,partition 的 leader 和 follower (ISR 中的) 全副落盘胜利后才返回 ack。
但如果在 leader 收到信息返回 ok,follower 收到信息然而发送 ack 时 leader 故障,此时生产者会从新给 follower 发送个信息。
对应 At Least Once 模式。幂等性
无论生产者发送多少个反复音讯,Server 端只会长久化一条数据,在生产者参数中 enable.idompotence= true。使用的是 broker 对 requestno 做缓存的原理。