消息队列之Kafka(一)搭建服务

一、安装与启动

kafka:kafka_2.13-3.9.1.tgz

zookeeper:apache-zookeeper-3.9.4-bin.tar.gz

bash 复制代码
#解压
tar -zxvf kafka_2.13-3.9.1.tgz 


#安装JDK
yum install -y java-1.8.0-openjdk-devel

# 查看 Java 版本(确认输出为 1.8.x)
java -version

#编辑 /etc/profile 文件,确保环境变量指向 JDK 1.8:
vi /etc/profile

#在文件末尾添加以下内容
# JDK 1.8 环境变量
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 检查 JAVA_HOME 是否正确
echo $JAVA_HOME
# 输出应是 /usr/lib/jvm/java-1.8.0-openjdk

# 进入 Kafka 目录
cd /root/kafka_2.13-3.9.1
#启动Zookeeper
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
#启动kafka
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &

jps
#输出
1838060 Kafka
1839361 Jps
1833173 QuorumPeerMain

二、常用命令

1.服务运维命令

1.1启动/停止Zookeeper

bash 复制代码
# 启动
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
# 停止
bin/zookeeper-server-stop.sh config/zookeeper.properties

1.2 启动 / 停止 Kafka

bash 复制代码
# 启动
nohup bin/kafka-server-start.sh config/server.properties &
# 停止
bin/kafka-server-stop.sh config/server.properties

2.主题管理命令

2.1创建主题

bash 复制代码
bin/kafka-topics.sh \
  --create \
  --topic test_topic \
  --partitions 3 \
  --replication-factor 1 \
  --bootstrap-server localhost:9092
参数 含义 取值说明
--create 命令动作 固定值,标识「创建主题」
--topic 指定主题名 自定义字符串(如 test_topic、user_log),不能含特殊字符
--partitions 主题分区数 正整数(如 1/3/5),单节点建议 1-3,多节点根据并发调整;分区数只能增不能减
--replication-factor 副本数 正整数,≤ Kafka 节点数(单节点只能设 1,多节点可设 2+,如 3 节点设 2)
--bootstrap-server Kafka 服务地址 格式:IP:端口(默认 localhost:9092),指定连接的 Kafka 节点

2.2 查看所有主题

bash 复制代码
bin/kafka-topics.sh --list --bootstrap-server localhost:9092

2.3 查看指定主题详情

bash 复制代码
bin/kafka-topics.sh --describe --topic test_topic --bootstrap-server localhost:9092
参数 含义 取值说明
--describe 命令动作 固定值,标识「查看主题详情」
--topic 指定要查看的主题 已存在的主题名(如 test_topic)
--bootstrap-server Kafka 服务地址 同前

2.4修改主题(调整分区数)

bash 复制代码
bin/kafka-topics.sh --alter --topic test_topic --partitions 5 --bootstrap-server localhost:9092
参数 含义 取值说明
--alter 命令动作 固定值,标识「修改主题配置」
--topic 要修改的主题 已存在的主题名
--partitions 新的分区数 必须大于当前分区数(如原 3→5,不能 3→2)
--bootstrap-server Kafka 服务地址 同前

2.5删除主题

bash 复制代码
bin/kafka-topics.sh --delete --topic test_topic --bootstrap-server localhost:9092

3.消息生产 / 消费命令

3.1生产者(发送消息)

bash 复制代码
bin/kafka-console-producer.sh --topic test_topic --bootstrap-server localhost:9092
参数 含义 取值说明
--topic 要发送消息的主题 已存在的主题名
--bootstrap-server Kafka 服务地址 同前
(可选)--producer-property 生产者配置 acks=1(确认机制)、retries=3(重试次数),格式:--producer-property acks=1

3.2消费者(接收消息)

