OpenEuler部署Kafka分布式集群

1. Kafka概述

1.1 定义

Kafka传统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。

发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只接收感兴趣的消息。

Kafka最新定义:Kafka是一个开源的分布式事件流平台(Event Streaming Platform),被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。

在这里插入图片描述

1.2 消息队列

目前企业中比较常见的消息队列产品主要有Kafka、ActiveMQ、RabbitMQ、RocketMQ等。

在大数据场景主要采用Kafka作为消息队列。在JavaEE开发中主要采用ActiveMQ、RabbitMQ、RocketMQ。

1.2.1 传统消息队列的应用场景:

传统的消息队列的主要应用场景包括:缓存/消峰、解耦和异步通信。

缓冲/消峰:

缓冲/消峰:有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。

在这里插入图片描述

解耦

解耦:允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

在这里插入图片描述

异步通信

异步通信:允许用户把一个消息放入队列,但并不立即处理它,然后在需要的时候再去处理它们。

在这里插入图片描述

1.2.2 消息队列的两种模式

1)点对点模式

消费者主动拉取数据,消息收到后清除消息

在这里插入图片描述

2)发布/订阅模式

  • 可以有多个topic主题(如浏览、点赞、收藏、评论等)
  • 消费者消费数据之后,不删除数据
  • 每个消费者相互独立,都可以消费到数据

在这里插入图片描述

1.3 Kafka基础架构

在这里插入图片描述

Producer : 消息生产者,就是向Kafka broker发消息的客户端。

Consumer :消息消费者,向Kafka broker取消息的客户端。

Consumer Group(CG) : 消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者

Broker: 一台Kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。

Topic: 可以理解为一个队列,生产者和消费者面向的都是一个topic

Partition: 为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。

Replica: 副本。一个topic的每个分区都有若干个副本,一个Leader和若干个Follower

Leader: 每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是Leader。

Follower: 每个分区多个副本中的“从”,实时从Leader中同步数据,保持和Leader数据的同步。Leader发生故障时,某个Follower会成为新的Leader。

2. Kafka部署和基本操作

2.1 安装部署

集群规划

node1(10.90.100.101)node2(10.90.100.102)node3(10.90.100.103)
zkzkzk
kafkakafkakafka
2.1.1 集群部署
  1. 官方下载地址:http://kafka.apache.org/downloads.html

这里以kafka 3.3.1为例。

https://archive.apache.org/dist/kafka/3.3.1/kafka_2.13-3.3.1.tgz

  1. 把下载好的安装包上传到node1上

  2. 解压安装包

[hadoop@node1 ~]$ ls
kafka_2.13-3.3.1.tgz
#解压安装包到/opt/software/目录下
[hadoop@node1 ~]$ tar -zxvf kafka_2.13-3.3.1.tgz -C /opt/software/
[hadoop@node1 ~]$ ls /opt/software/
kafka_2.13-3.3.1  
  1. 给解压后的文件创建软链接
[hadoop@node1 ~]$ cd /opt/software/
[hadoop@node1 software]$ ls
kafka_2.13-3.3.1
[hadoop@node1 software]$ ln -s /opt/software/kafka_2.13-3.3.1  kafka
  1. 进入到/opt/software/kafka目录,修改配置文件
[hadoop@node1 software]$ cd kafka
[hadoop@node1 kafka]$ cd config/
[hadoop@node1 config]$ ls
connect-console-sink.properties    connect-file-source.properties   consumer.properties  server.properties
connect-console-source.properties  connect-log4j.properties         kraft                tools-log4j.properties
connect-distributed.properties     connect-mirror-maker.properties  log4j.properties     trogdor.conf
connect-file-sink.properties       connect-standalone.properties    producer.properties  zookeeper.properties
[hadoop@node1 config]$ vim server.properties 

配置文件修改后的内容如下:

#broker的全局唯一编号,不能重复,只能是数字。
broker.id=0

