kafka部署最佳实践

bash 复制代码
作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验
擅长主流数据Oracle、MySQL、PG、openGauss运维
备份恢复,安装迁移,性能优化、故障应急处理等

可提供技术业务:
1.DB故障处理/疑难杂症远程支援
2.Mysql/PG/Oracle/openGauss
数据库部署及数仓搭建

1.关于Kafka

Kafka 是一款高性能、高可靠性、可水平扩展的分布式消息队列系统,由 Apache 软件基金会开发和维护。它可以实现消息的异步处理和分布式计算,被广泛应用于大数据、实时数据流处理、监控报警等领域。 除了实现高效的分布式消息订阅之外,还提供数据实时流处理和数据存储功能。当然Kafka还可以将数据集成到大数据平台或者数据中台中.

arduino 复制代码
官方网址:https://kafka.apache.org/
下载二进制安装包即可:kafka_2.13-3.5.1.tgz

2.Kafka功能

makefile 复制代码
Kafka结合了三个关键功能:

发布(写)和订阅(读)事件流,包括从其他系统持续导入/导出数据。
给予需要可以持久、可靠地存储事件流。
在事件发生时或回顾时处理事件流。
所有这些功能都以分布式、高可伸缩性、弹性、容错和安全的方式提供

Kafka是如何运作的? Kafka是一个分布式系统,由服务器和客户端组成,通过高性能TCP网络协议进行通信
1)服务端:Kafka作为一个或多个服务器的集群运行,这些服务器可以跨越多个数据中心或云区域。其中一些服务器形成存储层,称为代理(brokers)。其他服务器运行Kafka Connect,以事件流的形式持续导入和导出数据,以将Kafka与现有系统(如关系数据库和其他Kafka集群)集成在一起。为了让你实现关键任务用例,Kafka集群具有高度的可伸缩性和容错性:如果其中任何一个服务器出现故障,其他服务器将接管它们的工作,以确保在没有任何数据丢失的情况下持续运行。
2)客户端:它们允许您编写分布式应用程序和微服务,这些应用程序和微服务可以并行地、大规模地读取、写入和处理事件流,并且即使在网络问题或机器故障的情况下也能以容错的方式进行。Kafka附带了一些这样的客户端,Kafka社区提供了几十个客户端:客户端可用于Java和Scala,包括更高级别的Kafka Streams库,用于Go、Python、C/ c++和许多其他编程语言以及REST API。
生产者(Producer):那些向Kafka发布(写入)事件的客户端应用程序 消费者(Consumer):那些订阅(读取和处理)这些事件的客户端应用程序。
在Kafka中,生产者和消费者彼此完全解耦且不可知,这是实现Kafka所熟知的高可伸缩性的关键设计元素。 例如,生产者从不需要等待消费者。Kafka提供了各种保证,比如能够精确地一次处理事件。
1)主题(Topic):用来标识事件被组织起来并持久地存储。主题类似于文件系统中的文件夹,事件就是文件夹中的文件。 Kafka中的主题总是多生产者和多订阅者:一个主题可以有0个、1个或多个写入事件的生产者,也可以有0个、1个或多个订阅这些事件的消费者。
2)分区(Partitioned):基于主题分布式布局的定义。一个主题分布在不同Kafka代理上的许多存储上。数据的这种分布式布局对于可伸缩性非常重要,因为它允许客户端应用程序同时从多个代理读取和向多个代理写入数据。具有相同事件键的事件被写入同一个分区,Kafka保证给定主题分区的任何消费者总是以与写入事件完全相同的顺序读取该分区的事件。
3)复制(Replicated):为保障数据的容错性和高可用性,每个主题可以跨地理区域或数据中心复制,以便总是有多个代理拥有数据的副本,以防出现问题。 常见的生产设置是复制因子(factor)为3,也就是说数据总是有三个副本。

3.环境要求

以下是 Kafka 安装的环境要求,需要满足这些要求才能顺利安装和使用 Kafka

3.1 Java 运行环境

bash 复制代码
Kafka 是使用 Java 语言编写的,因此需要在安装 Kafka 之前先安装 Java 运行环境,Kafka 支持Java8及以上版本。

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序

1.下载Linux环境下的jdk1.8
https://www.oracle.com/java/technologies/downloads/#java8

2.JDK压缩包解压
tar -zxvf jdk-8u391-linux-x64.tar.gz -C /usr/local

3.环境变量导入
vi /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_391
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}

##环境变量生效
source /etc/profile

##确认安装是否成功
java -version

[root@frontend01 ~]# java -version
java version "1.8.0_391"
Java(TM) SE Runtime Environment (build 1.8.0_391-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.391-b13, mixed mode)

3.2 硬件要求

yaml 复制代码
Kafka 可以在任何硬件上运行,但是在生产环境中,建议使用具有足够内存和处理器核心的计算机。
建议至少具备以下硬件配置:

内存:4GB 或以上。
处理器核心数:2 核或以上。
存储空间:100GB 或以上。

