1. 名词解释
Producer:生产者,是消息的入口
Broker:是 Kafka 实例,每个服务器上有一个或多个 Kafka 的实例,每个 Kafka 集群内的实例都有一个不重复的编号
Topic:消息的主题,用于消息的分类, Kafka 的数据就保存在不同的主题中。在每个 Broker 中都可以创建多个主题
Partition:Topic 的分区,主分区通常称之为 Leader,每个 Topic 可以有多个分区,分区的作用是做负载,提高 Kafka 的吞吐量。且同一个 Topic 在不同的分区下,数据是不重复的。把 Topic 比作电脑中的一个磁盘的话,分区就是磁盘下的文件夹
Replication:每一个 Partition 都会有多个副本(Follower),且副本和主分区一定是放在不同的机器中。当 Leader 故障的时候会选择一个 Follower 成为新的 Leader。在 Kafka 中默认副本的最大数量是10个,且副本的数量不能大于 Broker 的数量
Message:每一条发送的消息主体
Consumer:消费者,是消息的出口
Consumer Group:将多个消费者组成一个消费者组。在 Kafka 中,同一个分区的数据只能被消费者组中的某一个消费者消费;同一个消费者组的消费者可以消费同一个主题的不同分区的数据
Zookeeper:Kafka 集群依赖 Zookeeper 来保存和管理集群的的信息。上述 Leader 的选举就是靠 Zookeeper 完成
2. 基础架构
根据上面的描述,我们可以得到一个大概的 Kafka 架构图
3. 工作流程
3.1 发送数据
Producer 在写入数据的时候只会去找 Leader,而不会直接将数据写入 Follower
- 根据上面那句话的描述,那么发送数据的第一步就是获取到 Leader 的信息,然后开始将数据发送给 Leader
- 在 Leader 收到数据后,会将数据写入到本地的文件中
- Follower 检测到 Leader 已经将数据写入到文件,那么 Follower 开始读取文件,将数据保存在自己的分区中。每一个 Follower 读取完毕后,会向 Leader 发送一个确认的信号
- 当 Leader 收到自己所有的 Follower 发来的确认信息后,Leader 再向 Producer 发送一个确认的信号,表示自己已经接收数据完成
上述所说的确认信号,其实是ACK(发布确认)
在 Kafka 中,ACK有三种模式,三种模式下的值对应为:0, 1,-1(all),他们代表的意思分别为:
- 0:Producer 发送后即为成功
- 1:Producer 发送后,收到 Leader 的确认信号即为成功
- -1(all):Producer 发送后,要 Leader 收到所有 Follower 的确认信号,然后 Producer 再收到 Leader 的确认信号,即为成功
保证消息不丢失就是依靠上述的 ACK 机制
如果往不存在的 Topic 写入数据,Kafka 会自动创建 Topic,Partition 和 Follower,他们的数量默认配置都是1
上面的架构图演变为:
从上面图中可以看到,数据会写到不同的分区中,至于为什么要这么设计,其实很简单
举个例子:公司在做系统的时候,觉得一台服务器很慢,达不到毫秒级别的响应。最快的解决办法就是买多几台服务器,让请求分发到不同的服务器中,这样就能达到用户的请求可以快速应答
上述例子中的服务器就是 Kafka 中的分区;多个分区,在读取数据时可以多条渠道进行读取,消费数据时也可以多条渠道进行消费
但是和上述例子不同的是,服务器接收的请求可能是随机的,但是 Kafka 并不是:
我们在写入数据的时候,可以直接指定需要写入的分区;如果没有指定分区,但是在数据里设置了对应的标识,那么 Kafka 会根据标识,使用哈希算法算出一个分区,然后将其存储。如果又没有指定分区,也没有设置对应的标识,那么就是使用轮询,轮到谁就是谁
3.2 存储数据
Kafka 在存储数据之前,会先单独的在磁盘中开辟一个空间,然后顺序写入
熟悉操作系统的话应该知道,数据在写入磁盘的时候,是按照随机的位置进行写入的。首先要先去找到一个可以容纳本次数据的地方,说白了就是找到能放的下的地方,就往里塞。如果实在找不到的话,就会进行分割,保存到不同的地方。所以就会产生很多的碎片,后续就会有一个整理碎片的操作
当读取这些被分割的数据时,还要根据切割后保存在文件中下一分割文件的头地址,一层层的往下找
在上述的描述中,可得,当数据随机写入磁盘时,是要有一个寻找位置的过程。如果在保存时遇到了分割文件的场景,那么在读取时的速度也会变慢
在 Kafka 中,由于是单独开辟一个空间进行文件的读取,所以省略掉了上述的文件保存和读取时的寻找过程
在 Kafka 中,分区可以理解成电脑里的文件夹。在这个文件夹中有3种类型的文件,分别是:【.index文件】 【.log文件】 【.timeindex文件】
数据存储在 【.log文件】 中,其他的两个都是用来存储用于搜索保存在【.log文件】 中数据的索引
3.3 消费数据
当消息存储在上述的 .log 文件后,消费者就可以开始消费了
在 Kafka 中,消费者是主动去 Kafka 集群中拉取消息进行消费。要注意的是,与发送数据时一样,消费者在拉取数据时也是去寻找 Leader 进行拉取
多个消费者可以组成一个消费者组
同一个组的消费者可以消费同一 topic 下不同分区的数据
但是同一个组的消费者不会消费同一分区的数据
那么上述的架构图演变为:
4. 总结
完整架构图
上面所有原图的下载链接:https://download.youkuaiyun.com/download/wanzijy/86979161