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做缓存的原理。