kafka消息队列

1、Kafka简介

Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么`Kafka`也就拥有消息队列的相应的特性了

1.1 Kafka消费模式

Kafka的消费模式主要有两种:一种是一对一的消费,也即点对点的通信,即一个发送一个接收。第二种为一对多的消费,即一个消息发送到消息队列,消费者根据消息队列的订阅拉取消息消费。

一对一

消息生产者发布消息到Queue队列中,通知消费者从队列中拉取消息进行消费。消息被消费之后则删除,Queue支持多个消费者,但对于一条消息而言,只有一个消费者可以消费,即一条消息只能被一个消费者消费。

一对多

这种模式也称为发布/订阅模式,即利用Topic存储消息,消息生产者将消息发布到Topic中,同时有多个消费者订阅此topic,消费者可以从中消费消息,注意发布到Topic中的消息会被多个消费者消费,消费者消费数据之后,数据不会被清除,Kafka会默认保留一段时间,然后再删除

1.2 Kafka的基础架构

Kafka像其他Mq一样,也有自己的基础架构,主要存在生产者Producer、Kafka集群Broker、消费者Consumer、注册消息[Zookeeper]

Producer:消息生产者,向Kafka中发布消息的角色。
Consumer:消息消费者,即从Kafka中拉取消息消费的客户端。
Consumer Group:消费者组,消费者组则是一组中存在多个消费者,消费者消费Broker中当前Topic的不同分区中的消息,消费者组之间互不影响,所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。**某一个分区中的消息只能够一个消费者组中的一个消费者所消费**
Broker:经纪人,一台Kafka服务器就是一个Broker,一个集群由多个Broker组成,一个Broker可以容纳多个Topic。
Topic:主题,可以理解为一个队列,生产者和消费者都是面向一个Topic
Partition:分区,为了实现扩展性,一个非常大的Topic可以分布到多个Broker上,一个Topic可以分为多个Partition,每个Partition是一个有序的队列(分区有序,不能保证全局有序)
Replica:副本Replication,为保证集群中某个节点发生故障,节点上的Partition数据不丢失,Kafka可以正常的工作,Kafka提供了副本机制,一个Topic的每个分区有若干个副本,一个Leader和多个Follower
Leader:每个分区多个副本的主角色,生产者发送数据的对象,以及消费者消费数据的对象都是Leader。
Follower:每个分区多个副本的从角色,实时的从Leader中同步数据,保持和Leader数据的同步,Leader发生故障的时候,某个Follower会成为新的Leader

1.3 Kafka的安装和使用(openEuler)

准备

安装docker

##添加仓库

dnf config-manager --add-repo=https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

sed -i 's+download.docker.com+repo.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

sed -i 's+\$releasever+8+' /etc/yum.repos.d/docker-ce.repo

dnf install -y docker-ce docker-ce-cli containerd.io

添加国内加速镜像

{
  "registry-mirrors": [
    "https://0vmzi3q6.mirror.aliyuncs.com",
    "https://docker.m.daocloud.io",
    "https://mirror.baidubce.com",
    "https://dockerproxy.com",
    "https://mirror.iscas.ac.cn",
    "https://huecker.io",
    "https://dockerhub.timeweb.cloud",
    "https://nohub.ru",
    "https://v1qgh0kqj.mirror.aliyuncs.com"
  ]
}

启动docker服务

下载镜像

docker pull wurstmeister/kafka

docker pull wurstmeister/zookeeper

启动zookeeper容器

首先需要启动zookeeper,如果不先启动,启动kafka没有地方注册消息

docker run -it --name zookeeper -p 12181:2181 -d wurstmeister/zookeeper:latest
启动失败

存在文件描述符(file descriptor)相关的限制问题,导致即使分配了较多内存,导致容器无法正常启动

解决

启动容器时,可以通过 --ulimit 参数来设置容器内的文件描述符限制

docker run -it --name zookeeper -p 12181:2181 --ulimit nofile=1024:1024 -d wurstmeister/zookeeper:latest

启动kafka容器

启动kafka容器,注意需要启动三台,注意端口的映射,都是映射到9092;区分id

# 第一台
docker run -it --name kafka01 -p 19092:9092 -d -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.11.51:12181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.11.51:19092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka:latest
# 第二台
docker run -it --name kafka02 -p 19093:9092 -d -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.11.51:12181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.11.51:19093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka:latest
# 第三台
docker run -it --name kafka03 -p 19094:9092 -d -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.11.51:12181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.11.51:19094 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka:latest

环境变量解析(-e 参数,Kafka 核心配置)

  1. KAFKA_BROKER_ID=01/2

    • 每个 Kafka 节点(broker)的唯一标识 ID,必须是整数且在集群中唯一。
    • 示例中三个节点分别设置为 012,用于区分不同节点。
  2. KAFKA_ZOOKEEPER_CONNECT=192.168.11.51:12181

    • 指定 Kafka 连接的 Zookeeper 地址,格式为 Zookeeper 服务器 IP:端口
    • 这里连接的是 IP 为 192.168.11.51、端口为 12181 的 Zookeeper 服务
    • Kafka 依赖 Zookeeper 管理集群元数据(如主题、分区、节点信息等),所有节点必须连接到同一个 Zookeeper。
  3. KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.11.51:1909219093/19094

    • 核心配置:指定 Kafka 对外暴露的连接地址,客户端(生产者 / 消费者)会通过此地址连接 Kafka。
    • PLAINTEXT 表示无加密的通信协议(生产环境需要 SSL 等加密协议)。
    • 192.168.11.51 是宿主机的 IP 地址(Kafka 容器所在服务器的 IP)。
    • 端口 19092/19093/19094 对应宿主机映射的端口(与 -p 参数的宿主机端口一致)。
    • 若此配置错误,客户端会无法连接 Kafka。
  4. KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092

    • 指定 Kafka 在容器内监听的地址和端口,用于接收客户端的连接请求。
    • 0.0.0.0 表示监听容器内所有可用的网络接口(允许来自任意 IP 的连接)。
    • 9092 是容器内的端口(与 -p 参数的容器内端口一致)

