8.2. 最適化ゴールの概要

Cruise Control は Kafka クラスターをリバランスするために、最適化ゴールを使用して、承認または拒否可能な最適化プロポーザルを生成します。

最適化ゴールは、Kafka クラスター全体のワークロード再分散およびリソース使用の制約です。AMQ Streams は、Cruise Control プロジェクトで開発された最適化ゴールのほとんどをサポートします。以下に、サポートされるゴールをデフォルトの優先度順に示します。

  1. ラックアウェアネス (Rack Awareness)
  2. トピックのセットに対するブローカーごとのリーダーレプリカの最小数
  3. レプリカの容量
  4. 容量: ディスク容量、ネットワークインバウンド容量、ネットワークアウトバウンド容量、CPU 容量
  5. レプリカの分散
  6. 潜在的なネットワーク出力
  7. リソース分散: ディスク使用率の分散、ネットワークインバウンド使用率の分散、ネットワークアウトバウンド使用率の分散、CPU 使用率の分散。

    注記

    リソース分散ゴールは、ブローカーリソースで 容量制限 を使用して制御されます。

  8. リーダーへの単位時間あたりバイト流入量の分散
  9. トピックレプリカの分散
  10. リーダーレプリカの分散
  11. 優先リーダーの選択

各最適化ゴールの詳細は、Cruise Control Wiki の「Goals」を参照してください。

注記

ブローカー内ディスクゴール、独自のゴール、および Kafka アサイナーゴールはサポートされていません。

AMQ Streams カスタムリソースでのゴールの設定

Kafka および KafkaRebalance カスタムリソースで最適化ゴールを設定します。Cruise Control には、必ず満たさなければならない ハード 最適化ゴールの設定と、メインデフォルト、および ユーザー提供の最適化ゴールの設定があります。リソースディストリビューションの最適化ゴール (ディスク、ネットワークインバウンド、ネットワークアウトバウンド、および CPU) は、ブローカーリソースの 容量制限 の対象となります。

以下のセクションでは、各ゴール設定の詳細を説明します。

ハードゴールおよびソフトゴール

ハードゴールは最適化プロポーザルで必ず満たさなければならないゴールです。ハードゴールとして設定されていないゴールはソフトゴールと呼ばれます。ソフトゴールは ベストエフォート 型のゴールと解釈できます。最適化プロポーザルで満たす必要はありませんが、最適化の計算に含まれます。すべてのハードゴールを満たし、1 つ以上のソフトゴールに違反する最適化プロポーザルは有効です。

Cruise Control は、すべてのハードゴールを満たし、優先度順にできるだけ多くのソフトゴールを満たす最適化プロポーザルを算出します。すべてのハードゴールを満たさない最適化プロポーザルは Cruise Control によって拒否され、ユーザーには送信されません。

注記

たとえば、クラスター全体でトピックのレプリカを均等に分散するソフトゴールがあるとします (トピックレプリカ分散のゴール)。このソフトゴールを無視すると、設定されたハードゴールがすべて有効になる場合、Cruise Control はこのソフトゴールを無視します。

Cruise Control では、以下のメイン最適化ゴールがハードゴールとして事前設定されています。

RackAwareGoal; MinTopicLeadersPerBrokerGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal

Kafka.spec.cruiseControl.confighard.goals プロパティーを編集し、Cruise Control のデプロイメント設定でハードゴールを設定します。

  • Cruise Control から事前設定されたハードゴールを継承する場合は、Kafka.spec.cruiseControl.confighard.goals プロパティーを指定しないでください。
  • 事前設定されたハードゴールを変更するには、完全修飾ドメイン名を使用して、希望のゴールを hard.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:
      hard.goals: >
        com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkInboundCapacityGoal,
        com.linkedin.kafka.cruisecontrol.analyzer.goals.NetworkOutboundCapacityGoal
      # ...

ハードゴールの数を増やすと、Cruise Control が有効な最適化プロポーザルを生成する可能性が低くなります。

skipHardGoalCheck: trueKafkaRebalance カスタムリソースに指定された場合、Cruise Control はユーザー提供の最適化ゴールのリスト (KafkaRebalance.spec.goals 内) に設定済みのハードゴール (hard.goals) がすべて含まれていることをチェックしません。そのため、すべてではなく一部のユーザー提供の最適化ゴールが hard.goals リストにある場合、skipHardGoalCheck: true が指定されていてもハードゴールとして処理されます。

