kafka和zookeeper

kafka——原理解析

2020-11-23  本文已影响0人  小波同学

一、为什么需要消息系统

二、消息队列的两种模式

发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。

三、Kafka 基础架构

3.1、Kafka拓扑结构

3.2、上图中kafka相关术语

3.3、zookeeper 节点

kafka 在 zookeeper 中的存储结构如下图所示:


四、Kafka 工作流程与文件存储机制

4.1、工作流程

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

topic 是逻辑上的概念,而 partition 是物理上的概念,每个 partition 对应于一个 log 文件,该 log 文件中存储的就是 producer 生产的数据。

Producer 生产的数据会被不断追加到该 log 文件末端,且每条数据都有自己的 offset。消费者组中的每个消费者,都会实时记录自己消费到了哪个 offset,以便出错恢复时,从上次的位置继续消费。

4.2、文件存储机制

由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位效率低下,Kafka 采取了分片和索引机制,将每个 partition 分为多个 segment。

每个 segment 对应两个文件:“.index”文件和“.log”文件。

这些文件位于一个文件夹下,该文件夹的命名规则为:topic 名称 + 分区序号。

例如,first 这个 topic 有三个分区,则其对应的文件夹为 first0、first-1、first-2。

00000000000000000000.index
00000000000000000000.log
00000000000000170410.index
00000000000000170410.log
00000000000000239430.index
00000000000000239430.log

index 和 log 文件以当前 segment 的第一条消息的 offset 命名。下图为 index 文件和 log 文件的结构示意图。


“.index”文件存储大量的索引信息,“.log”文件存储大量的数据,索引文件中的元数据指向对应数据文件中 message 的物理偏移地址。

四、Zookeeper 在 Kafka 中的作用

Kafka 集群中有一个 broker 会被选举为 Controller,负责管理集群 broker 的上下线,所
有 topic 的分区副本分配和 leader 选举等工作。

Controller 的管理工作都是依赖于 Zookeeper 的。

以下为 partition 的 leader 选举过程:


五、kafka HA

5.1、replication

如Kafka拓扑结构图所示,同一个 partition 可能会有多个 replica(对应 server.properties 配置中的 default.replication.factor=N)。没有 replica 的情况下,一旦 broker 宕机,其上所有 patition 的数据都不可被消费,同时 producer 也不能再将数据存于其上的 patition。引入replication 之后,同一个 partition 可能会有多个 replica,而这时需要在这些 replica 之间选出一个 leader,producer 和 consumer 只与这个 leader 交互,其它 replica 作为 follower 从 leader 中复制数据。

Kafka 分配 Replica 的算法如下:

5.2、leader failover

当 partition 对应的 leader 宕机时,需要从 follower 中选举出新 leader。在选举新leader时,一个基本的原则是,新的 leader 必须拥有旧 leader commit 过的所有消息。

kafka 在 zookeeper 中(/brokers/.../state)动态维护了一个 ISR(in-sync replicas),由3.3节的写入流程可知 ISR 里面的所有 replica 都跟上了 leader,只有 ISR 里面的成员才能选为 leader。对于 f+1 个 replica,一个 partition 可以在容忍 f 个 replica 失效的情况下保证消息不丢失。

当所有 replica 都不工作时,有两种可行的方案:

kafka 0.8.* 使用第二种方式。

5.3、broker failover

kafka broker failover 序列图如下所示:


kafka 通过 Controller 来选举 leader,流程说明:

5.4、controller failover

当 controller 宕机时会触发 controller failover。每个 broker 都会在 zookeeper 的 "/controller" 节点注册 watcher,当 controller 宕机时 zookeeper 中的临时节点消失,所有存活的 broker 收到 fire 的通知,每个 broker 都尝试创建新的 controller path,只有一个竞选成功并当选为 controller。

当新的 controller 当选时,会触发 KafkaController.onControllerFailover 方法,在该方法中完成如下操作:

参考:
https://www.cnblogs.com/cyfonly/p/5954614.html

https://www.cnblogs.com/xifenglou/p/7251112.html

https://www.cnblogs.com/sujing/p/10960832.html

https://www.cnblogs.com/jhxxb/p/11498536.html

上一篇 下一篇

猜你喜欢

热点阅读