#broker对外暴露的IP和端口 (每个节点单独配置)
advertised.listeners=PLAINTEXT://node1:9092
#处理网络请求的线程数量
num.network.threads=3
#用来处理磁盘IO的线程数量
num.io.threads=8
#发送套接字的缓冲区大小
socket.send.buffer.bytes=102400
#接收套接字的缓冲区大小
socket.receive.buffer.bytes=102400
#请求套接字的缓冲区大小
socket.request.max.bytes=104857600
#kafka运行日志(数据)存放的路径,路径不需要提前创建,kafka自动帮你创建,可以配置多个磁盘路径,路径与路径之间可以用","分隔
log.dirs=/opt/software/kafka/datas
#topic在当前broker上的分区个数
num.partitions=1
#用来恢复和清理data下数据的线程数量
num.recovery.threads.per.data.dir=1
# 每个topic创建时的副本数,默认时1个副本
offsets.topic.replication.factor=1
#segment文件保留的最长时间,超时将被删除
log.retention.hours=168
#每个segment文件的大小,默认最大1G
log.segment.bytes=1073741824
# 检查过期数据的时间,默认5分钟检查一次是否数据过期
log.retention.check.interval.ms=300000
#配置连接Zookeeper集群地址(在zk根目录下创建/kafka,方便管理)
zookeeper.connect=node1:2181,node2:2181,node3:2181/kafka
  1. 分发安装包

复制配置好的安装包到另外的两个节点

[hadoop@node1 config]$ cd /opt/software/
[hadoop@node1 software]$  scp -r kafka node2:/opt/software/
[hadoop@node1 software]$  scp -r kafka node3:/opt/software/
  1. 分别在node2和node3上修改配置文件/opt/software/kafka/config/server.properties中的broker.id=1broker.id=2

broker.id不得重复,整个集群中唯一。

node2:

[hadoop@node2 ~]$ vim /opt/software/kafka/config/server.properties

修改内容如下

#修改:

# The id of the broker. This must be set to a unique integer for each broker.
broker.id=1
#broker对外暴露的IP和端口 (每个节点单独配置)
advertised.listeners=PLAINTEXT://node2:9092

node3:

[hadoop@node3 ~]$ vim /opt/software/kafka/config/server.properties

修改内容如下

#修改:

# The id of the broker. This must be set to a unique integer for each broker.
broker.id=2
#broker对外暴露的IP和端口 (每个节点单独配置)
advertised.listeners=PLAINTEXT://node3:9092
  1. 配置环境变量

/etc/profile文件中增加kafka环境变量配置

[hadoop@node1 ~]$ sudo vim /etc/profile

文件末尾增加如下内容:

export KAFKA_HOME=/opt/software/kafka
export PATH=$KAFKA_HOME/bin:$PATH

刷新一下环境变量。

[hadoop@node1 ~]$ source /etc/profile

同样的在node2node3主机都执行以上配置环境变量的操作。

  1. 启动集群

注意: 必须先启动ZooKeeper集群后再启动Kafka

依次在集群的node1node2node3节点上启动Kafka

#node1
[hadoop@node1 ~]$ kafka-server-start.sh -daemon /opt/software/kafka/config/server.properties

#node2
[hadoop@node2 ~]$ kafka-server-start.sh -daemon /opt/software/kafka/config/server.properties

#node3
[hadoop@node3 ~]$ kafka-server-start.sh -daemon /opt/software/kafka/config/server.properties

提示

下openEuler24.03版本中启动Kafka会告警提示egrep: warning: egrep is obsolescent; using grep -E 。如果需要去掉这个告警提示,可以将Kafka 启动脚本中所有调用egrep的位置,将其替换为 grep -E。解决方式如下:

找到 Kafka 安装目录/opt/software/kafka,进入该目录下的bin目录,修改kafka-run-class.sh脚本的41行,将egrep替换为grep -E

# 原命令
if [ -z "$(echo "$file" | egrep "$regex")" ] ; then
# 修改后的命令
if [ -z "$(echo "$file" | grep -E " $regex")" ] ; then

通过jps命令查看进程