メイン最適化ゴール

メイン最適化ゴールはすべてのユーザーが使用できます。メイン最適化ゴールにリストされていないゴールは、Cruise Control 操作で使用できません。

Cruise Control の デプロイメント設定を変更しない限り、AMQ Streams は以下のメイン最適化ゴールを優先度順 (降順) に Cruise Control から継承します。

RackAwareGoal; ReplicaCapacityGoal; DiskCapacityGoal; NetworkInboundCapacityGoal; NetworkOutboundCapacityGoal; CpuCapacityGoal; ReplicaDistributionGoal; PotentialNwOutGoal; DiskUsageDistributionGoal; NetworkInboundUsageDistributionGoal; NetworkOutboundUsageDistributionGoal; CpuUsageDistributionGoal; TopicReplicaDistributionGoal; LeaderReplicaDistributionGoal; LeaderBytesInDistributionGoal; PreferredLeaderElectionGoal

これらのゴールの 6 個が ハードゴール として事前設定されます。

複雑さを軽減するため、1 つ以上のゴールを KafkaRebalance リソースでの使用から完全に 除外する必要がある場合を除き、継承される主な最適化ゴールを使用することが推奨されます。必要な場合、メイン最適化ゴールの優先順位は デフォルトの最適化ゴール の設定で変更できます。

Cruise Control のデプロイメント設定で、必要に応じてメインの最適化ゴールを設定します( Kafka.spec.cruiseControl.config.goals)。

  • 継承された主な最適化ゴールを許可する場合は、goals プロパティーを Kafka.spec.cruiseControl.config に指定しないでください。
  • 継承した主な最適化目標を変更する必要がある場合は、goals設定オプションで、優先順位の高い順に目標のリストを指定します。
注記

継承された主な最適化ゴールを変更する場合、Kafka.spec.cruiseControl.confighard.goals プロパティーに設定されたハードゴールがあれば、設定済みの主な最適化ゴールのサブセットになるようにする必要があります。そうでないと、最適化プロポーザルの生成時にエラーが発生します。

デフォルトの最適化ゴール

Cruise Conrol はデフォルトの最適化ゴール を使用して キャッシュされた最適化プロポーザル を生成します。キャッシュされた最適化プロポーザルの詳細は、「最適化プロポーザルの概要」 を参照してください。

ユーザー提供の最適化ゴールKafkaRebalance カスタムリソースに設定すると、デフォルトの最適化ゴールを上書きできます。

Cruise Control のデプロイメント設定default.goalsを指定しない限り、メインの最適化目標がデフォルトの最適化目標として使用されます。この場合、メイン最適化ゴールを使用して、キャッシュされた最適化プロポーザルが生成されます。

  • 主な最適化目標をデフォルトの目標として使用するには、Kafka.spec.cruiseControl.configdefault.goalsプロパティを指定しないでください。
  • デフォルトの最適化ゴールを編集するには、Kafka.spec.cruiseControl.configdefault.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:
      default.goals: >
         com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal,
         com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal,
         com.linkedin.kafka.cruisecontrol.analyzer.goals.DiskCapacityGoal
      # ...

デフォルトの最適化ゴールの指定がない場合、メイン最適化ゴールを使用して、キャッシュされたプロポーザルが生成されます。

ユーザー提供の最適化ゴール

ユーザー提供の最適化ゴールは、特定の最適化プロポーザルの設定済みのデフォルトゴールを絞り込みます。必要に応じて、KafkaRebalanceのカスタムリソースのspec.goalsで設定することができます。

KafkaRebalance.spec.goals

ユーザー提供の最適化ゴールは、さまざまな状況の最適化プロポーザルを生成できます。たとえば、ディスクの容量やディスクの使用率を考慮せずに、Kafka クラスター全体でリーダーレプリカの分布を最適化したい場合があります。この場合、リーダーレプリカ分布の単一のユーザー提供ゴールが含まれる KafkaRebalance カスタムリソースを作成します。

ユーザー提供の最適化ゴールには以下が必要になります。

  • 設定済みのハードゴールがすべて含まれるようにする必要があります。そうでないと、エラーが発生します。
  • メイン最適化ゴールのサブセットである必要があります。

最適化プロポーザルの生成時に設定済みのハードゴールを無視するには、skipHardGoalCheck: true プロパティーを KafkaRebalance カスタムリソースに追加します。「最適化プロポーザルの生成」 を参照してください。

その他のリソース