bash 复制代码
bin/kafka-console-consumer.sh --topic test_topic --from-beginning --group test_group --bootstrap-server localhost:9092
参数 含义 取值说明
--topic 要消费的主题 已存在的主题名
--from-beginning 消费起始位置 无取值,加此参数表示「从头消费所有历史消息」;不加则只消费启动后新增的消息
--group 消费者组名 自定义字符串(如 test_group),同一组内的消费者会分摊消费分区,不同组互不影响
--bootstrap-server Kafka 服务地址 同前
(可选)--max-messages 消费最大条数 正整数(如 10),消费指定条数后自动退出,示例:--max-messages 10

4.消费者组管理

4.1查看所有消费者组

bash 复制代码
bin/kafka-consumer-groups.sh --list --bootstrap-server localhost:9092

4.2查看消费者组详情(消费偏移量)

bash 复制代码
bin/kafka-consumer-groups.sh --describe --group test_group --bootstrap-server localhost:9092
参数 含义 取值说明
--describe 命令动作 固定值,标识「查看消费者组详情」
--group 指定消费者组 已存在的消费者组名(如 test_group)
--bootstrap-server Kafka 服务地址 同前
(可选)--topic 只查看指定主题的消费情况 已存在的主题名,示例:--topic test_topic

4.3重置消费者组偏移量

bash 复制代码
bin/kafka-consumer-groups.sh \
  --reset-offsets \
  --to-earliest \
  --topic test_topic \
  --group test_group \
  --execute \
  --bootstrap-server localhost:9092
