19.2. 优化目标概述
优化目标是在 Kafka 集群中重新发布工作负载和资源利用率的限制。要重新平衡 Kafka 集群,Cruise Control 使用优化目标来 生成优化建议,您可以批准或拒绝。
19.2.1. 优先级的目标顺序
Apache Kafka 的流支持在 Cruise Control 项目中开发的大多数优化目标。支持的目标(以优先级默认降序排列)如下:
- 机架感知性
- 每个代理对一组主题的最小领导副本数
- 副本容量
容量目标
- 磁盘容量
- 网络入站容量
- 网络出站容量
- CPU 容量
- 副本分发
- 潜在的网络输出
资源分布目标
- 磁盘使用分布
- 网络入站使用分布
- 网络出站使用分布
- CPU 使用率分布
- 领导字节速率分布
- 主题副本分发
- 领导副本分发
- 首选领导选举机制
- intra-broker 磁盘容量
- intra-broker 磁盘用量分布
有关每个优化目标的更多信息,请参阅 Cruise Control Wiki 中的目标。
"编写您自己的"目标,还不支持 Kafka 分配器目标。
19.2.2. Apache Kafka 自定义资源的 Streams 中的目标配置
您可以在 Kafka
和 KafkaRebalance
自定义资源中配置优化目标。Cruise Control 具有硬优化目标的配置,必须满足以及主要、默认和用户提供的优化目标。
您可以在以下配置中指定优化目标:
-
主目标 categories-
Kafka.spec.cruiseControl.config.goals
-
Hard goals —
Kafka.spec.cruiseControl.config.hard.goals
-
Default goals —
Kafka.spec.cruiseControl.config.default.goals
-
用户提供的目标 iwl -
KafkaRebalance.spec.goals
资源分布目标取决于代理资源的 容量限制。
19.2.3. 硬和软优化目标
硬目标是在优化提议时 必须满足 的目标。在 Cruise 控制代码中没有定义为 硬目标 的目标被称为 软目标。您可以将软目标视为 最佳工作 目标: 它们不需要 在优化建议中满足,但包含在优化计算中。违反了一个或多个软目标的优化建议,但满足所有硬目标是有效的。
Cruise Control 将计算满足所有硬目标以及尽可能多的软目标(按优先级顺序)的优化建议。无法满足所有硬目标的优化建议将由 Cruise 控制而拒绝,而不会发送给用户进行批准。
例如,您可能有一个软目标来在集群间平均分配主题的副本(主题分布目标)。如果这样做可让所有配置的硬目标满足,则 Cruise Control 将忽略这个目标。
在 Cruise Control 中,以下 主要优化目标 是硬目标:
RackAwareGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal
在 Cruise Control 部署配置中,您可以使用 Kafka.spec.cruiseControl.config
中的 hard.goals
属性指定强制哪个硬目标。
-
要强制执行所有硬目标,只需省略
hard.goals
属性。 -
要更改用于 Cruise Control 强制执行的硬目标,请使用其完全限定的域名在
hard.goals
属性中指定所需的目标。 -
要防止执行特定硬目标,请确保目标没有包含在
default.goals
和hard.goals
列表中配置中。
无法配置哪些目标被视为软或硬目标。这种区别由 Cruise Control 代码决定。
硬优化目标的 Kafka
配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: topicOperator: {} userOperator: {} cruiseControl: brokerCapacity: inboundNetwork: 10000KB/s outboundNetwork: 10000KB/s config: # Note that `default.goals` (superset) must also include all `hard.goals` (subset) default.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal hard.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal # ...
增加配置的硬目标数量将降低 Cruise Control 生成有效优化方案的可能性。
如果在 KafkaRebalance
自定义资源中指定 skipHardGoalCheck: true
,Cruise Control 不会检查 用户提供的优化目标(在 KafkaRebalance.spec.goals
)列表是否包含 所有配置的 硬目标(hard.goals
)。因此,如果有些,但不是所有的,则用户提供的优化目标都位于 hard.goals
列表中,Cruise Control 仍会将其视为硬目标,即使指定了 skipHardGoalCheck: true
。
19.2.4. 主要优化目标
所有用户都提供了主要的优化目标。没有在主优化目标中列出的目标在 Cruise Control 操作中不可用。
除非更改了 Cruise Control 部署配置,否则 Apache Kafka 的 Streams 将从 Cruise Control 中继承以下主要优化目标,以降序排列:
RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal; ReplicaDistributionGoal; PotentialNwOutGoal; DiskUsageDistributionGoal; NetworkInboundUsageDistributionGoal; NetworkOutboundUsageDistributionGoal; CpuUsageDistributionGoal; TopicReplicaDistributionGoal; LeaderReplicaDistributionGoal; LeaderBytesInDistributionGoal; PreferredLeaderElectionGoal
其中一些目标被预先设置为硬目标。
要降低复杂性,我们建议您使用继承的主要优化目标,除非您需要 完全 排除 KafkaRebalance
资源中使用的一个或多个目标。如果需要,可以在配置中为默认优化目标修改主要优化目标的优先级顺序(如果需要)。
如果需要,您可以在 Cruise Control 部署配置中配置主要优化目标: Kafka.spec.cruiseControl.config.goals
-
要接受继承的主要优化目标,请不要在
Kafka.spec.cruiseControl.config
中指定goals
属性。 -
如果您需要修改继承的主要优化目标,请在
goals
配置选项中指定目标列表(按优先级降序排列)。
为了避免在生成优化建议时出现错误,请确保对 Kafka.spec.cruiseControl.config
中的 goals
或 default.goals
的更改包含为 hard.goals
属性指定的所有硬目标。为了说明这一点,还必须为主要优化目标和默认目标指定硬目标(作为子集)。
19.2.5. 默认优化目标
Cruise Control 使用默认优化目标来生成缓存的优化建议。有关缓存的优化建议的详情,请参考 第 19.3 节 “优化提议概述”。
您可以通过在 KafkaRebalance
自定义资源中设置 用户提供的优化目标 来覆盖默认的优化目标。
除非在 Cruise Control 部署配置中 指定 default.goals
,否则主要优化目标将用作默认优化目标。在这种情况下,缓存的优化方案是使用主要优化目标生成的。
-
要将主要优化目标用作默认目标,请不要在
Kafka.spec.cruiseControl.config
中指定default.goals
属性。 -
要修改默认优化目标,请编辑
Kafka.spec.cruiseControl.config
中的default.goals
属性。您必须使用主要优化目标的子集。
默认优化目标的 Kafka
配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: topicOperator: {} userOperator: {} cruiseControl: brokerCapacity: inboundNetwork: 10000KB/s outboundNetwork: 10000KB/s config: # Note that `default.goals` (superset) must also include all `hard.goals` (subset) default.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal hard.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal # ...
如果没有指定默认优化目标,则使用主优化目标生成缓存的提议。
19.2.6. 用户提供的优化目标
用户提供的优化目标 会缩小为特定优化提议配置的默认目标。您可以根据需要在 KafkaRebalance
自定义资源的 spec.goals
中设置它们:
KafkaRebalance.spec.goals
用户提供的优化目标可以为不同的场景生成优化建议。例如,您可能想要在不考虑磁盘容量或磁盘利用率的情况下在 Kafka 集群中优化领导副本分布。因此,您可以创建一个 KafkaRebalance
自定义资源,其中包含对领导副本分发的单个用户提供的目标。
用户提供的优化目标必须:
- 包括所有配置的硬目标,或发生错误
- 是主要优化目标的子集
要在生成优化建议时忽略配置的硬目标,请将 skipHardGoalCheck: true
属性添加到 KafkaRebalance
自定义资源中。请参阅 第 19.6 节 “生成优化建议”。
其他资源
- 使用 Kafka 配置和部署 Cruise 控制
- Cruise Control Wiki 中的配置。