一、topic 消息发送慢,并发性能低
问题描述:
某个或某几个 topic 的消息并发发送性能低,具体表现为 producer 的平均请求延迟大,平均生产吞吐量低。
可能原因:
- 网络带宽不足,导致 io 等待时间长。
- 消息未压缩,导致网络流量超负荷。
- 消息未批量发送或批量阈值配置不当,导致发送速率慢。
- topic 分区数量不足,导致 broker 接收消息积压。
- broker 磁盘性能低,导致磁盘同步慢。
- broker 分区总量过多,导致碎片化,磁盘读写过载。
排查方法:
1、确认网络带宽:
在一个节点上作为服务器启动 iperf
iperf -s
在另一个节点上作为客户端测试网络带宽
iperf -c 192.168.10.21
2、确认消息压缩:
在 producer 配置中启用消息压缩
compression.type=gzip
3、消息未批量发送或批量阈值配置不当
检查 producer 的批量发送配置 batch.size
和 linger.ms
。
操作命令: 查看 producer 配置文件或代码,确认 batch.size
和 linger.ms
设置。
优化方法: 调整 producer 配置,增大批量发送大小和延迟时间:
batch.size=32768
linger.ms=10
4、增加 topic 分区:
使用 kafka 提供的命令行工具查看 topic 分区数量
kafka-topics.sh --describe --topic <your_topic> --zookeeper <zookeeper_host>:2181
优化方法: 增加 topic 的分区数量以提高并发处理能力:
kafka-topics.sh --alter --topic <your_topic> --partitions 10 --zookeeper <zookeeper_host>:2181
5、检查磁盘 io 使用率:
使用 iostat
或 dstat
命令查看磁盘 io 使用率:
iostat -x 1 10
dstat -d 1
优化方法:
- 升级磁盘为 ssd,提高磁盘性能。
- 优化磁盘配置,确保磁盘 io 性能最佳。
6、检查分区总量:
使用 kafka 提供的命令行工具查看集群分区情况:
kafka-topics.sh --describe --zookeeper <zookeeper_host>:2181
优化方法:
- 水平扩展 broker,增加 broker 数量以分散分区负载。
- 通过增加 broker 节点来均衡分区分布,减少单个 broker 的分区数量。
二、topic 消息堆积
问题描述:
某个或某几个 topic 的消息堆积持续增加,具体表现为 group 消费延迟数量持续增加。
可能原因:
- producer 生产消息流量增大。
- consumer 由于业务变化导致消费延迟增加。
- consumer 数量不足。
- consumer 数量频繁变化,导致 group 不断做再平衡(rebalance)。
- broker 未收到 consumer 的消息确认消息。
排查方法:
确认生产量:
确认消费量:
检查 consumer 数量:
kafka-consumer-groups.sh --describe --group your_consumer_group --bootstrap-server broker_host:9092
观察 consumer 变化:
三、优化 kafka 生产性能
优化方法:
1、增大 producer 发送消息的批量大小(batch.size)和批量发送等待时间(linger.ms)。
batch.size=32768
linger.ms=10
2、启用压缩
使用压缩算法减少网络带宽占用。
compression.type=gzip
3、增加分区数:
4、调整 broker 配置
四、优化 kafka 消费性能
优化方法:
1、增大消费并发:
2、优化消费逻辑:
3、平衡负载:
五、kafka 集群扩展与维护
扩展方法:
1、水平扩展 broker:
(1)安装新broker:
(2)配置新 broker:
broker.id=3 # 新的 broker id
listeners=plaintext://:9092
log.dirs=/data/kafka-logs
zookeeper.connect=192.168.10.20:2181,192.168.10.21:2181,192.168.10.22:2181
num.partitions=3
default.replication.factor=3
(3)启动新broker
sudo su - kafka
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
(4)重新分配分区:
使用kafka自带的工具将现有分区重新分配到新 broker 上。
生成当前分区副本分配:
kafka-reassign-partitions.sh --zookeeper 192.168.10.20:2181 --generate --topics-to-move-json-file topics.json --broker-list "0,1,2,3"
topics.json内容:
{
"version": 1,
"topics": [
{"topic": "test-topic"}
]
}
执行分区重新分配:
kafka-reassign-partitions.sh --zookeeper 192.168.10.20:2181 --execute --reassignment-json-file reassignment.json
2、动态扩展 topic:
增加 topic 的分区数量:
kafka-topics.sh --alter --topic test-topic --partitions 10 --zookeeper 192.168.10.20:2181
维护方法:
定期监控:
检查集群状态:
kafka-broker-api-versions.sh --bootstrap-server 192.168.10.20:9092
检查 topic 信息:
kafka-topics.sh --describe --topic test-topic --zookeeper 192.168.10.20:2181
定期优化:
优化server.properties
中的配置,根据实际使用情况调整参数,如调整日志段大小和保留时间:
log.segment.bytes=1073741824 # 1 gb
log.retention.hours=168 # 7 days
清理过期数据:
kafka-delete-records.sh --bootstrap-server 192.168.10.20:9092 --offset-json-file offsets.json
发表评论