作者:Paolo Patierno
扩展或缩减 Apache Kafka 集群有助于实现各种目标并带来诸多好处。通过添加新的代理来扩展集群,可以使集群处理来自客户端的更高数据负载。当需求较低时,通过移除代理来缩减集群可以降低成本和能耗。但如果自动进行集群伸缩,例如利用 Kubernetes 中的 HPA(水平 Pod 自动缩放器),则更有意义。扩展后,问题在于集群不平衡,新的代理空闲。这需要重新平衡主题分区,以便在所有旧代理和新代理之间平均分配负载。另一方面,如果要移除的代理托管主题分区,则可能无法缩减集群,除非我们愿意接受离线副本并牺牲高可用性 (HA)。在这两种情况下,使用 Strimzi 中的 Cruise Control 集成来重新平衡集群是解决方案。自动执行此操作使流程更加轻松,这就是我们将在本博文中讨论的内容。
目前的伸缩和再均衡方式
扩展 Kafka 集群时,新添加的代理不会获得其他代理上托管的主题的任何分区。新代理保持空闲状态,并将根据 Apache Kafka 的分发机制接收新创建主题的分区。通常,这不是你想要的,因为你扩展集群是为了在更多代理之间分配负载并获得更好的性能。目前,使用 Strimzi 实现此目的的唯一方法是使用 KafkaRebalance 自定义资源以 add-brokers 模式手动重新平衡集群,你需要列出添加的代理并指定 Cruise Control 要达成的目标。这样,一些已存在的主题分区将从旧代理移动到新代理,使集群更加平衡。
缩减集群时,由于这些代理托管主题分区,集群操作器可能会阻止移除代理的操作,而立即关闭将导致离线副本和 HA 丢失。为了继续进行,在缩减集群之前,可以使用 KafkaRebalance 自定义资源(使用 remove-brokers 模式列出要移除的代理)和目标来运行手动再均衡。这样,Cruise Control 会将分区从要移除的代理移动出去,以便它们变为空闲状态并可以缩减。
有关如何执行此操作的更多详细信息,请参阅与 Strimzi 中的 Cruise Control 集成相关的官方文档[1]。
虽然上述两种方法都有效,但该过程实际上仍然是手动的,并且分为两个单独的步骤:
扩展集群,然后使用 add-brokers 模式运行再均衡。 使用 remove-brokers 模式运行再均衡,然后缩减集群。
如果可以自动化此过程呢?如果集群操作器在扩展操作之后立即运行再均衡,或者在缩减集群之前运行再均衡呢?新的 Strimzi 0.44.0 版本为你带来了集群伸缩自动再均衡功能!
集群伸缩自动再均衡功能来救援!
可以通过 Kafka 自定义资源中 cruiseControl 部分的新 autoRebalance 属性完全配置启用自动再均衡。
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
cruiseControl:
# ...
autoRebalance:
- mode: add-brokers
template:
name: my-add-brokers-rebalancing-template
- mode: remove-brokers
template:
name: my-remove-brokers-rebalancing-template
在上面的示例中,在 autoRebalance 部分中,用户可以指定自动再均衡的“时间”:在扩展(使用 add-brokers 模式)和/或缩减(使用 remove-broker 模式)时。不必同时拥有两者;你可以决定在扩展时进行自动再均衡,但在缩减时不进行,反之亦然。对于每种模式,都可以指定再均衡配置“template”的名称。这只是一个 KafkaRebalance 自定义资源,应用了新的 strimzi.io/rebalance-template: true 注解,这使其成为在自动再均衡操作期间使用的配置模板,而不是要运行的实际再均衡请求。
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaRebalance
metadata:
name: my-rebalance-template
annotations:
strimzi.io/rebalance-template: "true" # specifies that this KafkaRebalance is a rebalance configuration template
spec:
# NOTE: mode and brokers fields, if set, will be just ignored because they are
# automatically set on the corresponding KafkaRebalance by the operator
goals:
- CpuCapacityGoal
- NetworkInboundCapacityGoal
- DiskCapacityGoal
- RackAwareGoal
- MinTopicLeadersPerBrokerGoal
- NetworkOutboundCapacityGoal
- ReplicaCapacityGoal
skipHardGoalCheck: true
# ... other rebalancing related configuration
对于这两种伸缩操作,配置模板可以相同,或者用户可以决定使用不同的模板。将 KafkaRebalance 自定义资源用作模板是一种使 Strimzi 用户生活更轻松的方法,因为他们已经知道它在与 Cruise Control 集成方面的运作方式。除了应用模板注释和不指定 mode 和 brokers 等字段之外,无需学习任何新内容,因为 Strimzi 操作器在运行自动再均衡时会自动设置这些字段。实际上,当需要运行自动再均衡时,集群操作器会从模板开始,并使用该配置创建一个实际的 KafkaRebalance 自定义资源,并添加正确的 mode 和 brokers 属性。
在下面的 shell 代码片段中,你可以看到两个自动再均衡操作中涉及的 KafkaRebalance 资源。第一个是关于扩展,下一个是关于缩减。它显示了当操作器与 Cruise Control 交互以运行再均衡时,KafkaRebalance 资源如何经历通常的状态。
NAME CLUSTER TEMPLATE STATUS
my-add-brokers-rebalancing-template my-cluster true
my-remove-brokers-rebalancing-template my-cluster true
...
my-cluster-auto-rebalancing-add-brokers my-cluster PendingProposal
my-cluster-auto-rebalancing-add-brokers my-cluster ProposalReady
my-cluster-auto-rebalancing-add-brokers my-cluster Rebalancing
my-cluster-auto-rebalancing-add-brokers my-cluster Ready
...
...
my-cluster-auto-rebalancing-remove-brokers my-cluster ProposalReady
my-cluster-auto-rebalancing-remove-brokers my-cluster Rebalancing
my-cluster-auto-rebalancing-remove-brokers my-cluster Ready
你还可以从 Kafka 自定义资源中的 status 部分以及操作器创建的特定 KafkaRebalance 实例中获取自动再均衡进度。
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
# ...
cruiseControl:
# ...
autoRebalance:
# ...
status:
autoRebalance:
lastTransitionTime: "2024-10-24T10:46:10.759494479Z"
modes:
- brokers:
- 6
- 7
mode: remove-brokers
state: RebalanceOnScaleUp
如果你想观看集群自动伸缩一起运行的自动再均衡,你可以观看 KubeCon NA 2025 会议,Elastic Data Streaming: Autoscaling Apache Kafka[2],由 Jakub Scholz 主讲。
总结
伸缩 Apache Kafka 集群在提高性能和节省成本和能耗方面都起着重要作用。但是,仅仅伸缩并不能自行带来所有优势,它需要再均衡过程的支持,以便获得更均衡的集群,从而在所有代理之间分配负载。拥有一个自动执行此操作的机制是使你的集群能够更具弹性地伸缩的关键,正如 Jakub Scholz 在此视频[3]中所演示的那样。我们希望此新功能对 Strimzi 用户有所帮助,并鼓励你尝试一下。Kafka 和 Cruise Control 之间更好的集成是 Strimzi 项目的长期目标之一,这将允许某种 Kafka 自动驾驶模式,而这是朝着这个方向迈出的重要一步。请告诉我们它的运作方式、遇到的任何问题或你可能有的任何建议。期待收到我们心爱的社区的反馈!
文档: https://strimzi.io/docs/operators/latest/deploying#cruise-control-concepts-str
[2]Elastic Data Streaming: Autoscaling Apache Kafka: https://www.youtube.com/watch?v=pj6eLTC2tv8
[3]视频: https://www.youtube.com/watch?v=b8JZpom-67I
点击【阅读原文】阅读网站原文。
CNCF概况(幻灯片)
扫描二维码联系我们!
CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请关注CNCF微信公众号。