Kafka原理
Posted lifuwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kafka原理相关的知识,希望对你有一定的参考价值。
Kafka整体结构图
- Producer :消息生产者,就是向 kafka broker 发消息的客户端。
- Consumer :消息消费者,向 kafka broker 取消息的客户端
- Topic :每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。
- Consumer Group (CG):这是 kafka 用来实现一个 topic 消息的广播和单播的手段。一个 topic 可以有多个 CG。topic 的消息会复制(不是真的复制,是概念上的)到所有的 CG,但每个 partition 只会把消息发给该 CG 中的一个consumer。如果需要实现广播,只要每个 consumer 有一个独立的 CG 就可以了。要实现单播只要所有的 consumer 在同一个 CG。用 CG 还可以将 consumer 进行自由的分组而不需要多次发送消息到不同的 topic。
- Broker :一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。
- Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)。kafka 只保证按一个 partition 中的顺序将消息发给 consumer,不保证一个 topic 的整体(多个 partition 间)的顺序。
- Offset:kafka 的存储文件都是按照 offset.kafka 来命名,用 offset 做名字的好处是方便查找。例如你想找位于 2049 的位置,只要找到 2048.kafka 的文件即可。
- Replication:Kafka 支持以 Partition 为单位对 Message 进行冗余备份,每个 Partition 都可以配置至少 1 个 Replication。
- Leader:每个 Replication 集合中的 Partition 都会选出一个唯一的 Leader,所有的读写请求都由Leader 处理。其他 Replicas 从 Leader 处把数据更新同步到本地。每个 Cluster 当中会选举出一个 Broker 来担任 Controller,负责处理 Partition的 Leader 选举,协调 Partition 迁移等工作。
- ISR(In-Sync Replica):是 Replicas 的一个子集,表示目前 Alive 且与 Leader 能够“Catch-up”的Replicas 集合。 由于读写都是首先落到 Leader 上,所以一般来说通过同步机制从 Leader 上拉取数据的 Replica 都会和 Leader 有一些延迟(包括了延迟时间和延迟条数两个维度),任意一个超过阈值都会把该 Replica 踢出 ISR。每个 Partition 都有它自己独立的 ISR。
分片与副本机制
分片:当数据量非常大的时候,一个服务器存放不了,就将数据分成两个或者多个部分,存放在多台服务器上。每个服务器上的数据,叫做一个分片。
副本:当数据只保存一份的时候,有丢失的风险。为了更好的容错,将数据拷贝几份,保存到不同的机器上。
Kafka分配Replica的算法如下:
- 将所有Broker(假设共n个Broker)和待分配的Partition排序
- 将第i个Partition分配到第(i mod n)个Broker上
- 将第i个Partition的第j个Replica分配到第((i + j) mode n)个Broker上
消息不丢失机制
生产者端消息不丢失
- 消息生产分为同步模式和异步模式
- 消息确认分为三个状态
(a)0:生产者只负责发送数据
(b)1:某个partition的leader收到数据给出响应
(c)-1:某个partition的所有副本都收到数据后给出响应 - 在同步模式下
(a)生产者等待10S,如果broker没有给出ack响应,就认为失败。
(b)生产者重试3次,如果还没有响应,就报错。 - 在异步模式下
(a)先将数据保存在生产者端的buffer中。Buffer大小是2万条。
(b)满足数据阈值或者数量阈值其中的一个条件就可以发送数据。
(c)发送一批数据的大小是500条。
如果broker迟迟不给ack,而buffer又满了。开发者可以设置是否直接清空buffer中的数据。
Borker端消息不丢失
broker端的消息不丢失,其实就是用partition副本机制来保证。
Producer ack -1. 能够保证所有的副本都同步好了数据。其中一台机器挂了,并不影像数据的完整性。
消费者端消息不丢失
以上是关于Kafka原理的主要内容,如果未能解决你的问题,请参考以下文章