环境信息
- 操作系统:CentOS 7.9 (x86_64)
- 硬件:4C8G(4核8GB)
- 用户:root
- JDK 路径:
/usr/local/jdk1.8.0_491(已安装) - Kafka 版本:2.8.2(Scala 2.13)
- 虚拟机 IP:
192.168.10.5
一、配置 Java 环境变量
# 设置 JAVA_HOME 和 PATH(立即生效)
export JAVA_HOME=/usr/local/jdk1.8.0_491
export PATH=$JAVA_HOME/bin:$PATH
# 永久写入配置文件
echo "export JAVA_HOME=/usr/local/jdk1.8.0_491" >> /etc/profile
echo "export PATH=\$JAVA_HOME/bin:\$PATH" >> /etc/profile
source /etc/profile
# 验证
java -version # 应显示 java version "1.8.0_491"
echo $JAVA_HOME
二、系统优化(针对 4C8G)
# 1. 内核参数优化
cat >> /etc/sysctl.conf << 'EOF'
vm.swappiness = 1
vm.max_map_count = 262144
net.core.somaxconn = 65535
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
EOF
sysctl -p
# 2. 文件描述符限制
cat >> /etc/security/limits.conf << 'EOF'
* soft nofile 65535
* hard nofile 65535
EOF
# 当前会话生效
ulimit -n 65535
三、下载并安装 Kafka
cd /usr/local
wget https://archive.apache.org/dist/kafka/2.8.2/kafka_2.13-2.8.2.tgz
tar -xzf kafka_2.13-2.8.2.tgz
mv kafka_2.13-2.8.2 /usr/local/kafka
# 创建数据目录
mkdir -p /data/zookeeper
mkdir -p /data/kafka-logs
四、配置 Kafka 堆内存(4GB)
通过环境变量设置(不修改启动脚本):
echo 'export KAFKA_HEAP_OPTS="-Xmx4G -Xms4G"' >> /etc/profile
source /etc/profile
echo $KAFKA_HEAP_OPTS # 验证输出 -Xmx4G -Xms4G
五、编写配置文件
5.1 ZooKeeper 配置
cat > /usr/local/kafka/config/zookeeper.properties << 'EOF'
dataDir=/data/zookeeper
clientPort=2181
tickTime=2000
initLimit=5
syncLimit=2
EOF
5.2 Kafka Broker 配置
vim /usr/local/kafka/config/server.properties
将内容替换为以下(注意 advertised.listeners 改为实际 IP):
broker.id=0
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.10.5:9092
log.dirs=/data/kafka-logs
zookeeper.connect=localhost:2181
num.network.threads=5
num.io.threads=8
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
踩坑说明 :如果不设置 offsets.topic.replication.factor=1,Kafka 会尝试用默认副本因子 3 创建 __consumer_offsets 主题,但单机只有 1 个 broker,导致消费者无法正常工作。
六、配置 Systemd 服务
6.1 ZooKeeper 服务
vim /etc/systemd/system/zookeeper.service
内容:
[Unit]
Description=Apache ZooKeeper
After=network.target
[Service]
Type=simple
Environment="JAVA_HOME=/usr/local/jdk1.8.0_491"
Environment="KAFKA_HEAP_OPTS=-Xmx1G -Xms1G"
ExecStart=/usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties
ExecStop=/usr/local/kafka/bin/zookeeper-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
6.2 Kafka 服务
vim /etc/systemd/system/kafka.service
内容:
[Unit]
Description=Apache Kafka
After=zookeeper.service network.target
[Service]
Type=simple
Environment="JAVA_HOME=/usr/local/jdk1.8.0_491"
Environment="KAFKA_HEAP_OPTS=-Xmx4G -Xms4G"
ExecStart=/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties
ExecStop=/usr/local/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
[Install]
WantedBy=multi-user.target
6.3 启动并设置开机自启
systemctl daemon-reload
systemctl start zookeeper
systemctl start kafka
#设置服务开机自启
systemctl enable zookeeper
systemctl enable kafka
systemctl list-unit-files |grep -Ew "zookeeper|kafka"
# 检查状态
systemctl status zookeeper
systemctl status kafka
七、验证安装
7.1 检查进程和端口
jps
# 应看到 QuorumPeerMain 和 Kafka 进程
netstat -tulnp | grep -E '2181|9092'
7.2 手动创建主题
/usr/local/kafka/bin/kafka-topics.sh --create --bootstrap-server 192.168.10.5:9092 --replication-factor 1 --partitions 1 --topic test
7.3 消息收发测试
生产者(任选一种地址都行):
# 使用 IP
/usr/local/kafka/bin/kafka-console-producer.sh --broker-list 192.168.10.5:9092 --topic test
# 或使用 localhost
/usr/local/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
输入 hello 后回车。
消费者(同样可以使用 IP 或 localhost):
/usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.10.5:9092 --topic test --from-beginning
# 或
/usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
应该立即看到 hello。
经验总结 :只要 advertised.listeners 配置为可路由的 IP(如 192.168.10.5),客户端无论是用该 IP 还是 localhost 连接,都能正常工作。这是因为 listeners=0.0.0.0:9092 绑定了所有接口,而 advertised.listeners 返回的地址客户端也能访问(本机访问 localhost 和 192.168.10.5 都通)。
八、日志查看与故障排查
8.1 Kafka 日志
# 实时查看 Kafka 日志
tail -100f /usr/local/kafka/logs/server.log
# 查看最近 100 行错误
tail -100 /usr/local/kafka/logs/server.log | grep -i error
# 查看全部日志(分页)
less /usr/local/kafka/logs/server.log
8.2 ZooKeeper 日志
# 实时查看 ZooKeeper 日志
journalctl -u zookeeper -f
# 查看最近 100 行
journalctl -u zookeeper -n 100
# 查看所有错误
journalctl -u zookeeper -p err
8.3 查看 systemd 服务状态和日志
# Kafka 服务日志
journalctl -u kafka -f
# 查看服务启动失败详情
journalctl -u kafka -n 50 --no-pager
九、常用管理命令
主题操作
# 创建主题test
/usr/local/kafka/bin/kafka-topics.sh --create --bootstrap-server 192.168.10.5:9092 --replication-factor 1 --partitions 1 --topic test
# 列出所有主题
/usr/local/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.10.5:9092
# 查看主题详情
/usr/local/kafka/bin/kafka-topics.sh --describe --bootstrap-server 192.168.10.5:9092 --topic test
# 删除主题(需在 server.properties 中设置 delete.topic.enable=true)
/usr/local/kafka/bin/kafka-topics.sh --delete --bootstrap-server 192.168.10.5:9092 --topic test
查看消费进度(偏移量)
/usr/local/kafka/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.10.5:9092 --topic test --time -1
# 输出格式 test:0:6 表示分区0有6条消息
查看消费者组
/usr/local/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 192.168.10.5:9092 --list
查看 broker 配置
/usr/local/kafka/bin/kafka-configs.sh --bootstrap-server 192.168.10.5:9092 --describe --broker 0
服务管理
systemctl start kafka zookeeper
systemctl stop kafka zookeeper
systemctl restart kafka
systemctl status kafka
systemctl enable kafka # 开机自启
十、常见踩坑与解决方法
|-------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|------------------------------------------------------------|
| 问题现象 | 原因 | 解决方法 |
| Kafka 启动失败,日志提示 InvalidReplicationFactorException: Replication factor: 3 larger than available brokers: 1 | 未设置 offsets.topic.replication.factor=1 | 在 server.properties 中添加该配置并重启 |
| 消费者收不到消息,但生产者无报错 | 消费者使用了 localhost 而 advertised.listeners 是 IP,导致网络不通;或内部主题创建失败 | 确保消费者地址与 advertised.listeners 中地址可达;检查日志中的副本因子错误 |
| jps 找不到命令 | JAVA_HOME 未加入 PATH | 重新执行 export PATH=$JAVA_HOME/bin:$PATH 并写入 /etc/profile |
| kafka-run-class.sh 报 UnrecognizedOptionException | 某些工具参数名不同(如 GetOffsetShell 用 --broker-list 而非 --bootstrap-server) | 查阅官方文档或使用 --help |
| 生产者发送成功但消费者收不到,GetOffsetShell 显示 offset=0 | 消息实际未写入,可能由于 auto.create.topics.enable=false 且主题不存在 | 先手动创建主题 |
十一、重置环境(清除所有数据)
systemctl stop kafka zookeeper
rm -rf /data/kafka-logs/* /data/zookeeper/*
systemctl start zookeeper kafka
# 重新创建主题
/usr/local/kafka/bin/kafka-topics.sh --create --bootstrap-server 192.168.10.5:9092 --replication-factor 1 --partitions 1 --topic test
附录:完整配置文件清单
/etc/profile 中与 Kafka 相关的行
export JAVA_HOME=/usr/local/jdk1.8.0_491
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_PATH=$JAVA_HOME/bin:$JRE_HOME/bin
export PATH=$PATH:$JAVA_PATH
export KAFKA_HEAP_OPTS="-Xmx4G -Xms4G"
/usr/local/kafka/config/server.properties 最终版
broker.id=0
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.10.5:9092
log.dirs=/data/kafka-logs
zookeeper.connect=localhost:2181
num.network.threads=5
num.io.threads=8
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
auto.create.topics.enable=false
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
/usr/local/kafka/config/zookeeper.properties 最终版
dataDir=/data/zookeeper
clientPort=2181
tickTime=2000
initLimit=5
syncLimit=2