Kafka

Kafka是消息中间件,是一种常见的服务器架构,常用在生产者消费者模式

kafka作用:

业务解耦:让各个业务之间独立部署,不受互相的影响

流量削峰:减轻服务器的压力,将消息存入中间件中,待服务器有能力了再来处理

日志收集:通过filebeat将日志放入kafka中,方便后续进行日志分析

安装

服务器系统:rockylinux9.6

服务器初始化

配置静态IP

修改/etc/NetworkManager/system-connections/ens33/nmconnection

bash 复制代码
[ipv4]
address1=<IP地址>/<子网掩码>
dns=<DNS1服务器地址>;<DNS2服务器地址>;
gateway=<默认网关>
method=manual

修改后可能需要重启才能生效

配置主机名

bash 复制代码
hostnamectl set-hostname kafka1

配置主机IP映射

修改/etc/hosts

bash 复制代码
192.168.20.161  kafka1
192.168.20.162  kafka2
192.168.20.163  kafka3

关闭防火墙与selinux

bash 复制代码
systemctl stop firewalld
systemctl enable firewalld

#临时关闭selinux
setenforce 0
#永久关闭
vim /etc/selinux/config 
修改    selinux=disabled

安装基础依赖

bash 复制代码
yum install epel-release -y
yum install wget vim java-11-openjdk.x86_64  -y

安装kafka

下载

bash 复制代码
cd /opt
wget https://archive.apache.org/dist/kafka/3.6.1/kafka_2.13-3.6.1.tgz

解压缩

bash 复制代码
tar xf kafka_2.13-3.6.1.tgz
cd kafka_2.13-3.6.1

修改配置文件,本次使用kraft部署,文件位置config/kraft/server.properties

bash 复制代码
#修改节点id,每个节点唯一
node.id=1

#修改控制器投票列表
controller.quorum.voters=1@192.168.223.161:9093,2@192.168.223.162:9093,3@192.168.223.163:9093

#修改监听器和控制器,绑定ip。其中kafka1为主机名,可用本机ip地址代替
listeners=PLAINTEXT://kafka1:9092,CONTROLLER://kafka1:9093

# 侦听器名称、主机名和代理将向客户端公布的端口.(broker 对外暴露的地址)
# 如果未设置,则使用"listeners"的值.
advertised.listeners=PLAINTEXT://kafka1:9092

如果配置文件里面使用了主机名作为配置,那么在后面的filebeat节点也需要在hosts文件内添加ip与主机名的映射

配置文件详解

bash 复制代码
############################# Server Basics #############################

# 此服务器的角色。设置此项将进入KRaft模式(controller 相当于主机、broker 节点相当于从机,主机类似 zk 功能)
process.roles=broker,controller

# 节点 ID
node.id=2

# 全 Controller 列表
controller.quorum.voters=2@192.168.58.130:9093,3@192.168.58.131:9093,4@192.168.58.132:9093

############################# Socket Server Settings #############################

# 套接字服务器侦听的地址.
# 组合节点(即具有`process.roles=broker,controller`的节点)必须至少在此处列出控制器侦听器
# 如果没有定义代理侦听器,那么默认侦听器将使用一个等于java.net.InetAddress.getCanonicalHostName()值的主机名,
# 带有PLAINTEXT侦听器名称和端口9092
#   FORMAT:
#     listeners = listener_name://host_name:port
#   EXAMPLE:
#     listeners = PLAINTEXT://your.host.name:9092
#不同服务器绑定的端口
listeners=PLAINTEXT://192.168.58.130:9092,CONTROLLER://192.168.58.130:9093

# 用于代理之间通信的侦听器的名称(broker 服务协议别名)
inter.broker.listener.name=PLAINTEXT

# 侦听器名称、主机名和代理将向客户端公布的端口.(broker 对外暴露的地址)
# 如果未设置,则使用"listeners"的值.
advertised.listeners=PLAINTEXT://192.168.58.130:9092

# controller 服务协议别名
# 控制器使用的侦听器名称的逗号分隔列表
# 如果`listener.security.protocol.map`中未设置显式映射,则默认使用PLAINTEXT协议
# 如果在KRaft模式下运行,这是必需的。
controller.listener.names=CONTROLLER

