从 Kafka 迁移到 Pub/Sub Lite

如果您考虑从自行管理的 Apache Kafka 迁移到 Pub/Sub Lite,本文档会非常有用。

Pub/Sub Lite 概览

Pub/Sub Lite 是一种为实现低运维成本而打造的高流量消息传递服务。Pub/Sub Lite 提供可用区级和区域级存储空间以及预预配的容量。在 Pub/Sub Lite 中,您可以选择可用区级或区域级精简版主题。区域级精简版主题提供与 Pub/Sub 主题相同的可用性服务等级协议 (SLA)。但是,Pub/Sub 和 Pub/Sub Lite 在消息复制方面存在可靠性差异。

如需详细了解 Pub/Sub 和 Pub/Sub Lite,请参阅什么是 Pub/Sub

如需详细了解支持精简版的区域和地区,请参阅 Pub/Sub 精简版位置

Pub/Sub Lite 中的术语

以下是 Pub/Sub Lite 的一些关键术语。

  • 消息 -通过 Pub/Sub Lite 服务移动的数据。

  • 主题。表示消息 Feed 的命名资源。在 Pub/Sub Lite 中,您可以选择创建可用区级或区域级精简版主题。Pub/Sub Lite 区域级主题将数据存储在单个区域的两个可用区中。Pub/Sub 精简版可用区级主题仅在一个可用区内复制数据。

  • 预留。由一个区域中的多个精简版主题共享的已命名吞吐量容量池。

  • 订阅:表示想要接收来自特定精简版主题的消息的已命名资源。订阅类似于 Kafka 中的使用方群组,仅连接到单个主题。

  • 订阅者 -Pub/Sub Lite 的客户端,用于接收来自精简版主题和指定订阅的消息。一项订阅可以有多个订阅者客户端。在这种情况下,消息将在订阅者客户端之间进行负载均衡。在 Kafka 中,订阅者称为消费者

  • 发布商。创建消息并将其发送(发布)到特定精简版主题的应用。一个主题可以有多个发布者。在 Kafka 中,“发布者”称为“提供方”。

Kafka 与 Pub/Sub Lite 之间的区别

虽然 Pub/Sub Lite 在概念上与 Kafka 类似,但它是一个不同的系统,具有更窄的 API,更侧重于数据注入。虽然这些差异对于数据流提取和处理来说无关紧要,但在某些特定用例中,这些差异很重要。

Kafka 作为数据库

与 Kafka 不同,虽然支持幂等性,但 Pub/Sub Lite 目前不支持事务发布或日志压缩。当您将 Kafka 用作数据库时,这些 Kafka 功能比用作消息传递系统更有用。如果您主要将 Kafka 用作数据库,请考虑运行自己的 Kafka 集群或使用代管式 Kafka 解决方案(如 Confluent Cloud)。如果这两种解决方案都不可用,您还可以考虑使用可横向伸缩的数据库,例如 Cloud Spanner

Kafka 流

Kafka 流是以 Kafka 为基础构建的数据处理系统。虽然它允许注入使用方客户端,但需要对所有管理员操作的访问权限。Kafka Streams 还使用 Kafka 的事务型数据库属性来存储内部元数据。因此,Pub/Sub Lite 目前不能用于 Kafka Streams 应用。

Apache Beam 是一种类似的流式数据处理系统,已与 Kafka、Pub/Sub 和 Pub/Sub Lite 集成。您可以使用 Dataflow 以全代管式方式运行 Beam 流水线,也可以在预先存在的 Apache FlinkApache Spark 集群上运行 Beam 流水线。

监控

Kafka 客户端可以读取服务器端指标。在 Pub/Sub Lite 中,与发布者和订阅者行为相关的指标通过 Cloud Monitoring 进行管理,而无需其他配置。

容量管理

Kafka 主题的容量由集群的容量决定。复制、键压缩和批处理设置决定了在 Kafka 集群上处理任何给定主题所需的容量。Kafka 主题的吞吐量受运行代理的机器容量的限制。相比之下,您必须为 Pub/Sub 精简版主题同时定义存储空间容量和吞吐量容量。Pub/Sub Lite 存储容量是主题的可配置属性。吞吐量容量基于已配置的预留的容量,以及每个分区的固有或已配置限制。

