一、环境准备

kafka官网:https://kafka.apache.org/

如果需要看kafka介绍之类,可以在本地址看,搭建就不用看他的了:

https://blog.csdn.net/wudidahuanggua/article/details/127086186

1.1 服务器准备

IP

hostname

配置

版本信息

192.168.12.91

zookeeper1

2核4G

kafka_2.12-3.5.0.tgz、jdk

192.168.12.90

zookeeper2

2核4G

kafka_2.12-3.5.0.tgz、jdk11

192.168.12.88

zookeeper3

2核4G

kafka_2.12-3.5.0.tgz、jdk11

1.2 基础环境初始化

# 3台服务器同样配置
# 版本信息
kafka_2.12-3.5.0.tgz
jdk-11.0.14_linux-x64_bin.tar.gz

# host配置
192.168.12.91   zookeeper1
192.168.12.90   zookeeper2
192.168.12.88   zookeeper3

# 安装
cd /usr/local/
tar -xz jdk-11.0.14_linux-x64_bin.tar.gz
ln -s jdk-11.0.14 jdk

tar -xzvf kafka_2.12-3.5.0.tgz
ln -s kafka_2.12-3.5.0 kafka

# 环境变量配置
echo "export KAFKA_HOME=/usr/local/kafka" >> /etc/profile
echo "export JAVA_HOME=/usr/local/jdk" >> /etc/profile
export PATH=$PATH:$KAFKA_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/lib

二、kafka集群配置

2.1 配置zookeeper

# https://blog.51cto.com/yangxiongchun/3771536 zookeeper安装与配置
# 新版的kafka集成zookeeper,所以不用单独下载安装

cd /usr/local/kafka/config
mkdir -p /data/logs/zookeeper/{data,logs}
echo 1 > /data/logs/zookeeper/data/myid

#修改配置文件
vim zookeeper.properties
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/logs/zookeeper/data
dataLogDir=/data/logs/zookeeper/logs
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
# Disable the adminserver by default to avoid port conflicts.
# Set the port to something non-conflicting if choosing to enable this
admin.enableServer=false
# admin.serverPort=8080
#autopurge.snapRetainCount=3
#autopurge.purgeInterval=1
server.1=192.168.12.91:2888:3888
server.2=192.168.12.90:2888:3888
server.3=192.168.12.88:2888:3888

2.2 kafka配置

cd /usr/local/kafka/config

vim server.properties
# 当前机器在集群中的唯一标识,和zookeeper的myid性质一样,每台机器设置不一样
broker.id=1
#  套接字服务器监听的地址。如果没有配置,主机名将等于的值
listeners=PLAINTEXT://192.168.12.91:9092
# 如果同时需要外网IP访问kafka集群,例如开发联调
advertised.listeners=PLAINTEXT://外网IP:9092
# 这个是borker进行网络处理的线程数
num.network.threads=3
# 这个是borker进行I/O处理的线程数
num.io.threads=8
# 发送缓冲区buffer大小,数据不是一下子就发送的,先回存储到缓冲区了到达一定的大小后在发送,
# 能提高性能
socket.send.buffer.bytes=102400
# kafka接收缓冲区大小,当数据到达一定大小后在序列化到磁盘
socket.receive.buffer.bytes=102400
# 这个参数是向kafka请求消息或者向kafka发送消息的请请求的最大数,这个值不能超过java的堆栈大小
socket.request.max.bytes=104857600

# 消息存放的目录,这个目录可以配置为“,”逗号分割的表达式,
# 上面的num.io.threads要大于这个目录的个数这个目录,
# 如果配置多个目录,新创建的topic他把消息持久化的地方是:当前以逗号分割的目录中,
# 那个分区数最少就放那一个
log.dirs=/data/logs/kafka-logs

# 默认的分区数,一个topic默认1个分区数
num.partitions=1
# 每个数据目录用来日志恢复的线程数目
num.recovery.threads.per.data.dir=1

# 默认为1;表示kafka的内部topic consumer_offsets副本数,
# 该副本所在的broker宕机,consumer_offsets只有一份副本,该分区宕机。
# 使用该分区存储消费分组offset位置的消费者均会收到影响,offset无法提交,
# 从而导致生产者可以发送消息但消费者不可用。所以需要设置该字段的值大于1。
offsets.topic.replication.factor=3
# 事务主题的复制因子(设置更高以确保可用性)。 内部主题创建将失败,直到群集大小满足此复制因素要求
# 一般与上面的offsets.topic.replication.factor保持一致
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=3

# 默认消息的最大持久化时间,168小时,7天
log.retention.hours=168

# 这个参数是:因为kafka的消息是以追加的形式落地到文件,当超过这个值1G的时候,kafka会新起一个文件
log.segment.bytes=1073741824

# 每隔300000毫秒去检查上面配置的log失效时间
log.retention.check.interval.ms=300000

# 设置zookeeper的连接端口
zookeeper.connect=192.168.12.91:2181,192.168.12.90:2181,192.168.12.88:2181
# 设置zookeeper的连接超时时间
zookeeper.connection.timeout.ms=6000

# 默认3s,测试服或开发服可以设置为0
group.initial.rebalance.delay.ms=0
# 下面看情况优化是否需要,可不管

# producer.properties中可以添加
# 指定kafka节点列表,用于获取metadata,不必全部指定
# #需要kafka的服务器地址,来获取每一个topic的分片数等元数据信息
metadata.broker.list=192.168.12.91:2181,192.168.12.90:2181,192.168.12.88:2181