# 将侦听器名称映射到安全协议,默认情况下它们是相同的。(协议别名到安全协议的映射)有关更多详细信息,请参阅配置文档.
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL

# 服务器用于从网络接收请求并向网络发送响应的线程数
num.network.threads=3

# 服务器用于处理请求的线程数,其中可能包括磁盘I/O
num.io.threads=8

# 套接字服务器使用的发送缓冲区(SO_SNDBUF)
socket.send.buffer.bytes=102400

# 套接字服务器使用的接收缓冲区(SO_RCVBUF)
socket.receive.buffer.bytes=102400

# 套接字服务器将接受的请求的最大大小(防止OOM)
socket.request.max.bytes=104857600


############################# Log Basics #############################

# 存储日志文件的目录的逗号分隔列表(kafka 数据存储目录)
log.dirs=/usr/kafka/kafka_2.13-3.6.1/datas

# 每个主题的默认日志分区数。更多的分区允许更大的并行性以供使用,但这也会导致代理之间有更多的文件。
num.partitions=1

# 启动时用于日志恢复和关闭时用于刷新的每个数据目录的线程数。
# 对于数据目录位于RAID阵列中的安装,建议增加此值。
num.recovery.threads.per.data.dir=1

############################# Internal Topic Settings  #############################
# 组元数据内部主题"__consumer_offsets"和"__transaction_state"的复制因子
# 对于除开发测试以外的任何测试,建议使用大于1的值来确保可用性,例如3.
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1

############################# Log Flush Policy #############################

# 消息会立即写入文件系统,但默认情况下,我们只使用fsync()进行同步
# 操作系统缓存延迟。以下配置控制将数据刷新到磁盘.
# 这里有一些重要的权衡:
#    1. Durability(持久性): 如果不使用复制,未清理的数据可能会丢失
#    2. Latency(延迟): 当刷新发生时,非常大的刷新间隔可能会导致延迟峰值,因为将有大量数据要刷新.
#    3. Throughput(吞吐量): 刷新通常是最昂贵的操作,较小的刷新间隔可能导致过多的寻道.
# 下面的设置允许配置刷新策略,以便在一段时间后或每N条消息(或两者兼有)刷新数据。这可以全局完成,并在每个主题的基础上覆盖

# 强制将数据刷新到磁盘之前要接受的消息数
#log.flush.interval.messages=10000

# 在我们强制刷新之前,消息可以在日志中停留的最长时间
#log.flush.interval.ms=1000

############################# Log Retention Policy #############################

# 以下配置控制日志段的处理。可以将该策略设置为在一段时间后删除分段,或者在累积了给定大小之后删除分段。
# 只要满足这些条件中的任意一个,segment就会被删除。删除总是从日志的末尾开始

# 日志文件因使用年限而有资格删除的最短使用年限
log.retention.hours=168

# 基于大小的日志保留策略。除非剩余的段低于log.retention.bytes,否则将从日志中删除段。独立于log.retention.hours的函数。
#log.retention.bytes=1073741824

# 日志segment文件的最大大小。当达到此大小时,将创建一个新的日志segment
log.segment.bytes=1073741824

# 检查日志segments以查看是否可以根据保留策略删除它们的间隔
log.retention.check.interval.ms=300000

创建集群

bash 复制代码
cd   /opt/kafka_2.13-3.6.1
# 在其中一台执行,生成集群UUID命令,拿到集群UUID保存在当前tmp_random文件中
bin/kafka-storage.sh random-uuid >tmp_random
# 查看uuid
 [root@chainmaker1 kafka_2.13-3.6.1]# cat tmp_random
z3oq9M4IQguOBm2rt1ovmQ

# 在所有机器上执行,它会初始化存储区域,为 Kafka 集群的元数据存储和后续操作做好准备。z3oq9M4IQguOBm2rt1ovmQ为自己生成的集群uuid

bin/kafka-storage.sh format -t z3oq9M4IQguOBm2rt1ovmQ -c /opt/kafka_2.13-3.6.1/config/kraft/server.properties

添加service文件,使用systemd管理

创建文件/usr/lib/systemd/system/kafka.service

