kafka基础原理

架构:

副本的相同分区位置不能存在于同一个broker上, 没有意义,当机器出现故障的时候,这个副本就没有问题.
kafka基础原理

offset,topic,partitions的介绍:

kafka基础原理

Kafka 中消息是以 topic 进行分类的,生产者生产消息,消费者消费消息,都是面向 topic的。

topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文件(这个log文件不是指的日志文件,而是真正的数据),该 log 文件中存储的就是 producer 生产的数据。Producer 生产的数据会被不断追加到该log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个offset,以便出错恢复时,从上次的位置继续消费。

kafka文件存储机制

kafka基础原理

一个segment file中有多个segment , 一个segment由 .index和.log文件组成, 为防止每个文件过大, 查找效率过低,所以会有多个segment, 每个的segment文件应该是500M

通过offset查找message:
例如读取offset=368776的message,需要通过下面2个步骤查找。
第一步查找segment file

上图为例,其中00000000000000000000.index表示最开始的文件,起始偏移量(offset)为0.第二个文件00000000000000368769.index的消息量起始偏移量为368770 = 368769 + 1.同样,第三个文件00000000000000737337.index的起始偏移量为737338=737337 + 1,其他后续文件依次类推,以起始偏移量命名并排序这些文件,只要根据offset二分查找文件列表,就可以快速定位到具体文件。
当offset=368776时定位到00000000000000368769.index|log

第二步通过segment file查找message

通过第一步定位到segment file,当offset=368776时,依次定位到00000000000000368769.index的元数据物理位置和00000000000000368769.log的物理偏移地址,然后再通过00000000000000368769.log顺序查找直到offset=368776为止

分区

分区的原因:
提高并发性,提高运行效率
分区的原则:

(1)没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic 的 partition
数进行取余得到 partition 值
(2)既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数( 后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到partition值,也就是常说的 round-robin 算法。 (轮询)

可靠性

为了保证可靠性: 当发送成功时,会返回ack
kafka基础原理

当发送leader中, ISR的follower 全部同步完成之后,会返回ack消息,提示消息应答成功.

两种副本同步机制:
kafka基础原理

ISR机制:
情景: kafka采用的是第二种, 可能会出现当某一个follower因为某些故障,一直处于等待状态,就没有办法去发送ack应答 .

机制:

Leader 维护了一个动态的 in-sync replica set (ISR),意为和 leader 保持同步的 follower 集合。当 ISR 中的 follower 完成数据的同步之后,leader 就会给 follower 发送 ack。如果 follower长时间 未 向 leader 同 步 数 据 , 则 该 follower 将 被 踢 出 ISR ,该 时 间 阈 值 由replica.lag.time.max.ms 参数设定。Leader 发生故障之后,就会从 ISR 中选举新的 leader

最开始的ISR是有两个判断条件的,一个是时间阈值, 一个是消息相差,后来因为可能出现当批数据发送,直接出现相差过多,每次的相差

ack 应答机制:
三种可靠级别(因为有的数据丢掉不重要):

0:producer 不等待 broker 的 ack,这一操作提供了一个最低的延迟,broker 一接收到还没有写入磁盘就已经返回,当 broker 故障时有可能丢失数据;
1:producer 等待broker 的 ack,partition 的 leader 落盘成功后返回ack,如果在 follower
同步成功之前leader 故障,那么将会丢失数据;
-1(all):producer 等待 broker 的 ack,partition 的 leader 和 follower 全部落盘成功后才
返回 ack。但是如果在 follower 同步完成后,broker 发送 ack 之前,leader 发生故障,那么会造成数据重复。
也可能造成数据丢失: 当ISR中没有其他的follower,且这个时候leader发生故障

HW和LEO:

kafka基础原理
LEO:指的是每个副本最大的 offset;
HW:指的是消费者能见到的最大的 offset,ISR 队列中最小的 LEO。

leader 发生故障之后:

会从 ISR 中选出一个新的 leader,之后,为保证多个副本之间的
数据一致性,其余的 follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 leader同步数据

follower 发生故障之后:

follower 发生故障后会被临时踢出 ISR,待该 follower 恢复后,follower 会读取本地磁盘记录的上次的HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 leader 进行同步。
等该 follower 的 LEO 大于等于该 Partition 的 HW,即 follower 追上 leader 之后,就可以重
新加入 ISR 了

Exactly Once 语义

作用: 解决了同一生产者发送相同重复数据问题

根据<PID, Partition, SeqNumber> 这三个值来判断是否相同

ACK 级别为0 :只发送一次,但是会出现丢失数据
ACK级别为-1: 确保信息数据发送成功,会发送多次

0.11 版本的 Kafka新特性: 幂等性。
所谓的幂等性就是指Producer 不论向 Server 发送多少次重复数据,Server 端都只会持久化一条。幂等性结合 At Least Once 语义,就构成了Kafka 的Exactly Once 语义

上一篇:s3c2440裸机-电阻触摸屏编程(4.isr设计_4.2支持长按和滑动)


下一篇:kafka 常见面试题+知识点汇总