参数 含义 取值说明
--reset-offsets 命令动作 固定值,标识「重置偏移量」
--to-earliest 重置目标位置 固定值,重置到「最开始的偏移量」(从头消费);可选值:• --to-latest:重置到最新偏移量(只消费新消息)• --to-offset N:重置到指定偏移量(N 为正整数,如 10)• --shift-by N:偏移量增减(N 为整数,如 +5/-3)
--topic 要重置的主题 已存在的主题名,支持通配符(如 --topic 'test*'
--group 要重置的消费者组 已存在的消费者组名
--execute 执行重置 无取值,加此参数才会真正执行重置;不加则只预览效果(建议先预览再执行)
--bootstrap-server Kafka 服务地址 同前

三、集群搭建

1.为什么要用集群

单机服务下,Kafka已经具备了非常高的性能。TPS能够达到百万级别。但是,在实际工作中使用时,单机搭建的Kafka会有很大的局限性。

一方面:消息太多,需要分开保存。 Kaka是面向海量消息设计的,一个Topic下的消息会非常多,单机服务很难存得下来。这些消息就需要分成不同的Pariion,分布到多个不同的 Broker上。这样每个Broker就只需要保存一部分数据。这些分区的个数就称为分区数。

另一方面:服务不稳定,数据容易丢失。 单机服务下,如果服务崩溃,数据就丢失了。为了保证数据安全,就需要给每个Pariion配置一个或多个备份,保证数据不丢失。Kafka的集群模式下,每个Pariion都有一个或多个备份。Kaka会通过一个统一的zookeeper集群作为选举中心 ,给每个Paniion选举出一个主节点Leader,其他节点就是从节点Folower。主节点负责响应客户端的具体业务请求,并保存消息。而从节点则负责同步主节点的数据。当主节点发生故障时,Kafka会选举出一个从节点成为新的主节点。 最后:Kafka集群中的这些Broker信息,包括Partiton的选举信息,都会保存在额外部署的Zookeper集群当中,这样,kaka集群就不会因为某一些Broker服务崩溃而中断。

Kafka也提供了另外一种不需要Zookeeper的集群机制,Kraft集群。这种方式会在后面进行介绍。

2.集群搭建

2.1准备三台云服务器

三台都要下载jdk和zookeeper

2.2搭建zookeeper集群

bash 复制代码
#解压zookeeper
tar -zxvf apache-zookeeper-3.9.4-bin.tar.gz

mv apache-zookeeper-3.9.4-bin/* /root/app/zookeeper

#修改配置文件
cd conf/

cp zoo_sample.cfg zoo.cfg
vi zoo.cfg

#修改如下

dataDir=/root/app/zookeeper/data

#一个集群内部端口,一个集群外部端口
server.1=ip1:2888:3888
server.2=ip2:2888:3888
server.3=ip3:2888:3888


#创建对应的data文件夹

cd data/
#一个名为 myid 的文件,文件里只有一行内容:数字 1。
#Zookeeper 集群里的每个节点需要一个唯一的 ID(1~255 之间的整数),myid 文件就是用来存储这个 ID 的,Zookeeper 启动时会读取该文件的数字,识别自己是集群中的第几个节点。
echo 1 > myid

#将配置传到其他节点
scp -r apache-zookeeper-3.9.4-bin/ root@ip2:apache-zookeeper-3.9.4-bin
scp -r apache-zookeeper-3.9.4-bin/ root@ip3:apache-zookeeper-3.9.4-bin

#在其他节点配置myid
cd data/
echo 2 > myid
echo 3 > myid

#在三台服务器启动zookeeper集群
#首先要把之前单节点的zookeeper和kafka删除
cd apache-zookeeper-3.9.4-bin
bin/zkServer.sh --config conf start

2.3搭建kafka集群

进入config目录,修改server.properties。

java 复制代码
#broker 的全局唯一编号,不能重复,只能是数字。


broker.id=1

#服务监听地址:listeners=PLAINTEXT://hostname:9092

客户端通过这个连接kafka
listeners=PLAINTEXT://worker1:9092


#数据文件地址。同样默认是给的/tmp目录。


log.dirs=/app/kafka/logs


#默认的每个Topic的分区数


num.partitions=1


#Kafka 连接的 Zookeeper 集群地址


zookeeper.connect=worker1:2181,worker2:2181,worker3:2181


#可以选择指定zookeeper上的基础节点。

#zookeeper.connect=worker1:2181,worker2:2181,worker3:2181/kafka


将kafka的文件夹传递给其他节点

bash 复制代码
scp -r kafka_2.13-3.9.1/ root@ip2:/root/app/kafka

scp -r kafka_2.13-3.9.1/ root@ip3:/root/app/kafka

进入剩下两个的config目录,修改server.properties。

启动kafka,后台启动

bash 复制代码
nohup bin/kafka-server-start.sh -daemon config/server.properties &

2.4验证生产者消费者

1、Kaika设计需要支持海量的数据,而这样庞大的数据量,一个broker是存不下的。那就拆分成多个Partition,每个Broker只存一部分数据。这样极大的扩展了集群的吞吐量。

2、每个Partiion保留了一部分的消息副本,如果放到一个roker上,就容易出现单点故障。所以就给每个Parition设计Folower节点,进行数据备份,从而保证数据安全。另外,多备份的 Partition设计也提高了读取消息时的并发度。

3、在同一个Topic的多个Partition中,会产生一个Partition作为Leader。这个Leader Partition会负责响应客户端的请求,并将数据往其他Parition分发。

相关推荐
鸡蛋豆腐仙子3 小时前
redis及实现分布式锁的原理
java·redis·分布式·学习·缓存
DemonAvenger3 小时前
Kafka高可用设计揭秘:副本机制与选举策略的实践之道
性能优化·kafka·消息队列
蒸蒸yyyyzwd3 小时前
分布式学习笔记 p5-13
笔记·分布式·学习
好家伙VCC4 小时前
**发散创新:用 Rust构建多智能体系统,让分布式协作更高效**在人工智能快速演进的今天,**多智能体系统(
java·人工智能·分布式·python·rust
C澒4 小时前
从单体到分布式:SLDS 2.0 全球物流履约网络架构演进之路
前端·分布式·架构·系统架构·教育电商·交通物流
Jack_David4 小时前
kafka_2.13-4.1.1集群安装
java·分布式·kafka
愿你天黑有灯下雨有伞4 小时前
Spring Boot 整合 Kafka:生产环境标准配置与最佳实践
java·kafka
jiuweiC6 小时前
kafka重平衡问题-golang
分布式·golang·kafka
你这个代码我看不懂13 小时前
@RefreshScope刷新Kafka实例
分布式·kafka·linq