BOOTSTRAP_SERVERS 参数详解
1. 是什么?
BOOTSTRAP_SERVERS 是 Kafka 客户端(生产者和消费者)连接 Kafka 集群的入口地址列表。它是一个或多个 Kafka 节点地址的集合,客户端通过这些地址发现整个集群。
2. 应该写什么?
格式:host:port,多个地址用逗号分隔
常见配置示例:
# 单节点(开发环境)
BOOTSTRAP_SERVERS = 'localhost:9092'
# 多节点(生产环境)
BOOTSTRAP_SERVERS = 'kafka1:9092,kafka2:9092,kafka3:9092'
# 带端口的多个节点
BOOTSTRAP_SERVERS = '192.168.1.100:9092,192.168.1.101:9092,192.168.1.102:9092'
3. 与 Kafka 配置文件的关系
在 Kafka 服务端配置文件(通常是 server.properties)中,需要对应以下参数:
Kafka broker 配置:
# 监听地址(Kafka 服务绑定的地址)
listeners=PLAINTEXT://:9092
# 或指定具体IP
listeners=PLAINTEXT://0.0.0.0:9092
# 对外发布的地址(重要!)
advertised.listeners=PLAINTEXT://your-hostname:9092
# 或
advertised.listeners=PLAINTEXT://192.168.1.100:9092
4. 应该使用哪个参数?
| 使用场景 | 对应配置 | 示例 |
|---|---|---|
| 客户端在同一服务器 | listeners 中的地址 | localhost:9092 |
| 客户端在局域网其他机器 | advertised.listeners 或服务器的实际IP | kafka-server:9092 或 192.168.1.100:9092 |
| 云环境/Docker | advertised.listeners(必须是客户端能访问的地址) | kafka.cluster.com:9092 |
5. Python 代码示例
from kafka import KafkaProducer, KafkaConsumer
# 生产者配置
producer = KafkaProducer(
bootstrap_servers=['kafka1:9092', 'kafka2:9092', 'kafka3:9092'],
# 其他配置...
acks='all', # 消息确认机制
retries=3, # 重试次数
value_serializer=lambda v: v.encode('utf-8')
)
# 消费者配置
consumer = KafkaConsumer(
'my_topic',
bootstrap_servers='kafka1:9092,kafka2:9092',
group_id='my_group',
auto_offset_reset='earliest',
value_deserializer=lambda v: v.decode('utf-8')
)
6. 最佳实践建议
- 多节点配置:即使只有单节点,也建议配置所有已知节点
- 端口一致:确保端口与 Kafka 的
listeners配置一致 - 网络可达:确保客户端能访问这些地址(防火墙、安全组等)
- DNS/主机名:使用主机名时确保能正确解析
7. 检查与验证
# 查看 Kafka 实际监听的端口
$ netstat -tlnp | grep java
# 或
$ ss -tlnp | grep 9092
# 使用 kafka 命令验证
$ kafka-broker-api-versions.sh --bootstrap-server localhost:9092
8. 常见问题
# ❌ 错误:使用了内部不可访问的IP
BOOTSTRAP_SERVERS = '172.17.0.2:9092' # Docker内部IP,外部无法访问
# ✅ 正确:使用客户端能访问的地址
BOOTSTRAP_SERVERS = '192.168.1.100:9092' # 服务器实际IP
# ✅ Docker Compose 环境
BOOTSTRAP_SERVERS = 'kafka:9092' # Docker service name
总结:BOOTSTRAP_SERVERS 应该设置为客户端能够访问的 Kafka 节点地址,通常与 Kafka 配置中的 advertised.listeners 保持一致。