Shopify Sarama项目中的Kafka测试环境Docker部署指南
概述
Shopify Sarama是一个高性能的Go语言Kafka客户端库。为了确保Sarama在各种Kafka环境下的稳定性和兼容性,项目提供了一个完整的Docker Compose配置,用于快速搭建一个包含ZooKeeper集群和Kafka集群的测试环境。本文将详细解析这个docker-compose.yml文件的配置要点和设计思路。
环境架构设计
该Docker Compose文件定义了一个完整的Kafka测试环境,包含以下核心组件:
- ZooKeeper集群:3个节点组成的ZooKeeper集群,为Kafka提供协调服务
- Kafka集群:5个节点组成的Kafka集群,提供消息服务
- Toxiproxy:网络故障注入工具,用于测试Sarama在网络异常情况下的表现
这种3+5的架构设计(3个ZooKeeper节点+5个Kafka节点)提供了高可用性和容错能力,非常适合测试分布式场景下的客户端行为。
ZooKeeper配置详解
ZooKeeper集群配置了以下关键参数:
environment:
ZOO_MY_ID: '1' # 节点唯一标识
ZOO_SERVERS: 'server.1=zookeeper-1:2888:3888 server.2=zookeeper-2:2888:3888 server.3=zookeeper-3:2888:3888'
ZOO_CFG_EXTRA: 'clientPort=2181 peerPort=2888 leaderPort=3888'
ZOO_INIT_LIMIT: '10' # 初始化连接超时时间(心跳间隔的倍数)
ZOO_SYNC_LIMIT: '5' # 同步超时时间(心跳间隔的倍数)
ZOO_MAX_CLIENT_CNXNS: '0' # 每个IP最大连接数(0表示无限制)
ZOO_4LW_COMMANDS_WHITELIST: 'mntr,conf,ruok' # 允许的四字命令
每个ZooKeeper节点都配置了相同的服务器列表,但通过ZOO_MY_ID区分自身身份。这种配置确保了集群的自动发现和协调能力。
Kafka配置详解
Kafka集群配置了5个节点,每个节点都有类似的配置,但有以下关键区别:
- broker.id:每个节点有唯一的broker ID(1-5)
- broker.rack:每个节点配置了不同的机架位置(1-5),用于测试机架感知功能
- 监听端口:每个节点的本地监听端口不同(29091-29095)
核心配置参数包括:
environment:
KAFKA_CFG_ZOOKEEPER_CONNECT: 'zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181'
KAFKA_CFG_LISTENERS: 'LISTENER_INTERNAL://:9091,LISTENER_LOCAL://:29091'
KAFKA_CFG_ADVERTISED_LISTENERS: 'LISTENER_INTERNAL://kafka-1:9091,LISTENER_LOCAL://localhost:29091'
KAFKA_CFG_INTER_BROKER_LISTENER_NAME: 'LISTENER_INTERNAL'
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: 'LISTENER_INTERNAL:PLAINTEXT,LISTENER_LOCAL:PLAINTEXT'
KAFKA_CFG_DEFAULT_REPLICATION_FACTOR: '2'
KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: '2'
这些配置实现了:
- 内部通信和外部访问使用不同的监听器
- 默认副本因子为2,确保数据冗余
- 禁用自动创建主题,强制显式管理主题
- 配置了机架感知副本选择策略
健康检查机制
Kafka节点配置了详细的健康检查:
healthcheck:
test:
[
'CMD',
'/opt/kafka-${KAFKA_VERSION:-3.6.0}/bin/kafka-broker-api-versions.sh',
'--bootstrap-server',
'kafka-1:9091',
]
interval: 15s
timeout: 15s
retries: 10
start_period: 360s
这种检查通过调用kafka-broker-api-versions.sh脚本来验证Broker是否真正可用,而不仅仅是容器是否运行。start_period设置为360秒,给了Kafka足够的时间完成启动过程。
Toxiproxy集成
Toxiproxy是一个网络故障注入工具,用于测试Sarama在网络异常情况下的表现:
toxiproxy:
image: 'ghcr.io/shopify/toxiproxy:2.4.0'
ports:
- '29091:29091'
- '29092:29092'
- '29093:29093'
- '29094:29094'
- '29095:29095'
- '8474:8474' # API端口
通过将Kafka的本地监听端口(29091-29095)映射到Toxiproxy,测试可以在这些连接上注入延迟、丢包等网络问题,验证Sarama的容错能力。
使用建议
- 版本控制:通过环境变量KAFKA_VERSION和SCALA_VERSION可以灵活控制Kafka和Scala版本
- 资源分配:在生产环境使用时,应根据负载调整内存和CPU限制
- 网络配置:可以根据需要调整监听器和广告地址的配置
- 监控:可以添加Prometheus等监控组件来收集指标
总结
Shopify Sarama项目的这个Docker Compose配置提供了一个完整的、生产级的Kafka测试环境,特别适合用于测试Kafka客户端在各种场景下的行为。通过精心设计的ZooKeeper集群、多节点Kafka集群和Toxiproxy集成,它能够模拟真实生产环境中的各种情况,确保Sarama客户端库的稳定性和可靠性。