首页
/ Shopify Sarama项目中的Kafka测试环境Docker部署指南

Shopify Sarama项目中的Kafka测试环境Docker部署指南

2025-07-06 04:23:08作者:滕妙奇

概述

Shopify Sarama是一个高性能的Go语言Kafka客户端库。为了确保Sarama在各种Kafka环境下的稳定性和兼容性,项目提供了一个完整的Docker Compose配置,用于快速搭建一个包含ZooKeeper集群和Kafka集群的测试环境。本文将详细解析这个docker-compose.yml文件的配置要点和设计思路。

环境架构设计

该Docker Compose文件定义了一个完整的Kafka测试环境,包含以下核心组件:

  1. ZooKeeper集群:3个节点组成的ZooKeeper集群,为Kafka提供协调服务
  2. Kafka集群:5个节点组成的Kafka集群,提供消息服务
  3. 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个节点,每个节点都有类似的配置,但有以下关键区别:

  1. broker.id:每个节点有唯一的broker ID(1-5)
  2. broker.rack:每个节点配置了不同的机架位置(1-5),用于测试机架感知功能
  3. 监听端口:每个节点的本地监听端口不同(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的容错能力。

使用建议

  1. 版本控制:通过环境变量KAFKA_VERSION和SCALA_VERSION可以灵活控制Kafka和Scala版本
  2. 资源分配:在生产环境使用时,应根据负载调整内存和CPU限制
  3. 网络配置:可以根据需要调整监听器和广告地址的配置
  4. 监控:可以添加Prometheus等监控组件来收集指标

总结

Shopify Sarama项目的这个Docker Compose配置提供了一个完整的、生产级的Kafka测试环境,特别适合用于测试Kafka客户端在各种场景下的行为。通过精心设计的ZooKeeper集群、多节点Kafka集群和Toxiproxy集成,它能够模拟真实生产环境中的各种情况,确保Sarama客户端库的稳定性和可靠性。