10.8.3 多租户与隔离策略

多租户与隔离策略的目标是在同一 Kafka 集群中保障业务相互独立、资源可控与风险可隔离。租户边界通常包括主题/分区、消费组、ACL、网络与配额等维度,需要与合规和负载模型匹配。

原理草图(隔离层次与资源路径):

文章图片

1. 基础隔离配置示例(安装与启用 Authorizer)#

适用于已有 Kafka 环境的多租户启用步骤,以下示例基于 /opt/kafka

1)启用 ACL 与多 Listener(/opt/kafka/config/server.properties):

# 认证与授权
authorizer.class.name=kafka.security.authorizer.AclAuthorizer
allow.everyone.if.no.acl.found=false

# 监听器与协议
listeners=INTERNAL://0.0.0.0:9092,EXTERNAL_TA://0.0.0.0:9093,EXTERNAL_TB://0.0.0.0:9094
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL_TA:SASL_SSL,EXTERNAL_TB:SASL_SSL
inter.broker.listener.name=INTERNAL

# 多租户最小隔离:将不同租户绑定到不同 Listener

2)重启 Broker:

# systemd 环境
sudo systemctl restart kafka

# 或使用脚本
/opt/kafka/bin/kafka-server-stop.sh
/opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/server.properties

预期效果:Broker 启动日志出现 AclAuthorizer 初始化信息。

2. 命名规范与主题隔离示例#

# 创建租户A与租户B主题
/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 \
  --create --topic tenantA.order --partitions 6 --replication-factor 3

/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 \
  --create --topic tenantB.log --partitions 3 --replication-factor 3

命令解释:
- --partitions:控制并行度与隔离层次
- --replication-factor:保障可靠性与容灾

3. ACL 权限隔离示例#

为租户A创建生产/消费权限,仅允许访问 tenantA.*

# 允许租户A生产/消费 tenantA.order
/opt/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 \
  --add --allow-principal User:tenantA \
  --operation Read --operation Write \
  --topic tenantA.order

# 允许租户A访问自己的消费组
/opt/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 \
  --add --allow-principal User:tenantA \
  --operation Read --group tenantA-group

验证 ACL:

/opt/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --list

预期效果:输出中仅包含 tenantA 的 Read/Write 权限。

4. 客户端配额(防噪音邻居)#

限制租户B Producer 速率,避免挤占带宽:

/opt/kafka/bin/kafka-configs.sh --bootstrap-server localhost:9092 \
  --alter --add-config 'producer_byte_rate=1048576,consumer_byte_rate=2097152,request_percentage=50' \
  --entity-type users --entity-name tenantB

命令解释:
- producer_byte_rate:限制生产速率(字节/秒)
- consumer_byte_rate:限制消费速率
- request_percentage:限制请求比例

查看配额:

/opt/kafka/bin/kafka-configs.sh --bootstrap-server localhost:9092 \
  --describe --entity-type users --entity-name tenantB

预期效果:显示 tenantB 的配额项。

5. 连接隔离与专用 Listener 示例#

租户A只允许访问 EXTERNAL_TA Listener:

# 客户端配置片段 client.properties
security.protocol=SASL_SSL
sasl.mechanism=PLAIN
bootstrap.servers=broker1:9093,broker2:9093

命令解释:
- 指定不同 Listener 可强制租户连接路径隔离
- 若租户连接到其他 Listener,会因认证失败或 ACL 拒绝

6. 故障排错清单(含命令)#

1)租户无法生产或消费:

# 查看 ACL 是否配置
/opt/kafka/bin/kafka-acls.sh --bootstrap-server localhost:9092 --list | grep tenantA

排查点:ACL 缺失或未允许对应 Group/Topic。

2)配额导致吞吐异常:

# 查看用户配额
/opt/kafka/bin/kafka-configs.sh --bootstrap-server localhost:9092 \
  --describe --entity-type users --entity-name tenantB

排查点:配额值过低或误配置。

3)Listener 错误导致认证失败:

# 检查 broker 监听器
grep -E "listeners|listener.security.protocol.map" /opt/kafka/config/server.properties

排查点:客户端连接端口与 Listener 不一致。

4)元数据膨胀导致 Controller 压力:

/opt/kafka/bin/kafka-topics.sh --bootstrap-server localhost:9092 --list | wc -l

排查点:Topic 数量过多,考虑合并。

7. 练习与验证#

1)为 tenantC 创建主题 tenantC.metric 并限制写入速率为 512KB/s。
2)为 tenantA 创建只读权限,确保无法写入(验证 WRITE 被拒绝)。
3)将租户B迁移到独立 Listener,并验证旧端口无法连接。

示例验证命令(生产者):

# tenantA 写入消息(期望成功)
/opt/kafka/bin/kafka-console-producer.sh --bootstrap-server broker1:9093 \
  --topic tenantA.order --producer.config /opt/kafka/config/tenantA.properties

# tenantA 写入 tenantB.log(期望失败)
/opt/kafka/bin/kafka-console-producer.sh --bootstrap-server broker1:9093 \
  --topic tenantB.log --producer.config /opt/kafka/config/tenantA.properties

预期效果:第二条命令出现 Topic authorization failedNot authorized


多租户隔离可按“轻量隔离(ACL+配额)→中等隔离(Listener+网络)→强隔离(独立 Broker/集群)”逐步演进,并结合租户基线(QPS、吞吐、分区数、连接数)进行配额与容量治理。