在 Kafka 中创建主题时,必须通过命令行工具明确传入分区数量和副本因子参数,否则可能沿用默认配置或触发自动创建机制,导致生产环境性能隐患。
先说结论:手动创建主题时建议使用 kafka-topics.sh 脚本,显式指定 `--partitions` 和 `--replication-factor` 参数以匹配集群规模。
- 适合:生产环境规划、需要控制数据冗余和并行度的场景
- 先准备:确认 Broker 节点数量,确保副本数不超过节点总数
- 验收:创建后使用 describe 命令检查分区分配和副本同步状态
基础创建命令
根据 Kafka 版本不同,连接参数有所区别。较新版本推荐使用 bootstrap-server 参数,旧版本或特定配置下可能仍需指定 zookeeper(已逐步废弃)。
较新版本推荐命令:
bin/kafka-topics.sh `--create` `--bootstrap-server` localhost:9092 `--replication-factor` 1 `--partitions` 1 `--topic` test
旧版本命令:
bin/kafka-topics.sh `--zookeeper` localhost:2181 `--create` `--topic` topicone `--partitions` 2 `--replication-factor` 1
生产环境安全连接配置
生产环境通常开启 SASL/SSL 鉴权,直接连接会报错 Authentication failed。需要创建配置文件并通过 `--command-config` 指定。
1. 创建 client.properties 配置文件:
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="secret";
ssl.truststore.location=/var/private/ssl/client.truststore.jks
ssl.truststore.password=test1234
2. 带鉴权的创建命令:
bin/kafka-topics.sh `--create` `--bootstrap-server` kafka-prod:9093 `--command-config` client.properties `--replication-factor` 3 `--partitions` 10 `--topic` order-topic
分区数规划最佳实践
分区数并非越多越好,需结合吞吐量和消费者并行度规划:
- 消费者并行度:分区数应大于等于消费者组内的最大消费者实例数,否则部分消费者会空闲。
- 吞吐量估算:单分区吞吐量建议控制在 10MB/s - 50MB/s 之间。若预期峰值吞吐为 500MB/s,建议至少规划 10-50 个分区。
- Broker 负载:分区总数过多会增加 Broker 内存开销和 Leader 选举时间。单 Broker 分区数建议不超过 4000 个。
怎么验证是否生效
使用 describe 命令查看主题的分区与备份详细情况:
bin/kafka-topics.sh `--bootstrap-server` localhost:9092 `--describe` `--topic` test-topic
重点关注以下字段:
- PartitionCount:表示总共有多少个分区
- ReplicationFactor:表示每个分区有多少个副本备份
- ISR:In-Sync Replicas,代表与 Leader 保持同步的副本集合。若 ISR 数量小于副本数,说明存在同步延迟或 Broker 故障。
- Under Replicated Partitions:若该指标大于 0,说明集群存在副本不同步风险。
常见错误与排查
- InvalidReplicationFactorException:报错提示副本数大于 Broker 数量。排查:使用 kafka-broker-api-versions.sh 或查看监控确认存活 Broker 数,确保 replication-factor <= 存活 Broker 数。
- TopicAlreadyExistsException:主题已存在。排查:若允许覆盖,需先删除旧主题;若不允许,检查命名规范。
- 自动创建风险:默认配置 allow.auto.create.topics=true 下,发送消息到不存在的 topic 会自动创建分区数为 1 的 topic。建议在生产环境将该配置设置为 false,强制手动规划创建。
- 分区不可减少:分区数创建后可动态增加,但不可减少。规划时需预留未来 1-2 年的增长空间。
参考来源
- Apache Kafka Official Documentation - Topic Configuration
- Apache Kafka Official Documentation - Security