[root@centos79 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          17881        2326       13317         115        2238       15102
Swap:             0           0           0

[root@centos79 ~]# df -TH
Filesystem                Type      Size  Used Avail Use% Mounted on
devtmpfs                  devtmpfs  9.4G     0  9.4G   0% /dev
tmpfs                     tmpfs     9.4G     0  9.4G   0% /dev/shm
tmpfs                     tmpfs     9.4G   14M  9.4G   1% /run
tmpfs                     tmpfs     9.4G     0  9.4G   0% /sys/fs/cgroup
/dev/mapper/centos-root00 ext4      480G   91G  369G  20% /
/dev/sda1                 ext4      1.1G  163M  791M  18% /boot
/dev/mapper/centos-root   ext4       53G   55M   50G   1% /u01

[root@centos79 ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 158
Model name:            Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
Stepping:              13
CPU MHz:               2400.000
BogoMIPS:              4800.00
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              16384K

3.3 操作系统要求

sql 复制代码
Kafka 可以在多种操作系统上运行,包括 Linux、Windows 和 macOS。
建议在生产环境中使用 Linux 操作系统,例如 CentOS、Ubuntu 等.

[root@centos79 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

4.Kafka部署

kafka.apache.org/downloads

ini 复制代码
1.解压安装
mkdir -p /usr/local/kafka
tar -zxf /opt/kafka_2.13-3.5.1.tgz -C /usr/local/kafka

[root@centos79 ~]# ll /usr/local/kafka/kafka_2.13-3.5.1
total 64
drwxr-xr-x 3 root root  4096 Jul 15 00:53 bin
drwxr-xr-x 3 root root  4096 Jul 15 00:53 config
drwxr-xr-x 2 root root  4096 Nov  4 12:03 libs
-rw-rw-r-- 1 root root 14722 Jul 15 00:50 LICENSE
drwxr-xr-x 2 root root  4096 Jul 15 00:53 licenses
-rw-rw-r-- 1 root root 28184 Jul 15 00:50 NOTICE
drwxr-xr-x 2 root root  4096 Jul 15 00:53 site-docs

2.Kafka配置

[root@centos79 ~]# cd /usr/local/kafka/kafka_2.13-3.5.1


--默认zookeeper配置
[root@centos79 kafka_2.13-3.5.1]# grep -v ^# config/zookeeper.properties |sed '/^$/d'
dataDir=/tmp/zookeeper
clientPort=2181
maxClientCnxns=0
admin.enableServer=false

--默认服务端配置
[root@centos79 kafka_2.13-3.5.1]# grep -v ^# config/server.properties |sed '/^$/d'
broker.id=0
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.retention.check.interval.ms=300000
zookeeper.connect=localhost:2181
zookeeper.connection.timeout.ms=18000
group.initial.rebalance.delay.ms=0
You have new mail in /var/spool/mail/root


4.3 Kafka启动
[root@centos79 kafka_2.13-3.5.1]# ./bin/kafka-server-start.sh config/server.properties &

[root@centos79 kafka_2.13-3.5.1]# netstat -tna|grep -e 9092 -e 2181
tcp6       0      0 :::9092                 :::*                    LISTEN     
tcp6       0      0 :::2181                 :::*                    LISTEN     
tcp6       0      0 192.168.3.15:9092       192.168.3.15:52814      ESTABLISHED
tcp6       0      0 127.0.0.1:2181          127.0.0.1:44658         ESTABLISHED
tcp6       0      0 192.168.3.15:52814      192.168.3.15:9092       ESTABLISHED
tcp6       0      0 127.0.0.1:44658         127.0.0.1:2181          ESTABLISHED


注意:kafka自带了zookeeper组件,单节点kafka服务我们可以使用自带的zookeeper组件


##新建zookeeper日志的存储位置
mkdir -p /usr/local/kafka/kafka_2.13-3.5.1/zookeeper_log

##回到 kafka 的文件夹下,再次输入命令
cd /usr/local/kafka/kafka_2.13-3.5.1

vi config/zookeeper.properties

dataDir=/tmp/zookeeper
clientPort=2181
dataLogDir=/usr/local/kafka/kafka_2.13-3.5.1/zookeeper_log
server.1=localhost:2888:38888


说明:
dataDir 表示存储 ZooKeeper 数据的目录
clientPort 表示客户端连接 ZooKeeper 的端口号
dataLogDir:日志


至此,一个单机版的带ZooKeeper的Kafka已经运行起来了

5.测试kafka

bash 复制代码
zookeeper启动
/usr/local/kafka/kafka_2.13-3.5.1/bin/zookeeper-server-start.sh -daemon /usr/local/kafka/kafka_2.13-3.5.1/config/zookeeper.properties

kafka启动
/usr/local/kafka/kafka_2.13-3.5.1/bin/kafka-server-start.sh -daemon /usr/local/kafka/kafka_2.13-3.5.1/config/server.properties

#创建主题
cd /usr/local/kafka/kafka_2.13-3.5.1
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic topic --partitions 1
其中--partitions 参数指定分区数。在实际生产环境中,建议将副本数设置为 2 或 3,以提高可用性。

#查看主题
./bin/kafka-topics.sh --list --bootstrap-server localhost:9092

##发送消息
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic topic
>hello
>world

##接收消息
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic --from-beginning
hello
world

相关推荐阅读:
90天精通Oracle-实战系列
Oracle高可用实战系列
MySQL从入门到实战
如何成为SQL高手
PostgreSQL从入门到实战
大家可以点赞、收藏、关注、评论我啦 、有数据库相关的问题随时联系我或交流哟~!

相关推荐
hlsd#16 分钟前
go mod 依赖管理
开发语言·后端·golang
陈大爷(有低保)20 分钟前
三层架构和MVC以及它们的融合
后端·mvc
亦世凡华、20 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
河西石头21 分钟前
一步一步从asp.net core mvc中访问asp.net core WebApi
后端·asp.net·mvc·.net core访问api·httpclient的使用
2401_8574396933 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66634 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
阿华的代码王国1 小时前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
小码编匠1 小时前
领域驱动设计(DDD)要点及C#示例
后端·c#·领域驱动设计
Dreams°1231 小时前
大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
大数据·单元测试·可用性测试
sf_www2 小时前
Flink on YARN是如何确定TaskManager个数的
大数据·flink