最近在新的服务器上部署 Kafka 4.1.0 版本,踩了不少坑。记录一下整个过程,希望能帮助到大家避免重复劳动。
问题场景重现:Kafka 启动失败,ZooKeeper 连接异常
一开始,按照官方文档的步骤配置完 server.properties 之后,启动 Kafka 服务,结果直接报错,提示无法连接到 ZooKeeper。错误信息类似 org.apache.kafka.common.KafkaException: java.net.ConnectException: Connection refused。初步判断是 ZooKeeper 配置有问题或者 ZooKeeper 服务本身没有启动。
底层原理深度剖析:Kafka 与 ZooKeeper 的关系
Kafka 严重依赖 ZooKeeper 来进行集群管理、broker 注册、topic 配置、partition leader 选举等关键任务。可以说,ZooKeeper 是 Kafka 的大脑。Kafka Broker 启动时,会将自身的信息注册到 ZooKeeper,以便其他 Broker 和 Consumer 能够发现它。如果 ZooKeeper 连接出现问题,整个 Kafka 集群将无法正常工作。常见的 ZooKeeper 连接问题包括:
- ZooKeeper 服务未启动或未正常运行。
- Kafka 配置的 ZooKeeper 地址不正确。
- ZooKeeper 服务器防火墙阻止了 Kafka Broker 的连接。
- ZooKeeper 集群网络不稳定,导致连接超时。
具体解决方案:检查配置,调整参数,优化网络
1. 检查 ZooKeeper 配置
首先,确认 server.properties 文件中的 zookeeper.connect 参数是否正确指向 ZooKeeper 集群。确保地址和端口号都正确,例如:
zookeeper.connect=zk1:2181,zk2:2181,zk3:2181 # 多个 ZooKeeper 节点用逗号分隔
2. 验证 ZooKeeper 服务状态
通过 zkCli.sh 工具连接 ZooKeeper,检查 ZooKeeper 服务是否正常运行。如果无法连接,需要排查 ZooKeeper 服务器的问题。
./zkCli.sh -server zk1:2181
如果连接成功,可以执行 ls / 命令查看 ZooKeeper 中的根节点,如果 Kafka 已经注册,应该能看到 /brokers 等相关节点。
3. 防火墙配置
确保 Kafka Broker 所在的服务器防火墙允许 Kafka Broker 和 ZooKeeper 之间的网络连接。允许 Kafka Broker 的端口(默认 9092)和 ZooKeeper 的端口(默认 2181)的流量通过。
可以使用 firewall-cmd (CentOS/RHEL) 或 ufw (Ubuntu) 等工具进行配置。
4. 调整 Kafka 连接 ZooKeeper 的超时时间
如果网络环境不稳定,可以适当增加 Kafka 连接 ZooKeeper 的超时时间,避免因网络波动导致连接失败。在 server.properties 文件中修改以下参数:
zookeeper.connection.timeout.ms=15000 # 连接超时时间,单位毫秒,默认 6000
zookeeper.session.timeout.ms=18000 # 会话超时时间,单位毫秒,默认 6000
zookeeper.sync.time.ms=5000 # follower 同步 leader 数据的时间,单位毫秒,默认 2000
5. 调整 JVM 参数
如果 Kafka Broker 运行在资源受限的环境中,例如 Docker 容器,可以调整 JVM 参数,优化 Kafka Broker 的性能。可以通过修改 kafka-server-start.sh 脚本来设置 JVM 参数。
export KAFKA_HEAP_OPTS="-Xmx2G -Xms2G" # 设置 Kafka Broker 的最大堆内存和初始堆内存
6. Kafka 服务启动顺序
确保 ZooKeeper 服务先于 Kafka 服务启动。如果 Kafka 服务在 ZooKeeper 服务未启动的情况下启动,则 Kafka Broker 无法注册到 ZooKeeper,导致启动失败。
实战避坑经验总结
- 监控是关键:在生产环境中,一定要配置完善的监控系统,实时监控 Kafka Broker 的运行状态,包括 CPU 使用率、内存使用率、磁盘 IO、网络流量等指标。可以使用 Prometheus + Grafana 等工具进行监控。
- 日志分析:Kafka Broker 的日志包含了大量的信息,遇到问题时,要仔细分析日志,定位问题的根源。Kafka Broker 的日志文件通常位于
logs目录下。 - 版本兼容性:在升级 Kafka 版本时,一定要仔细阅读官方文档,了解版本之间的兼容性问题。避免因版本不兼容导致 Kafka 集群出现问题。
- 资源规划:在部署 Kafka 集群时,要根据实际的业务需求进行资源规划,包括 CPU、内存、磁盘、网络等资源。避免因资源不足导致 Kafka 集群性能下降。
- 参数调优:Kafka 的参数非常多,不同的参数会对 Kafka 的性能产生不同的影响。要根据实际的业务场景进行参数调优,找到最佳的配置。
- 使用最新稳定版:避免使用带有 Beta 标签的测试版本,选择官方推荐的稳定版本能省去很多不必要的麻烦。
例如,在实际的生产环境中,我们使用 Nginx 作为 Kafka 的反向代理,并配置了负载均衡,以提高 Kafka 集群的可用性和性能。同时,我们还使用了宝塔面板来管理服务器,简化了服务器的运维工作。在高并发的场景下,需要根据实际的并发连接数调整 Nginx 的相关配置参数,例如 worker_processes、worker_connections 等。
希望以上经验能帮助你顺利安装、配置和启动 Kafka 4.1.0,并避免踩坑。
冠军资讯
加班到秃头