19.2. 最適化ゴールの概要
最適化ゴールは、Kafka クラスター全体のワークロード再分散およびリソース使用の制約です。Cruise Control は Kafka クラスターをリバランスするために、最適化ゴールを使用して、承認または拒否可能な 最適化プロポーザル を生成します。
19.2.1. 優先度によるゴールの順序
Streams for Apache Kafka は、Cruise Control プロジェクトで開発された最適化ゴールのほとんどをサポートしています。以下に、サポートされるゴールをデフォルトの優先度順に示します。
- ラックアウェアネス (Rack Awareness)
- 一連のトピックに対するブローカーごとのリーダーレプリカの最小数
- レプリカの容量
容量ゴール
- ディスク容量
- ネットワークのインバウンド容量
- ネットワークアウトバウンド容量
- CPU 容量
- レプリカの分散
- 潜在的なネットワーク出力
リソース配分ゴール
- ディスク使用率の分散
- ネットワークインバウンド使用率の分散
- ネットワークアウトバウンド使用率の分散
- CPU 使用率の分散
- リーダーへの単位時間あたりバイト流入量の分布
- トピックレプリカの分散
- リーダーレプリカの分散
- 優先リーダーエレクション
- ブローカー内のディスク容量
- ブローカー内のディスク使用量の分散
各最適化ゴールの詳細は、Cruise Control Wiki の Goals を参照してください。
独自のゴールの記述および Kafka アサイナーゴールはまだサポートされていません。
19.2.2. Streams for Apache Kafka カスタムリソースでのゴールの設定
Kafka
および KafkaRebalance
カスタムリソースで最適化ゴールを設定します。Cruise Control には、満たなければならない厳しい最適化ゴールのほか、メイン、デフォルト、およびユーザーが指定した最適化ゴールの設定があります。
最適化ゴールは、以下の設定で指定できます。
-
Main goals —
Kafka.spec.cruiseControl.config.goals
-
Hard goals —
Kafka.spec.cruiseControl.config.hard.goals
-
Default goals —
Kafka.spec.cruiseControl.config.default.goals
-
ユーザー提供のゴール —
KafkaRebalance.spec.goals
リソース配分ゴールは、ブローカーリソースの 容量制限 の影響を受けます。
19.2.3. ハードおよびソフト最適化ゴール
ハードゴールは最適化プロポーザルで 必ず 満たさなければならないゴールです。Cruise Control コードで ハードゴール として定義されていないゴールは、ソフトゴール と呼ばれます。ソフトゴールは ベストエフォート 型のゴールと解釈できます。最適化プロポーザルで満たす必要はありませんが、最適化の計算に含まれます。すべてのハードゴールを満たし、1 つ以上のソフトゴールに違反する最適化プロポーザルは有効です。
Cruise Control は、すべてのハードゴールを満たし、優先度順にできるだけ多くのソフトゴールを満たす最適化プロポーザルを算出します。すべてのハードゴールを満たさない最適化プロポーザルは Cruise Control によって拒否され、ユーザーには送信されません。
たとえば、クラスター全体でトピックのレプリカを均等に分散するソフトゴールがあるとします (トピックレプリカ分散のゴール)。このソフトゴールを無視すると、設定されたハードゴールがすべて有効になる場合、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 が有効な最適化プロポーザルを生成する可能性が低くなります。
skipHardGoalCheck: true
が KafkaRebalance
カスタムリソースに指定された場合、Cruise Control はユーザー提供の最適化ゴールのリスト (KafkaRebalance.spec.goals
内) に設定済みのハードゴール (hard.goals
) がすべて含まれていることをチェックしません。そのため、すべてではなく一部のユーザー提供の最適化ゴールが hard.goals
リストにある場合、skipHardGoalCheck: true
が指定されていてもハードゴールとして処理されます。
19.2.4. メイン最適化ゴール
メイン最適化ゴールはすべてのユーザーが使用できます。メイン最適化ゴールにリストされていないゴールは、Cruise Control 操作で使用できません。
Cruise Control の デプロイメント設定 を変更しない限り、Streams for Apache Kafka は、次のメイン最適化ゴールを優先度順 (降順) に Cruise Control から継承します。
RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal; ReplicaDistributionGoal; PotentialNwOutGoal; DiskUsageDistributionGoal; NetworkInboundUsageDistributionGoal; NetworkOutboundUsageDistributionGoal; CpuUsageDistributionGoal; TopicReplicaDistributionGoal; LeaderReplicaDistributionGoal; LeaderBytesInDistributionGoal; PreferredLeaderElectionGoal
これらの目標の一部は、ハードゴール として事前設定されています。
複雑さを軽減するため、1 つ以上のゴールを KafkaRebalance
リソースでの使用から完全に 除外する必要がある場合を除き、継承される主な最適化ゴールを使用することが推奨されます。必要な場合、メイン最適化ゴールの優先順位は デフォルトの最適化ゴール の設定で変更できます。
Cruise Control のデプロイメント設定で、必要に応じてメインの最適化ゴールを設定します ( Kafka.spec.cruiseControl.config.goals
)。
-
継承された主な最適化ゴールを許可する場合は、
goals
プロパティーをKafka.spec.cruiseControl.config
に指定しないでください。 -
継承した主な最適化ゴールを変更する必要がある場合は、
goals
設定オプションで、優先順位の高い順に目標のリストを指定します。
最適化提案を生成する際のエラーを回避するには、Kafka.spec.cruiseControl.config
の goals
または default.goals
に加えた変更には、hard.goals
プロパティーに指定されたすべてのハードゴールが含まれていることを確認してください。明確にするために、主要な最適化ゴールとデフォルトの目標に対して、ハードゴールも (サブセットとして) 指定する必要があります。
19.2.5. デフォルトの最適化ゴール
Cruise Conrol はデフォルトの最適化ゴール を使用して キャッシュされた最適化プロポーザル を生成します。キャッシュされた最適化プロポーザルの詳細は、「最適化プロポーザルの概要」 を参照してください。
ユーザー提供の最適化ゴール を 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
カスタムリソースに追加します。「最適化プロポーザルの生成」 を参照してください。
関連情報
- Configuring and deploying Cruise Control with Kafka
- Cruise Control Wiki の Configurations