[hadoop@node1 ~]$ jps
1926 QuorumPeerMain
2279 Kafka
2367 Jps

10.关闭集群

[hadoop@node1 ~]$  kafka-server-stop.sh 
[hadoop@node2 ~]$  kafka-server-stop.sh 
[hadoop@node3 ~]$  kafka-server-stop.sh 
2.1.2 集群启停脚本

为了方便管理,这里写了一个脚本来启停集群

[hadoop@node1 ~]$ cd ~/bin
[hadoop@node1 bin]$  vim kf.sh

脚本内容如下:

#! /bin/bash
# 集群节点的名称,这里替换成自己的
BROKERS="node1 node2 node3"

case $1 in
"start"){
    for node in $BROKERS
    do
        echo " --------启动 $node Kafka-------"
        ssh $node "source /etc/profile; kafka-server-start.sh -daemon /opt/software/kafka/config/server.properties"
        echo "$node kafka is starting"
    done
};;
"stop"){
    for node in $BROKERS
    do
        echo " --------停止 $node Kafka-------"
        ssh $node "source /etc/profile; kafka-server-stop.sh"
        echo "$node kafka is stopping"
    done
};;
"jps"){
    for node in $BROKERS
    do
        echo " --------启动 $node Kafka-------"
        ssh $node "source /etc/profile; /opt/software/jdk/bin/jps"
    done
};;
esac

添加执行权限:

[hadoop@node1 bin]$ chmod +x ~/bin/kf.sh

启动集群命令

[root@node1 ~]# kf.sh start

停止集群命令

[root@node1 ~]# kf.sh stop

注意:

停止Kafka集群时,一定要等Kafka所有节点进程全部停止后再停止ZooKeeper集群。因为ZooKeeper集群当中记录着Kafka集群相关信息,ZooKeeper集群一旦先停止,Kafka集群就没有办法再获取停止进程的信息,只能手动杀死Kafka进程了。

2.2 Kafka命令行操作

2.2.1 主题命令行操作

1.查看操作主题命令参数

[root@node1 kafka]# kafka-topics.sh

在这里插入图片描述

2.查看当前服务器中的所有topic

[hadoop@node1 ~]$  kafka-topics.sh --bootstrap-server node1:9092 --list

3.创建first topic

[hadoop@node1 ~]$  kafka-topics.sh --bootstrap-server node1:9092 --create --partitions 1 --replication-factor 3 --topic first

选项说明:

--topic 定义topic名

--replication-factor 定义副本数

--partitions 定义分区数

4.查看first主题的详情

[hadoop@node1 ~]$  kafka-topics.sh --bootstrap-server node1:9092 --describe --topic first

5.修改分区数(注意:分区数只能增加,不能减少)

[hadoop@node1 ~]$  kafka-topics.sh --bootstrap-server node1:9092 --alter --topic first --partitions 3

6.再次查看first主题的详情

[hadoop@node1 ~]$   kafka-topics.sh --bootstrap-server node1:9092 --describe --topic first

7.删除topic(可以进行演示)

[hadoop@node1 ~]$   kafka-topics.sh --bootstrap-server node1:9092 --delete --topic first
2.2.2 生产者命令行操作

1.查看操作生产者命令参数

[hadoop@node1 ~]$   kafka-console-producer.sh

在这里插入图片描述

2.发送消息

[hadoop@node1 ~]$   kafka-console-producer.sh --bootstrap-server node1:9092 --topic first
>hello world
>haha  haha
2.2.3 消费者命令行操作

1.查看操作消费者命令参数

[hadoop@node1 ~]$  kafka-console-consumer.sh

在这里插入图片描述

2.消费消息

消费first主题中的数据

[hadoop@node1 ~]$  kafka-console-consumer.sh --bootstrap-server node1:9092 --topic first

把主题中所有的数据都读取出来(包括历史数据)。

[hadoop@node1 ~]$  kafka-console-consumer.sh --bootstrap-server node1:9092 --from-beginning --topic first
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值