身份验证和安全性

Apache Kafka 支持多种开放式身份验证和加密机制。对于 Pub/Sub Lite,身份验证基于 IAM 系统。无论是静态加密还是传输中加密,您都可以确保安全。如需详细了解 Pub/Sub Lite 身份验证,请参阅本文档后面的“迁移工作流”部分。

将 Kafka 属性映射到 Pub/Sub Lite 属性

Kafka 有许多配置选项,用于控制主题结构、限制和代理属性。本部分讨论可用于数据注入的一些常见功能及其在 Pub/Sub Lite 中的等效功能。由于 Pub/Sub Lite 是一个代管式系统,因此您无需考虑许多代理属性。

主题配置属性

Kafka 属性 Pub/Sub Lite 属性 说明
{0} 每个分区的存储空间 精简版主题中的所有分区都具有相同的配置存储容量。精简版主题的总存储容量是该主题中所有分区的存储空间容量总和。
{0} 消息保留期限 精简版主题存储消息的最长时间。如果未指定消息保留期限,精简版主题将存储消息,直到您超出存储空间容量。
<aclass="external" l10n-attrs-original-order="href,class" l10n-encrypted-href="1EnWqBFYsbXCkJvluoFZHWZb6gHWkZLxLSo7Ja3t8sQHgM1RbUvT8FDCmfNOUyfqzabn4M&hl=zh-CN&hl=zh-CN 无法在 Pub/Sub Lite 中配置 除非确保发布的内容持久保留在复制存储空间,否则系统不会确认发布。
{0} 无法在 Pub/Sub Lite 中配置 3.5 MiB 是可以发送到 Pub/Sub Lite 的消息大小上限。消息大小以可重复的方式计算。
{0} 无法在 Pub/Sub Lite 中配置 在使用使用方实现时,系统会选择事件时间戳(如果存在),或改用发布时间戳。使用 Beam 时,发布时间戳和事件时间戳都可用。

如需详细了解精简版主题的属性,请参阅精简版主题的属性

提供方配置属性

Pub/Sub Lite 支持 Producer Wi-Fi 协议。某些属性会更改提供方 Cloud 客户端库的行为;下表讨论了一些常见的属性。

Kafka 属性 Pub/Sub Lite 属性 说明
{0} 无法在 Pub/Sub Lite 中配置 在 Pub/Sub 精简版中,为单个主题创建大致相当于一个使用方群组的主题和订阅。您可以使用控制台、gcloud CLI、API 或 Cloud 客户端库。
无法在 Pub/Sub Lite 中配置

使用 Kafka Producer 或等效库通过有线协议进行通信时是必需的。

{0} Pub/Sub Lite 支持 支持批处理。为获得最佳性能,建议此值为 10 MiB。
{0} Pub/Sub Lite 支持 支持批处理。为获得最佳性能,此值的建议值为 50 毫秒。
{0} Pub/Sub Lite 支持 服务器对每个批次施加 20 MiB 的限制。在 Kafka 客户端中,将此值设置为小于 20 MiB。
<aclass="external" l10n-attrs-original-order="href,class" l10n-crypto-href="9mE3X9aIpBVps4x1lRMwdGZb6gHWkZLxLSo7Ja3t8sRqk6OxyqMTCHV662ootwKEsfidLAxDO6 Pub/Sub Lite 支持
{0} Pub/Sub Lite 中不支持 您必须明确将此值设置为 none

使用方配置属性

Pub/Sub Lite 支持使用方传输协议。某些属性会更改使用方 Cloud 客户端库的行为;下表讨论了一些常见的属性。

Kafka 属性 说明
</a

使用 Kafka Consumer 或等效库通过有线协议进行通信时是必需的。