# consumer.properties中可以添加
# 消费者集群通过连接Zookeeper来找到broker
zookeeper.connect=192.168.12.91:2181,192.168.12.90:2181,192.168.12.88:2181
# kafka修改单条数据大小
# kafka中默认单条数据大小为1M,实际工作中经常有大于1M的数据,这时会出现阻塞的情况,
# 下面记录一下如何修改单条数据大小
# 1.修改kafka安装目录下的conf/server.properties
message.max.bytes=10485760
#该值指的是broker能接收消息的最大字节数,这里我设置的是10M,
# 该值的大小需比replica.fetch.max.bytes的值小

replica.fetch.max.bytes=11534336
#broker可复制的消息的最大字节数,这里我设置的是11M,小于message.max.bytes会导致数据发不出去

# 2.修改kafka安装目录下的conf/producer.properties
max.request.size=10485760
#该值指请求的最大大小为字节。要不大于上述的message.max.bytes

# 3.修改kafka安装目录下的conf/consumer.properties
max.partition.fetch.bytes=10485760
#该值指一次fetch请求,从一个partition中取得的records最大大小。要不大于上述的message.max.bytes

2.2.1 云服务器内外网都可以访问

vim /usr/local/kafka/config/server.properties
listeners=PLAINTEXT://内网IP:9092
advertised.listeners=PLAINTEXT://外网IP:9092
zookeeper.connect=外网IP:2181,外网IP:2181,外网IP:2181

vim /usr/local/kafka/config/zookeeper.properties
quorumListenOnAllIPs=true # 监听全部网卡,如果不加这个参数,会报连不上端口之类
server.1=外网IP:2888:3888
server.2=外网IP:2888:3888
server.3=外网IP:2888:3888

# 报错
不配置:quorumListenOnAllIPs=true
[2023-07-19 15:42:18,489] WARN Cannot open channel to 2 at election address /外网IP:3888 (org.apache.zookeeper.server.quorum.QuorumCnxManager)
java.net.ConnectException: Connection refused (Connection refused)

2.3 集群启动

# zookeeper 启动
cd /usr/local/kafka
bin/zookeeper-server-start.sh config/zookeeper.properties
# 正式启动命令
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

# kafka启动
bin/kafka-server-start.sh config/server.properties
# 正式启动命令
bin/kafka-server-start.sh -daemon config/server.properties

# 启动后查看cluster.id,可以发现cluster.id 3台服务器都相同,如果不同请修改为相同再启动
cat /data/logs/kafka-logs/meta.properties
broker.id=1
version=0
cluster.id=ZkY_j0i0TtOOJDa16-adrg

# 记得在防火墙里添加端口,在3个机器上telnet看是否能通
firewall-cmd --zone=public --add-port=2181/tcp --permanent 
firewall-cmd --zone=public --add-port=3888/tcp --permanent 
firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=9092/tcp --permanent
firewall-cmd --reload

三、集群测试

3.1 集群测试命令

# 创建测试用的主题
# 我们首先创建一个主题 topic-test,并指定分区为 0,读取模式为从头读取,并连接本地服务器
bin/kafka-console-consumer.sh --bootstrap-server 192.168.12.91:9092 --offset latest --partition 0 --topic topic-test

# 创建消费者
# 在集群每台服务器上创建消费者,并指定为本地IP
bin/kafka-console-consumer.sh --bootstrap-server 192.168.12.91:9092 --offset latest --partition 0 --topic topic-test

# 创建发布者
# 在集群随机一台服务器上创建发布者,并指定集群列表和主题,进行消息发布
bin/kafka-console-producer.sh  --topic topic-test --broker-list 192.168.12.91:9092,192.168.12.90:9092,192.168.12.88:9092

# 查看所有topic
kafka-topics.sh --bootstrap-server 192.168.12.91:9092 --list
# 删除topic,删除后副本也会消失
kafka-topics.sh --bootstrap-server 192.168.12.91:9092 --delete --topic topic-test

3.2 集群测试结果

# 192.168.12.91 消费者
kafka-console-consumer.sh --bootstrap-server 192.168.12.91:9092 --offset latest --partition 0 --topic topic-test
# 日志,WARN可以开启参数auto.create.topics.enable=true
[2023-07-16 14:09:20,049] WARN [Consumer clientId=console-consumer, groupId=console-consumer-68106] Error while fetching metadata with correlation id 1 : {topic-test=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
[2023-07-16 14:09:20,236] WARN [Consumer clientId=console-consumer, groupId=console-consumer-68106] Received unknown topic ID error in fetch for partition topic-test-0 (org.apache.kafka.clients.consumer.internals.AbstractFetch)
21
time
exit
exit()
quit
^CProcessed a total of 5 messages

# 192.168.12.90 消费者
# 查看所有的topic,3个都可以看到和offsets.topic.replication.factor这块参数相关
# kafka-topics.sh --bootstrap-server 192.168.12.88:9092 --list
topic-test
# kafka-topics.sh --bootstrap-server 192.168.12.88:9092 --list
topic-test
# kafka-topics.sh --bootstrap-server 192.168.12.91:9092 --list
topic-test
kafka-console-consumer.sh --bootstrap-server 192.168.12.90:9092 --offset latest --partition 0 --topic topic-test
21
time
exit
exit()
quit
^CProcessed a total of 5 messages

# 192.168.12.88 消费者
kafka-console-consumer.sh --bootstrap-server 192.168.12.88:9092 --offset latest --partition 0 --topic topic-test
21
time
exit
exit()
quit
^CProcessed a total of 5 messages

# 192.168.12.91 发布者、生产者
kafka-console-producer.sh --topic topic-test --broker-list 192.168.12.91:9092,192.168.12.90:9092,192.168.12.88:9092
>21
>time
>exit
>exit()
>quit

测试成功

关闭命令:

cd /usr/local/kafka/bin
./zookeeper-server-stop.sh
./kafka-server-stop.sh