Skip to main content

使用 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 流量传输,需要满足如下条件:

  1. 云厂商环境约束 :目前仅建议在 AWS、GCP 环境进行多 AZ 部署 时才配置 AutoMQ 多点写入。如果应用架构为单 AZ,或者是其他云厂商(跨 AZ 传输暂不收费)则不建议配置。

  2. 多 AZ 部署约束: 使用 AutoMQ 多点写入架构节省跨 AZ 传输流量,需要应用和 AutoMQ 满足多 AZ 部署。

    1. AZ数量约束: 目前仅支持Producer、Consumer、AutoMQ 进行三 AZ部署,如果 Producer 和 Consumer 多于三 AZ,仍然会产生部分跨 AZ流量。

    2. AZ容量均衡约束: 目前仅支持 AZ均衡部署,即 Producer、Consumer 应用在每个 AZ的容量相同。如果容量不均衡,仍然会产生部分跨 AZ流量。

操作步骤

AutoMQ 实例配置

使用 AutoMQ 节省跨 AZ 流量传输,首先需要确保创建符合条件的 AutoMQ 实例(WAL 类型必须创建为 S3WAL )。具体操作步骤如下:

  1. 登录 AutoMQ BYOC 环境。

  2. 创建实例,网络配置中 选择三可用区。 存储规格中,WAL 类型选择 S3WAL

注意:

创建 AutoMQ 实例时, AZ必须和 Kafka 生产者、消费者所在的部署区域一致,并保证所有 AZ内的容量均衡。如果容量不均衡,则可能仍然会产生一定比例的跨 AZ 传输流量。

举例:Kafka 生产者、消费者部署在 A、B、C 三个区域,且三个区域的应用容量相同,此时创建 AutoMQ 实例时,也选择 A、B、C 三个区域。

客户端配置

AutoMQ 实例创建完成后,按照应用的变更流程,修改生产者和消费者配置才能相应节省生产者和消费者的跨 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.4.0)通过 Rack-aware 分区分配策略来消费相同 AZ的分区,以此消除消费者跨 AZ 流量。

以下是配置 Rack Aware 消费者的示例:


...
props.put(ConsumerConfig.CLIENT_RACK_CONFIG, getCurrentAz());
...
consumer = new KafkaConsumer(props);

注意:

配置上述 Kafka Consumer 的 AZ感知功能,建议保证客户端版本 >= 3.4.0