{0} 此配置不受支持或不需要。创建订阅后,订阅保证具有定义的偏移位置。
{0} 发布时间戳始终可从 Pub/Sub Lite 获取,并保证按分区不递减。事件时间戳可能存在也可能不存在,具体取决于事件时间戳在发布后是否附加到了消息中。使用 Dataflow 时,发布时间戳和事件时间戳同时可用。
</a 对从 Pol() 调用返回的记录数和字节数以及从内部提取请求返回的字节数施加了软限制。1MiB 的“max.partition.fetch.bytes”默认值可能会限制客户端的吞吐量,因此请考虑提高此值。

比较 Kafka 和 Pub/Sub Lite 的功能

下表比较了 Apache Kafka 功能和 Pub/Sub Lite 功能:

功能 Kafka Pub/Sub Lite
消息排序
删除重复信息 有,使用 Dataflow
推送订阅 有,使用 Pub/Sub 导出
交易
消息存储 受可用机器存储空间的限制 无限制
消息重放
Logging 和 Monitoring 自行管理 通过 Cloud Monitoring 自动运行
流处理 支持使用 Kafka StreamsApache BeamDataproc 使用 Beam 或 Dataproc 时可以。

下表比较了哪些功能由 Kafka 自行托管,哪些功能由 Google 通过 Pub/Sub Lite 管理:

功能 Kafka Pub/Sub Lite
适用范围 手动将 Kafka 部署到其他位置。 已部署至全球。请参阅 locations
灾难恢复 设计并维护您自己的备份和复制功能。 由 Google 管理。
基础架构管理 手动部署和运行虚拟机 (VM) 或机器。保持一致的版本控制和补丁。 由 Google 管理。
容量规划 提前手动规划存储和计算需求。 由 Google 管理。您可以随时增加计算和存储空间。
支持 无。 24 小时值班员工和支持服务。

Kafka 与 Pub/Sub Lite 费用比较

Pub/Sub Lite 中估算和管理费用的方式与 Kafka 中不同。本地或云端 Kafka 集群的费用包括机器、磁盘、网络、入站消息和出站消息的费用。还包括管理和维护这些系统及其相关基础架构的开销费用。管理 Kafka 集群时,您必须手动升级机器、规划集群容量以及实施灾难恢复,其中包括广泛的规划和测试。您必须汇总所有这些各种费用才能确定真实的总拥有成本 (TCO)。

Pub/Sub Lite 价格包含预留费用(发布的字节、订阅的字节数、Kafka 代理处理的字节数)和预配存储的费用。除了出站消息费用之外,您还要为预留的资源支付的确切费用。您可以使用价格计算器估算费用。

迁移工作流

如需将主题从 Kafka 集群迁移到 Pub/Sub Lite,请按照以下说明操作。

配置 Pub/Sub Lite 资源

  1. 为要迁移的所有主题创建符合预期吞吐量的 Pub/Sub 精简版预留

    使用 Pub/Sub Lite 价格计算器计算现有 Kafka 主题的汇总吞吐量指标。如需详细了解如何创建预留,请参阅创建和管理精简版预留

  2. 为 Kafka 中的每个相应主题创建一个 Pub/Sub 精简版主题。

    如需详细了解如何创建精简版主题,请参阅创建和管理精简版主题

  3. 为 Kafka 集群中每个相应的使用方组和主题对创建一个 Pub/Sub Lite 订阅。

    例如,对于名为 consumers 且使用 topic-atopic-b 中的内容的使用方群组,您必须创建一个订阅 consumers-a(附加到 topic-a)和一个订阅 consumers-b(附加到 topic-b)。如需详细了解如何创建订阅,请参阅创建和管理精简版订阅

向 Pub/Sub Lite 进行身份验证

根据 Kafka 客户端的类型,选择以下方法之一:

基于 Java 的 Kafka 客户端 3.1.0 或更高版本(通过重新构建)