1.4 命令使用

zookeeper

cd /opt/zookeeper-3.4.13/bin/
./zkCli.sh -server 127.0.0.1:2181
./zkCli.sh -server 192.168.11.51:12181
##在 zookeeper容器中使用 

通过 zkCli.sh 脚本(Zookeeper Command Line interface)连接到指定的 Zookeeper 服务,进入交互式命令行环境,从而可以执行各种 Zookeeper 操作

kafka

cd /opt/kafka/bin/
./kafka-topics.sh --zookeeper 192.168.11.50:12181 --create --topic wezzer --replication-factor 1 --partitions 3

 Kafka 集群中生成一个名为 wezzer 的主题,其特性如下:

  1. 数据被拆分为 3 个分区,可分散存储在集群的不同 Broker 上(若集群有多个节点)。
  2. 每个分区只有 1 个副本,仅存于 1 个 Broker 中(无冗余,适合测试环境;生产环境建议设为 2~3)。
  3. 主题的元数据(分区数、副本分布、名称等)会被写入 192.168.10.51:12181 对应的 Zookeeper 服务中

每个kafka集群都会生成

结果分析 

Topic: wezzer   TopicId: 72plbBfsTfC-ngF9fvBnLA PartitionCount: 3       ReplicationFactor: 1    Configs: 
  • Topic: wezzer:主题名称为 wezzer
  • TopicId: 72plbBfsTfC-ngF9fvBnLA:该主题在 Kafka 中的唯一标识符(由 Kafka 自动生成,用于内部管理)。
  • PartitionCount: 3:该主题被划分为 3 个分区(Partition),分区是 Kafka 实现并行读写、数据分片存储的核心单元。
  • ReplicationFactor: 1:每个分区的副本因子为 1,即每个分区只有 1 个副本(仅存于 1 个 Broker 节点上,生产环境一般会设为 2 或 3 以保证高可用,这里是测试环境)。
  • Configs::主题的配置项,这里没有显示具体配置(说明使用了 Kafka 默认的主题配置)
分区 0 的信息
Topic: wezzer   Partition: 0    Leader: 2       Replicas: 2     Isr: 2
  • Partition: 0:主题的第 0 个分区。
  • Leader: 2:该分区的 Leader 副本 所在的 Broker ID 为 2。Leader 副本是客户端(生产者 / 消费者)直接交互的副本,负责处理读写请求,并同步数据到其他副本(Follower)。
  • Replicas: 2:该分区的所有副本所在的 Broker ID 列表为 [2](因为副本因子为 1,所以只有 1 个副本)。
  • Isr: 2:该分区的 同步副本集(In-Sync Replicas) 为 [2]。ISR 中的副本是与 Leader 保持同步的副本,只有 ISR 中的副本才能在 Leader 故障时被选举为新的 Leader。这里只有 1 个副本且处于同步状态,符合副本因子为 1 的情况。
分区 1 的信息
Topic: wezzer   Partition: 1    Leader: 0       Replicas: 0     Isr: 0
  • Partition: 1:主题的第 1 个分区。
  • Leader: 0:该分区的 Leader 副本所在的 Broker ID 为 0。
  • Replicas: 0:该分区的所有副本所在的 Broker ID 列表为 [0]
  • Isr: 0:该分区的同步副本集为 [0],即 Broker 0 上的副本与 Leader(自身)保持同步。
分区 2 的信息
Topic: wezzer   Partition: 2    Leader: 1       Replicas: 1     Isr: 1
  • Partition: 2:主题的第 2 个分区。
  • Leader: 1:该分区的 Leader 副本所在的 Broker ID 为 1。
  • Replicas: 1:该分区的所有副本所在的 Broker ID 列表为 [1]
  • Isr: 1:该分区的同步副本集为 [1],即 Broker 1 上的副本与 Leader(自身)保持同步。
总结
  • 主题 wezzer 有 3 个分区,每个分区的副本因子为 1(无冗余,适合测试)。
  • 3 个分区的 Leader 分别分布在 Broker 2、Broker 0、Broker 1 上,实现了负载均衡(Kafka 会尽量将不同分区的 Leader 分散到不同 Broker,提升集群吞吐量)。
  • 所有分区的 ISR 都包含自身(因为只有 1 个副本),说明副本同步状态正常。

写入数据  

./kafka-console-producer.sh --broker-list 192.168.10.51:19092,192.168.10.51:19093,192.168.10.51:19094 --topic wezzer

启动一个命令行生产者,用于向 Kafka 集群的 wezzer主题 发送消息

查询 

删除 topic

./kafka-topics.sh --zookeeper 192.168.11.51:12181 --delete --topic wezzer

现在只是被标记为删除marked for deletion并没有真正的删除,如果需要真正的删除,需要再config/server.properties中设置delete.topic.enable=true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值