消息队列 - Kafka

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

  1. 根据上面那句话的描述,那么发送数据的第一步就是获取到 Leader 的信息,然后开始将数据发送给 Leader
  2. 在 Leader 收到数据后,会将数据写入到本地的文件中
  3. Follower 检测到 Leader 已经将数据写入到文件,那么 Follower 开始读取文件,将数据保存在自己的分区中。每一个 Follower 读取完毕后,会向 Leader 发送一个确认的信号
  4. 当 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.csdn.net/download/wanzijy/86979161

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
rsyslog-kafka是一种将rsyslog日志服务器与Apache Kafka消息队列集成的工具。rsyslog是一个功能强大的开源日志收集器,可用于在Linux系统上收集、处理和转发日志数据。而Kafka是一个高度可扩展的分布式消息系统,用于实时处理和存储大量数据。 通过rsyslog-kafka的集成,我们可以将rsyslog收集到的日志数据发送到Kafka消息队列中,从而实现日志的实时处理和存储。这种集成的好处是可以应对流量大、实时性要求高的日志场景,提高日志的传输速度和处理能力。 使用rsyslog-kafka的过程大致分为以下几步:首先,需要配置rsyslog服务器以收集特定文件或设备的日志数据;然后,配置rsyslog-kafka模块,指定Kafka的主题(topic)和其他相关参数;接下来,rsyslog-kafka将会将收集到的日志数据传输到Kafka消息队列中;最后,消费者可以从Kafka消息队列中实时接收、处理和存储这些日志数据。 rsyslog-kafka具有一些优点。首先,通过使用Kafka作为消息队列,可以轻松地扩展和处理大量的日志数据。其次,rsyslog-kafka提供了高度可配置性,可以根据需求选择日志的格式、过滤器和其他参数。此外,rsyslog-kafka还支持故障转移和高可用性机制,确保日志数据的可靠传输和存储。 总之,rsyslog-kafka是一种强大的工具,可以将rsyslog日志服务器与Kafka消息队列集成,实现高效的日志收集、传输、处理和存储。它为大规模的日志数据场景提供了解决方案,并提供了灵活的配置选项和高可靠性的机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LF3_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值