对于可在运行 Kafka 客户端的实例上重新构建的 3.1.0 或更高版本基于 Java 的 Kafka 客户端:

  1. 安装 com.google.cloud:pubsublite-kafka-auth 软件包。

  2. 借助 com.google.cloud.pubsublite.kafka.ClientParameters.getParams 获取向 Pub/Sub Lite 进行身份验证所必需的参数。

    getParams() 方法(请参阅代码示例)将以下 JAASSASL 配置初始化为参数,以便向 Pub/Sub Lite 进行身份验证:

    security.protocol=SASL_SSL
    sasl.mechanism=OAUTHBEARER
    sasl.oauthbearer.token.endpoint.url=http://localhost:14293
    sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerLoginCallbackHandler
    

运行 3.1.0 或更高版本的基于 Java 的 Kafka 客户端,无需重新构建

对于支持 KIP-768 的 Kafka 客户端,我们支持使用 Python Sidecar 脚本的仅限配置的 OAUTHBEARER 身份验证。这些版本包括 2022 年 1 月的 Java 3.1.0 或更高版本。

在运行 Kafka 客户端的实例上执行以下步骤:

  1. 安装 Python 3.6 或更高版本。

    请参阅安装 Python

  2. 安装 Google 身份验证软件包:pip install google-auth

    此库简化了访问 Google API 的各种服务器到服务器身份验证机制。请参阅 google-auth 页面

  3. 运行 kafka_gcp_credentials.py 脚本。

    此脚本会启动本地 HTTP 服务器,并使用 google.auth.default() 在环境中提取默认的 Google Cloud 凭据。

    提取的凭据中的主帐号必须拥有您正在使用的 Google Cloud 项目以及您要连接到的位置的 pubsublite.locations.openKafkaStream 权限。Pub/Sub Lite Publisher (roles/pubsublite.publisher) 和 Pub/Sub Lite Subscriber (roles/pubsublite.subscriber) 角色具有这项必需的权限。将这些角色添加到您的主帐号

    这些凭据用于 Kafka 客户端的 SASL/OAUTHBEARER 身份验证

    为了从 Kafka 客户端向 Pub/Sub Lite 进行身份验证,您的属性中必须有以下参数:

    security.protocol=SASL_SSL
    sasl.mechanism=OAUTHBEARER
    sasl.oauthbearer.token.endpoint.url=localhost:14293
    sasl.login.callback.handler.class=org.apache.kafka.common.security.oauthbearer.secured.OAuthBearerLoginCallbackHandler
    sasl.jaas.config=org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule \
      required clientId="unused" clientSecret="unused" \
      extension_pubsubProject="PROJECT_ID";
    

    PROJECT_ID 替换为运行 Pub/Sub Lite 的项目的 ID。

所有其他客户端(无需重新构建)

对于所有其他客户端,请执行以下步骤:

  1. 下载要用于客户端的服务帐号的服务帐号密钥 JSON 文件

  2. 使用 base64 编码对服务帐号文件进行编码,将其用作身份验证字符串。

    在 Linux 或 macOS 系统上,您可以使用 base64 命令(通常默认安装),如下所示:

    base64 < my_service_account.json > password.txt
    

    您可以使用以下参数使用密码文件的内容进行身份验证。

    Java

    security.protocol=SASL_SSL
    sasl.mechanism=PLAIN
    sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \
     username="PROJECT_ID" \
     password="contents of base64 encoded password file";
    

    PROJECT_ID 替换为运行 Pub/Sub 的项目的 ID。

    Librdkafka

    security.protocol=SASL_SSL
    sasl.mechanism=PLAIN
    sasl.username=PROJECT_ID
    sasl.password=contents of base64 encoded password file
    

    PROJECT_ID 替换为运行 Pub/Sub 的项目的 ID。

使用 Kafka Connect 克隆数据

Pub/Sub Lite 团队维护 Kafka Connect 接收器的实现。您可以配置此实现,以使用 Kafka Connect 集群将数据从 Kafka 主题复制到 Pub/Sub 精简版主题。

要配置连接器以执行数据复制,请参阅 Pub/Sub 组 Kafka 连接器

