使用 AutoMQ 节省跨 AZ 流量费用
AutoMQ 基于 S3 的共享存储架构可以避免 Server 内的跨 AZ 副本复制以及 Producer 的跨 AZ 数据写入流量。本文档介绍如何使用 AutoMQ 节省跨 AZ 传输流量。
本文中提及的 AZ 全称为 Available Zone,特指公有云环境中,云厂商提供的可用区(Zone)。 每个独立的 AZ 背后可能是独立的机房设施。
问题背景
Apache Kafka 跨 AZ 流量分析
用户在 AWS、GCP 云环境中如果将 Apache Kafka 部署到多个 AZ,虽然可以实现多 AZ 服务容灾,但同时会带来跨 AZ 数据传输成本, 大规模集群中流量成本可能占比达到 60-70% 。
-
跨 AZ 生产流量 :假设 Producer 未设置 ShardingKey,并且分区在集群节点间均匀分布。那么至少有 2 / 3 的 Producer 流量会跨 AZ 发送,例如 AZ1 的 Producer 分别有 1 / 3 的流量发送到 AZ2 和 AZ3。
-
服务端跨 AZ 复制流量 :Kafka Broker 收到消息后为了保证数据的高可靠,会将数据复制到其他 AZ 的 Broker,产生 2 倍 Produce 的跨 AZ 流量。
-
跨 AZ 消费流量 :Consumer 可以通过设置 client.rack 来消费同 AZ 的分区/副本来避免产生跨 AZ 流量。

AutoMQ 多点写入架构节省跨 AZ 传输
AutoMQ 使用 S3 实现了存算分离架构,S3 作为共享存储层提供了多 AZ 的数据持久性,无需再进行跨 AZ 副本复制, 节省了上述图中的 Apache Kafka 的服务端复制流量。
另一方面,AutoMQ Broker 是无状态架构,通过对 Kafka 客户端的请求进行拦截,识别跨 AZ 的Produce 请求 ,并基于 S3 进行请求代理,实现了 Kafka 分区的多点写入。每个 AZ的 Broker 都能提供任意分区的 PRODUCE 服务,最终做到 Producer 与 Broker 之间无跨 AZ 流量费用。

前置条件
如上背景分析,在 AWS、GCP 等云环境,跨 AZ 传输会产生流量费用。使用 AutoMQ 可以规避 Kafka 的生产、消费和服务端副本复制流量。
配置 AutoMQ 节省跨 AZ 流量传输,需要满足如下条件:
-
云厂商环境约束 :目前仅建议在AWS、GCP 环境进行多 AZ 部署 时才配置 AutoMQ 多点写入。如果应用架构为单 AZ,或者是其他云厂商(跨 AZ 传输暂不收费)则不建议配置。
-
多 AZ 部署约束: 使用 AutoMQ 多点写入架构节省跨 AZ 传输流量,需要应用和 AutoMQ 满足多 AZ 部署。
-
AZ数量约束: 目前仅支持Producer、Consumer、AutoMQ 进行三 AZ部署,如果 Producer 和 Consumer 多于三 AZ,仍然会产生部分跨 AZ流量。
-
AZ容量均衡约束: 目前仅支持 AZ均衡部署,即 Producer、Consumer 应用在每个 AZ的容量相同。如果容量不均衡,仍然会产生部分跨 AZ流量。
-
操作步骤
创建 AutoMQ 实例
使用 AutoMQ 节省跨 AZ 流量传输,首先需要确保创建符合条件的 AutoMQ 实例(WAL 类型必须创建为 S3WAL )。具体操作步骤如下:
-
登录 AutoMQ BYOC 环境。
-
创建实例,网络配置中 选择三可用区。 存储规格中**,WAL 类型选择 S3WAL** 。
注意:
创建 AutoMQ 实例时, AZ必须和 Kafka 生产者、消费者所在的部署区域一致,并保证所有 AZ内的容量均衡。如果容量不均衡,则可能仍然会产生一定比例的跨 AZ 传输流量。
举例:Kafka 生产者、消费者部署在 A、B、C 三个区域,且三个区域的应用容量相同,此时创建 AutoMQ 实例时,也选择 A、B、C 三个区域。

配置映射规则,识别客户端来源 CIDR 所在 Rack
由于 Kafka 协议的限制,服务端无法感知 Client 所属的 Rack。AutoMQ 为了感知 Client 所属的 Rack,避免跨可用区生产消费,提供了客户端配置可用区标识 以及服务端配置 CIDR 可用区标识 两种方式。
服务端配置 CIDR 可用区标识
如果客户端 IP 具备通过 CIDR 分类识别可用区,或者通过 Flink / Spark / Presto 等计算引擎访问 AutoMQ(客户端不方便添加自定义配置),则推荐通过 AutoMQ 服务端配置各个客户端 CIDR 段的可用区。这样可以减少客户端应用的配置。
-
访问实例详情页,点击配置项,编辑 automq.zone.cidr.blocks 配置项。
-
参考使用限制▸ 文档,设置客户端来源的可用区标识。
配置举例:
配置多个可用区标识:az-1@10.0.0.1/30<>az-2@10.0.0.2/30。
配置相同可用区下有多个 CIDR 段:az-1@10.0.0.1/30,10.0.0.2/30
客户端配置可用区标识
如果客户端 IP 无法通过显式的 CIDR 分类识别可用区,则可以修改生产者和消费者配置才能相应节省生产者和消费者的跨 AZ 传输流量。
生产者配置
AutoMQ 提供分区多 AZ多点写入的能力,生产者只会向相同 AZ的 AutoMQ 发送消息,以此消除生产者跨 AZ 流量。为了让 AutoMQ 服务端能识别生产者所在的 AZ,需要在生产者的初始化配置中按照如下添加设置。
Kafka Producer 需要增加的配置项为: clientID: automq_type=producer&automq_az=<client_az>
-
automq_type=producer
标识该客户端为生产者。 -
automq_az=<client_az>
**标识客户端所在的 AZ。
完整的设置携带 AZ信息的生产者 clientID
的示例:
...
props.put(ProducerConfig.CLIENT_ID_CONFIG, String.format("automq_type=producer&automq_az=%s", getCurrentAz()));
...
producer = new KafkaProducer<>(props);
消费者配置
AutoMQ 支持 KIP-881: Rack-aware Partition Assignment for Kafka Consumers,消费者(客户端版本 >= 3.5.0)通过 Rack-aware 分区分配策略来消费相同 AZ的分区,以此消除消费者跨 AZ 流量。
以下是配置 Rack Aware 消费者的示例:
...
props.put(ConsumerConfig.CLIENT_RACK_CONFIG, getCurrentAz());
...
consumer = new KafkaConsumer(props);
注意:
配置上述 Kafka Consumer 的 AZ感知功能,建议保证客户端版本 >= 3.5.0 。