bash 复制代码
[Unit]
Description=Apache Kafka server (KRaft mode)
Documentation=http://kafka.apache.org/documentation.html
After=network.target
[Service]
Type=forking
User=root
Group=root
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64/bin/"
ExecStart=/opt/kafka_2.13-3.6.1/bin/kafka-server-start.sh -daemon /opt/kafka_2.13-3.6.1/config/kraft/server.properties
ExecStop=/opt/kafka_2.13-3.6.1/bin/kafka-server-stop.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target

重新加载systemd

bash 复制代码
systemctl daemon-reload

启动kafka

bash 复制代码
systemctl start kafka

开机启动kafka

bash 复制代码
systemctl enable kafka

关闭kafka

bash 复制代码
systemctl stop kafka

测试集群

创建topic

bash 复制代码
bin/kafka-topics.sh --create --bootstrap-server kafka3:9092 --replication-factor 3 --partitions 3 --topic my_topic

#--replication-factor指定副本因子,--partitions指定分区数,--topic指定主题名称。

查看topic

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

创建生产者,发送消息,在命令行输入即可发送

bash 复制代码
bin/kafka-console-producer.sh --broker-list kafka3:9092 --topic my_topic

另开窗口,创建消费者,消费消息

bash 复制代码
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic my_topic --from-beginning

安装filebeat

如果配置文件里面使用了主机名作为配置,那么在后面的filebeat节点也需要在hosts文件内添加ip与主机名的映射,这样当filebeat访问kafka集群的时候,kafka节点返回leader的主机名过来,filebeat才能知道leader的ip

bash 复制代码
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

上面的命令可能执行失败,这是因为机器不支持sha1哈希算法

bash 复制代码
sudo dnf install -y crypto-policies-scripts
sudo update-crypto-policies --set DEFAULT:SHA1

编辑 vim /etc/yum.repos.d/fb.repo

bash 复制代码
[elastic-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

安装

bash 复制代码
yum  install  filebeat -y

修改配置文件/etc/filebeat/filebeat.yml,建议修改前先备份

bash 复制代码
filebeat.inputs:
- type: log
  # Change to true to enable this input configuration.
  enabled: true
  # Paths that should be crawled and fetched. Glob based paths.
  #filebeat会从下面的路径去读取日志
  paths:
    - /var/log/nginx/access.log 
    - /var/log/nginx/error.log
#==========------------------------------kafka-----------------------------------
#设定吐日志的地方
output.kafka:
  hosts: ["192.168.52.134:9092","192.168.52.135:9092","192.168.52.136:9092"]
  #设置吐到这个topic
  topic: nginxlog
  keep_alive: 10s

创建topic

bash 复制代码
/opt/kafka_2.13-3.6.1/bin/kafka-topics.sh --create --bootstrap-server  kafka3:9092 --replication-factor 3 --partitions 3 --topic nginxlog

启动服务

bash 复制代码
systemctl start  filebeat
systemctl enable filebeat  #设置开机自启

启动服务后我们可以创建一个消费者看看能否收集到日志

bash 复制代码
bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic nginxlog --from-beginning
相关推荐
回家路上绕了弯4 小时前
外卖员重复抢单?从技术到运营的全链路解决方案
分布式·后端
忍冬行者5 小时前
Kafka 概念与部署手册
分布式·kafka
深蓝电商API5 小时前
爬虫+Redis:如何实现分布式去重与任务队列?
redis·分布式·爬虫·python
在未来等你6 小时前
Elasticsearch面试精讲 Day 28:版本升级与滚动重启
大数据·分布式·elasticsearch·搜索引擎·面试
AAA小肥杨13 小时前
基于k8s的Python的分布式深度学习训练平台搭建简单实践
人工智能·分布式·python·ai·kubernetes·gpu
爬山算法15 小时前
Redis(73)如何处理Redis分布式锁的死锁问题?
数据库·redis·分布式
yumgpkpm17 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 、mysql数据库汇聚到Cloudera CDP7.3操作指南
大数据·数据库·mysql·华为·oracle·kafka·cloudera
祈祷苍天赐我java之术17 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
猫林老师20 小时前
HarmonyOS线程模型与性能优化实战
数据库·分布式·harmonyos
阿里云云原生21 小时前
AI 时代的数据通道:云消息队列 Kafka 的演进与实践
云原生·kafka