如果要确保分区亲和性不受迁移过程的影响,请确保 kafka 主题和 Pub/Sub Lite 主题具有相同的分区数,并且将 pubsublite.ordering.mode 属性设置为 KAFKA。这会使连接器将消息路由到采用与最初发布到的 kafka 分区相同的索引的 Pub/Sub Lite 分区。

迁移使用方

Pub/Sub Lite 的资源模型与 Kafka 的资源模型不同。最值得注意的是,与使用方群组不同,订阅是显式资源,并且仅与一个主题关联。由于存在这种差异,Kafka Consumer API 中任何需要传递 topic 的位置,都必须改为传递完整的订阅路径。

除了 Kafka 客户端的 SASL 配置之外,在使用 Kafka Consumer API 与 Pub/Sub Lite 进行交互时,还需要以下设置。

bootstrap.servers=REGION-kafka-pubsub.googleapis.com:443
group.id=unused

REGION 替换为 Pub/Sub Lite 订阅所在的区域

在启动给定订阅的第一个 Pub/Sub Lite 使用方作业之前,您可以启动(但不等待)管理员搜寻操作,为使用方设置初始位置。

当您启动使用方时,它们会重新连接到消息积压中的当前偏移量。并行运行旧客户端和新客户端(只要验证这些客户端的行为),然后关闭旧使用方客户端。

迁移提供方

除了 Kafka 客户端的 SASL 配置之外,在使用 Kafka Producer API 与 Pub/Sub Lite 交互时,还需要以下作为提供方参数。

bootstrap.servers=REGION-kafka-pubsub.googleapis.com:443

REGION 替换为 Pub/Sub 精简版主题所在的区域

迁移主题的所有使用方以便从 Pub/Sub Lite 读取数据后,移动提供方流量以直接写入 Pub/Sub Lite。

逐步迁移提供方客户端,以向 Pub/Sub Lite 主题(而不是 Kafka 主题)写入数据。

重启提供方客户端以选择新配置。

关闭 Kafka Connect

在您迁移所有提供方以直接写入 Pub/Sub Lite 后,连接器将不再复制数据。

您可以停用 Kafka Connect 实例。

排查 Kafka 连接问题

由于 Kafka 客户端通过定制的传输协议进行通信,因此我们无法为所有请求中的失败情况提供错误消息。参考在消息中发送的错误代码。

您可以通过将 org.apache.kafka 前缀的日志记录级别设置为 FINEST,详细了解客户端中发生的错误。

吞吐量低,积压作业不断增加

有多种原因可能会导致吞吐量较低且积压量不断增加。其中一个原因可能是容量不足。

您可以在主题级层或使用预留来配置吞吐量容量。如果为订阅和发布配置的吞吐量容量不足,则会限制订阅和发布的相应吞吐量。

此吞吐量错误由 topic/flow_control_status 指标(针对发布者)和 subscription/flow_control_status 指标(针对订阅者)来表示。该指标提供以下状态:

  • NO_PARTITION_CAPACITY:此消息表示已达到每个分区的吞吐量限制。

  • NO_RESERVATION_CAPACITY:此消息表示已达到每个预留的吞吐量限制。

您可以查看主题或预留发布和订阅配额的利用率图表,并检查利用率是否达到或接近 100%。

如需解决此问题,请增加主题或预留的吞吐量容量

主题授权失败错误消息

如需使用 Kafka API 进行发布,精简版服务代理必须具有发布到 Pub/Sub Lite 主题的适当权限。

如果您没有适当的权限来发布到 Pub/Sub Lite 主题,则会在客户端中收到错误 TOPIC_AUTHORIZATION_FAILED

如需解决此问题,请检查项目的精简版服务代理是否已通过身份验证配置。

主题无效错误消息

如果使用 Kafka API 进行订阅,则需要在 Kafka Consumer API 中需要 topic 的所有位置传递完整订阅路径。

如果您未传递格式正确的订阅路径,则会在消费者客户端中收到错误 INVALID_TOPIC_EXCEPTION

未使用预留时的请求无效

如果支持 kafka Wi-Fi 协议,则所有主题都必须有关联的预留才能收取使用费。