第8章 Cruise Control によるクラスターのリバランス
Cruise Control を AMQ Streams クラスターにデプロイし、Kafka クラスターのリバランスに使用できます。
Cruise Control は、クラスターワークロードの監視、事前定義の制約を基にしたクラスターのリバランス、異常の検出および修正などの Kafka の操作を自動化するオープンソースのシステムです。Cruise Control は Load Monitor、Analyzer、Anomaly Detector、および Executor の主な 4 つのコンポーネントと、クライアントの対話に使用される REST API で構成されます。AMQ Streams は REST API を使用して、以下の Cruise Control 機能をサポートします。
- 複数の最適化ゴールから、最適化プロポーザルを生成します。
- 最適化プロポーザルを基にして Kafka クラスターのリバランスを行います。
異常検出、通知、独自ゴールの作成、トピックレプリケーション係数の変更などの、その他の Cruise Control の機能は現在サポートされていません。
Cruise Control の サンプル YAML ファイルは、examples/cruise-control/
にあります。
8.1. Cruise Control とは
Cruise Control は、分散された Kafka クラスターを効率的に実行するための時間および労力を削減します。
通常、クラスターの負荷は時間とともに不均等になります。大量のメッセージトラフィックを処理するパーティションは、使用可能なブローカー全体で不均等に分散される可能性があります。クラスターを再分散するには、管理者はブローカーの負荷を監視し、トラフィックの多いパーティションを容量に余裕のあるブローカーに手作業で再割り当てします。
Cruise Control はクラスターのリバランス処理を自動化します。CPU、ディスク、およびネットワーク負荷を基にして、クラスターにおけるリソース使用のワークロードモデルを構築し、パーティションの割り当てをより均等にする、最適化プロポーザル (承認または拒否可能) を生成します。これらのプロポーザルの算出には、設定可能な最適化ゴールが複数使用されます。
最適化プロポーザルを承認すると、Cruise Control はそのプロポーザルを Kafka クラスターに適用します。クラスターのリバランス操作が完了すると、ブローカー Pod はより効率的に使用され、Kafka クラスターはより均等に分散されます。
その他のリソース
8.2. 最適化ゴールの概要
Cruise Control は Kafka クラスターをリバランスするために、最適化ゴールを使用して、承認または拒否可能な最適化プロポーザルを生成します。
最適化ゴールは、Kafka クラスター全体のワークロード再分散およびリソース使用の制約です。AMQ Streams は、Cruise Control プロジェクトで開発された最適化ゴールのほとんどをサポートします。以下に、サポートされるゴールをデフォルトの優先度順に示します。
- ラックアウェアネス (Rack Awareness)
- トピックのセットに対するブローカーごとのリーダーレプリカの最小数
- レプリカの容量
- 容量: ディスク容量、ネットワークインバウンド容量、ネットワークアウトバウンド容量、CPU 容量
- レプリカの分散
- 潜在的なネットワーク出力
リソース分散: ディスク使用率の分散、ネットワークインバウンド使用率の分散、ネットワークアウトバウンド使用率の分散、CPU 使用率の分散。
注記リソース分散ゴールは、ブローカーリソースで 容量制限 を使用して制御されます。
- リーダーへの単位時間あたりバイト流入量の分散
- トピックレプリカの分散
- リーダーレプリカの分散
- 優先リーダーの選択
各最適化ゴールの詳細は、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.config
の hard.goals
プロパティーを編集し、Cruise Control のデプロイメント設定でハードゴールを設定します。
-
Cruise Control から事前設定されたハードゴールを継承する場合は、
Kafka.spec.cruiseControl.config
にhard.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: true
が KafkaRebalance
カスタムリソースに指定された場合、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.config
の hard.goals
プロパティーに設定されたハードゴールがあれば、必ず設定したマスター継承ゴールのサブセットになるように確認してください。そうでないと、最適化プロポーザルの生成時にエラーが発生します。
デフォルトの最適化ゴール
Cruise Conrol はデフォルトの最適化ゴール を使用して キャッシュされた最適化プロポーザル を生成します。キャッシュされた最適化プロポーザルの詳細は、「最適化プロポーザルの概要」 を参照してください。
ユーザー提供の最適化ゴール を KafkaRebalance
カスタムリソースに設定すると、デフォルトの最適化ゴールを上書きできます。
Cruise Control のデプロイメント設定に default.goals
を指定しない限り、マスター最適化ゴールがデフォルトの最適化ゴールとして使用されます。この場合、マスター最適化ゴールを使用して、キャッシュされた最適化プロポーザルが生成されます。
-
マスター最適化ゴールをデフォルトのゴールとして使用する場合は、
default.goals
プロパティーをKafka.spec.cruiseControl.config
に指定しないでください。 -
デフォルトの最適化ゴールを編集するには、
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: 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
カスタムリソースに追加します。「最適化プロポーザルの生成」 を参照してください。
その他のリソース
- 「Cruise Control の設定」
- Cruise Control Wiki の「Configurations」
8.3. 最適化プロポーザルの概要
最適化プロポーザルは、パーティションのワークロードをブローカー間でより均等に分散することで、Kafka クラスターの負荷をより均等にするために提案された変更の概要です各最適化プロポーザルは、そのプロポーザルの生成に使用された 最適化ゴール のセットが基になっており、ブローカーリソースの設定済みの容量制限 の対象になります。
最適化プロポーザルは KafkaRebalance
カスタムリソースの Status.Optimization Result
プロパティーに含まれます。提供される情報は完全な最適化プロポーザルの概要になります。概要を使用して以下を決定します。
- 最適化プロポーザルの承認。プロポーザルを Kafka クラスターに適用し、クラスターリバランス操作を開始するよう Cruise Control が指示されます。
- 最適化プロポーザルの拒否。最適化ゴールを変更し、別のプロポーザルを生成できます。
最適化プロポーザルはすべてドライランです。最適化プロポーザルを最初に生成しないと、クラスターのリバランスを承認できません。生成できる最適化プロポーザルの数に制限はありません。
キャッシュされた最適化プロポーザル
Cruise Control は、設定済みのデフォルト最適化ゴールを基にして キャッシュされた最適化プロポーザル を維持します。キャッシュされた最適化プロポーザルはワークロードモデルから生成され、Kafka クラスターの現在の状況を反映するために 15 分ごとに更新されます。デフォルトの最適化ゴールを使用して最適化プロポーザルを生成する場合、Cruise Control は最新のキャッシュされたプロポーザルを返します。
キャッシュされた最適化プロポーザルの更新間隔を変更するには、Cruise Control デプロイメント設定の proposal.expiration.ms
設定を編集します。更新間隔を短くすると、Cruise Control サーバーの負荷が増えますが、変更が頻繁に行われるクラスターでは、更新間隔を短くするよう考慮してください。
最適化プロポーザルの内容
以下の表は、最適化プロポーザルに含まれるプロパティーを表しています。
JSON プロパティー | 説明 |
---|---|
| ディスクとクラスターのブローカーとの間で転送されるパーティションレプリカの合計数。
リバランス操作中のパフォーマンスへの影響度: 比較的高いが、 |
| サポートされていません。空のリストが返されます。 |
| 個別のブローカー間で移動されるパーティションレプリカの数。 リバランス操作中のパフォーマンスへの影響度: 比較的高い。 |
| 最適化プロポーザルの生成前および生成後における、Kafka クラスターの全体的な 分散度 (balancedness) の値。
スコアは、違反した各ソフトゴールの
|
|
同じブローカーのディスク間で移動される各パーティションレプリカのサイズの合計 (
リバランス操作中のパフォーマンスへの影響度: 場合による。値が大きいほど、クラスターのリバランスの完了にかかる時間が長くなります。大量のデータを移動する場合、同じブローカーのディスク間で移動する方が個別のブローカー間で移動するよりも影響度が低くなります ( |
| 最適化プロポーザルの基になるメトリクスウインドウの数。 |
|
個別のブローカーに移動される各パーティションレプリカのサイズの合計 ( リバランス操作中のパフォーマンスへの影響度: 場合による。値が大きいほど、クラスターのリバランスの完了にかかる時間が長くなります。 |
|
最適化プロポーザルの対象となる Kafka クラスターのパーティションの割合 (パーセント)。 |
|
|
| リーダーが別のレプリカに切り替えられるパーティションの数。ZooKeeper 設定の変更を伴います。 リバランス操作中のパフォーマンスへの影響度: 比較的低い。 |
| サポートされていません。空のリストが返されます。 |
その他のリソース
8.4. リバランスパフォーマンスチューニングの概要
クラスターリバランスのパフォーマンスチューニングオプションを調整できます。これらのオプションは、リバランスのパーティションレプリカおよびリーダーシップの移動が実行される方法を制御し、また、リバランス操作に割り当てられた帯域幅も制御します。
パーティション再割り当てコマンド
最適化プロポーザル は、個別のパーティション再割り当てコマンドで構成されています。プロポーザルを 承認 すると、Cruise Control サーバーはこれらのコマンドを Kafka クラスターに適用します。
パーティション再割り当てコマンドは、以下のいずれかの操作で構成されます。
パーティションの移動: パーティションレプリカとそのデータを新しい場所に転送します。パーティションの移動は、以下の 2 つの形式のいずれかになります。
- ブローカー間の移動: パーティションレプリカを、別のブローカーのログディレクトリーに移動します。
- ブローカー内の移動: パーティションレプリカを、同じブローカーの異なるログディレクトリーに移動します。
- リーダーシップの移動: パーティションのレプリカのリーダーを切り替えます。
Cruise Control によって、パーティション再割り当てコマンドがバッチで Kafka クラスターに発行されます。リバランス中のクラスターのパフォーマンスは、各バッチに含まれる各タイプの移動数に影響されます。
レプリカの移動ストラテジー
クラスターリバランスのパフォーマンスは、パーティション再割り当てコマンドのバッチに適用される レプリカ移動ストラテジー の影響も受けます。デフォルトでは、Cruise Control は BaseReplicaMovementStrategy
を使用します。これは、生成された順序でコマンドを適用します。ただし、プロポーザルの初期に非常に大きなパーティションの再割り当てがある場合、このストラテジーによって他の再割り当ての適用が遅くなる可能性があります。
Cruise Control は、最適化プロポーザルに適用できる代替のレプリカ移動ストラテジーを 3 つ提供します。
-
PrioritizeSmallReplicaMovementStrategy
: サイズの昇順で再割り当てを並べ替えます。 -
PrioritizeLargeReplicaMovementStrategy
: サイズの降順で再割り当てを並べ替えます。 -
PostponeUrpReplicaMovementStrategy
: 非同期のレプリカがないパーティションのレプリカの再割り当てを優先します。
これらのストラテジーをシーケンスとして設定できます。最初のストラテジーは、内部ロジックを使用して 2 つのパーティション再割り当ての比較を試みます。再割り当てが同等である場合は、順番を決定するために再割り当てをシーケンスの次のストラテジーに渡します。
リバランスチューニングオプション
Cruise Control には、上記のリバランスパラメーターを調整する設定オプションが複数あります。これらのチューニングオプションは、Cruise Control サーバー または 最適化プロポーザル レベルのいずれかに設定できます。
-
Cruise Control のサーバー設定は、
Kafka.spec.cruiseControl.config
の Kafka カスタムリソースで設定できます。 -
個別のリバランスパフォーマンス設定は、
KafkaRebalance.spec
で設定できます。
関連する設定の概要を以下に示します。
サーバーおよび KafkaRebalance の設定 | 説明 | デフォルト値 |
---|---|---|
| 各パーティション再割り当てバッチでのブローカー間パーティション移動の最大数。 | 5 |
| ||
| 各パーティション再割り当てバッチでのブローカー内パーティション移動の最大数。 | 2 |
| ||
| 各パーティション再割り当てバッチにおけるパーティションリーダー変更の最大数。 | 1000 |
| ||
| パーティションの再割り当てに割り当てられる帯域幅 (バイト/秒単位)。 | 制限なし |
| ||
| パーティション再割り当てコマンドが、生成されたプロポーザルに対して実行される順番を決定するために使用されるストラテジー (優先順位順) の一覧。
サーバー設定で、ストラテジークラスの完全修飾名にコンマ区切りの文字列を使用します (各クラス名の先頭に |
|
|
デフォルト設定を変更すると、リバランスの完了までにかかる時間と、リバランス中の Kafka クラスターの負荷に影響します。値を小さくすると負荷は減りますが、かかる時間は長くなり、その逆も同様です。
8.5. Cruise Control の設定
Kafka.spec.cruiseControl
の config
プロパティーには設定オプションがキーとして含まれ、それらの値は以下の JSON タイプの 1 つになります。
- 文字列
- 数値
- ブール値
AMQ Streams によって直接管理されるオプション以外は、Cruise Control ドキュメント の「Configurations」セクションにリストされているすべてのオプションを指定および設定できます。ここに示されているキーの 1 つと同等の設定オプションまたはキーの 1 つで始まる設定オプションは、編集できません。
制限されたオプションが指定された場合、そのオプションは無視され、警告メッセージが Cluster Operator のログファイルに出力されます。すべてのサポートされるオプションは Cruise Control に渡されます。
Cruise Control の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... cruiseControl: # ... config: default.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal cpu.balance.threshold: 1.1 metadata.max.age.ms: 300000 send.buffer.bytes: 131072 # ...
CORS (Corss-Origin Resource Sharing) の設定
CORS (Cross-Origin Resource Sharing) を使用すると、REST API へのアクセスに許可されるメソッドおよびアクセス元 URL を指定できます。
デフォルトでは、Cruise Control REST API の CORS は無効になっています。有効にすると、Kafka クラスターの状態の読み取り専用アクセスを要求する GET
リクエストのみが許可されます。そのため、AMQ Streams コンポーネントとは異なるオリジンで実行されている外部アプリケーションは、Cruise Control API に POST
リクエストを送信できません。ただし、これらのアプリケーションは、現在のクラスターの負荷や最新の最適化プロポーザルなどの、Kafka クラスターに関する読み取り専用の情報へアクセスするための GET
リクエストを送信できます。
Cruise Control の CORS の有効化
Kafka.spec.cruiseControl.config
で CORS を有効化および設定します。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... cruiseControl: # ... config: webserver.http.cors.enabled: true webserver.http.cors.origin: "*" webserver.http.cors.exposeheaders: "User-Task-ID,Content-Type" # ...
詳細は、Cruise Control Wiki の「REST APIs」を参照してください。
容量の設定
Cruise Control は 容量制限 を使用して、リソース分散の最適化ゴールが破損しているかどうかを判断します。このタイプには 4 つのゴールがあります。
-
DiskUsageDistributionGoal
: ディスク使用率の分散 -
CpuUsageDistributionGoal
: CPU 使用率の分散 -
NetworkInboundUsageDistributionGoal
: ネットワークインバウンド使用率の分散 -
NetworkOutboundUsageDistributionGoal
: ネットワークアウトバウンド使用率の分散
Kafka ブローカーリソースの容量制限は、Kafka.spec.cruiseControl
の brokerCapacity
プロパティーに指定します。これらはデフォルトで有効になっており、デフォルト値を変更できます。容量制限は、標準の OpenShift バイト単位 (K、M、G、および T) または同等 (2 のべき乗) の bibyte (Ki、Mi、Gi、および Ti) を使用して、以下のブローカーリソースに設定できます。
-
disk
- ブローカーごとのディスクストレージ (デフォルトは 100000Mi) -
cpuUtilization
- パーセントで表した CPU 使用率 (デフォルトは 100) -
inboundNetwork
- バイト毎秒単位のインバウンドネットワークスループット (デフォルトは 10000KiB/s) -
outboundNetwork
- バイト毎秒単位のアウトバウンドネットワークスループット (デフォルトは 10000KiB/s)
AMQ Streams の Kafka ブーカーは同種であるため、Cruise Control は監視している各ブローカーに同じ容量制限を適用します。
bibyte 単位での Cruise Control brokerCapacity の設定例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... cruiseControl: # ... brokerCapacity: disk: 100Gi cpuUtilization: 100 inboundNetwork: 10000KiB/s outboundNetwork: 10000KiB/s # ...
その他のリソース
詳細は 「BrokerCapacity
スキーマ参照」 を参照してください。
ロギングの設定
Cruise Control には独自の設定可能なロガーがあります。
-
rootLogger.level
Cruise Control では Apache log4j 2
ロガー実装が使用されます。
logging
プロパティーを使用してロガーおよびロガーレベルを設定します。
ログレベルを設定するには、ロガーとレベルを直接指定 (インライン) するか、またはカスタム (外部) ConfigMap を使用します。ConfigMap を使用する場合、logging.valueFrom.configMapKeyRef.name
プロパティーを外部ロギング設定が含まれる ConfigMap の名前に設定します。ConfigMap 内では、ロギング設定は log4j.properties
を使用して記述されます。logging.valueFrom.configMapKeyRef.name
および logging.valueFrom.configMapKeyRef.key
プロパティーはいずれも必須です。Cluster Operator の実行時に、指定された正確なロギング設定を使用する ConfigMap がカスタムリソースを使用して作成され、その後は調整のたびに再作成されます。カスタム ConfigMap を指定しない場合、デフォルトのロギング設定が使用されます。特定のロガー値が設定されていない場合、上位レベルのロガー設定がそのロガーに継承されます。inline
および external
ロギングの例は次のとおりです。
inline ロギング
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka # ... spec: cruiseControl: # ... logging: type: inline loggers: rootLogger.level: "INFO" # ...
外部ロギング
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka # ... spec: cruiseControl: # ... logging: type: external valueFrom: configMapKeyRef: name: customConfigMap key: cruise-control-log4j.properties # ...
8.6. Cruise Control のデプロイ
Cruise Control を AMQ Streams クラスターにデプロイするいは、Kafka
リソースの cruiseControl
プロパティーを使用して設定を定義した後、リソースを作成または更新します。
Kafka クラスターごとに Cruise Control のインスタンスを 1 つデプロイします。
前提条件
- OpenShift クラスター。
- 稼働中の Cluster Operator。
手順
Kafka
リソースを編集し、cruiseControl
プロパティーを追加します。設定可能なプロパティーは以下の例のとおりです。
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: # ... cruiseControl: brokerCapacity: 1 inboundNetwork: 10000KB/s outboundNetwork: 10000KB/s # ... config: 2 default.goals: > com.linkedin.kafka.cruisecontrol.analyzer.goals.RackAwareGoal, com.linkedin.kafka.cruisecontrol.analyzer.goals.ReplicaCapacityGoal # ... cpu.balance.threshold: 1.1 metadata.max.age.ms: 300000 send.buffer.bytes: 131072 # ... resources: 3 requests: cpu: 1 memory: 512Mi limits: cpu: 2 memory: 2Gi logging: 4 type: inline loggers: rootLogger.level: "INFO" template: 5 pod: metadata: labels: label1: value1 securityContext: runAsUser: 1000001 fsGroup: 0 terminationGracePeriodSeconds: 120 readinessProbe: 6 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: 7 initialDelaySeconds: 15 timeoutSeconds: 5 # ...
- 1
- ブローカーリソースの容量制限を指定します。詳細は、容量の設定 を参照してください。
- 2
- Cruise Control 設定を定義します。これには、デフォルトの最適化ゴール (
default.goals
で設定) が含まれ、マスター最適化ゴール (goals
で設定) またはハードゴール (hard.goals
で設定) へのカスタマイズも含まれまもす。AMQ Streams によって直接管理されるものを除き、標準の Cruise Cntrol 設定オプション をすべて提供できます。最適化ゴールの設定に関する詳細は、「最適化ゴールの概要」 を参照してください。 - 3
- Cruise Control によって予約された CPU およびメモリーリソース。詳細は、「
resources
」 を参照してください。 - 4
- ConfigMap より直接的 (inline) または間接的 (external) に追加されたロガーおよびログレベルを定義します。カスタム ConfigMap は、log4j.properties キー下に配置する必要があります。Cruise Control には
rootLogger.level
という名前の単一のロガーがあります。ログレベルは INFO、ERROR、WARN、TRACE、DEBUG、FATAL、または OFF に設定できます。詳細は、「ロギングの設定」を参照してください。 - 5
- 6
- 7
リソースを作成または更新します。
oc apply -f kafka.yaml
Cruise Control が正常にデプロイされたことを確認します。
oc get deployments -l app.kubernetes.io/name=cruise-control
自動作成されたトピック
以下の表は、Cruise Control のデプロイ時に自動作成される 3 つのトピックを表しています。これらのトピックは、Cruise Control が適切に動作するために必要であるため、削除または変更しないでください。
自動作成されたトピック | 作成元 | 機能 |
---|---|---|
| AMQ Streams の Metrics Reporter | Metrics Reporter からの raw メトリクスを各 Kafka ブローカーに格納します。 |
| Cruise Control | 各パーティションの派生されたメトリクスを格納します。これらは Metric Sample Aggregator によって作成されます。 |
| Cruise Control | クラスターワークロードモデル の作成に使用されるメトリクスサンプルを格納します。 |
Cruise Control に必要なレコードを削除しないようにするため、自動作成されたトピックではログの圧縮は無効になっています。
次のステップ
Cruise Control を設定およびデプロイした後、最適化プロポーザルを生成できます。
その他のリソース
8.7. 最適化プロポーザルの生成
KafkaRebalance
リソースを作成または更新すると、Cruise Control は 設定済みの最適化ゴールを基にして、Kafka クラスターの 最適化プロポーザル を生成します。
最適化プロポーザルの情報を分析して、プロポーザルを承認するかどうかを決定します。
前提条件
- AMQ Streams クラスターに Cruise Control がデプロイされている 必要があります。
- 最適化ゴール が設定され、任意で ブローカーリソースに容量制限 が設定されている必要があります。
手順
KafkaRebalance
リソースを作成します。Kafka
リソースに定義された デフォルトの最適化ゴール を使用するには、spec
プロパティーを空のままにします。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: {}
デフォルトのゴールを使用する代わりに ユーザー定義の最適化ゴール を設定するには、
goals
プロパティーを追加し、1 つ以上のゴールを入力します。以下の例では、ラックアウェアネス (Rack Awareness) およびレプリカの容量はユーザー定義の最適化ゴールとして設定されています。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: goals: - RackAwareGoal - ReplicaCapacityGoal
設定済みのハードゴールを無視するには、
skipHardGoalCheck: true
プロパティーを追加します。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaRebalance metadata: name: my-rebalance labels: strimzi.io/cluster: my-cluster spec: goals: - RackAwareGoal - ReplicaCapacityGoal skipHardGoalCheck: true
リソースを作成または更新します。
oc apply -f your-file
Cluster Operator は Cruise Control から最適化プロポーザルを要求します。Kafka クラスターのサイズによっては処理に数分かかることがあります。
KafkaRebalance
リソースのステータスを確認します。oc describe kafkarebalance rebalance-cr-name
Cruise Control は以下の 2 つの状態の 1 つを返します。
-
PendingProposal
: 最適化プロポーザルが準備できているかどうかを確認するために、リバランス operator が Cruise Control API をポーリングしています。 -
ProposalReady
: 最適化プロポーザルを確認し、希望する場合は承認することができます。最適化プロポーザルはKafkaRebalance
リソースのStatus.Optimization Result
プロパティーに含まれます。
-
最適化プロポーザルを確認します。
oc describe kafkarebalance rebalance-cr-name
以下はプロポーザルの例になります。
Status: Conditions: Last Transition Time: 2020-05-19T13:50:12.533Z Status: ProposalReady Type: State Observed Generation: 1 Optimization Result: Data To Move MB: 0 Excluded Brokers For Leadership: Excluded Brokers For Replica Move: Excluded Topics: Intra Broker Data To Move MB: 0 Monitored Partitions Percentage: 100 Num Intra Broker Replica Movements: 0 Num Leader Movements: 0 Num Replica Movements: 26 On Demand Balancedness Score After: 81.8666802863978 On Demand Balancedness Score Before: 78.01176356230222 Recent Windows: 1 Session Id: 05539377-ca7b-45ef-b359-e13564f1458c
Optimization Result
セクションのプロパティーには、保留クラスターリバランス操作の詳細が表示されます。各プロパティーの説明は、「最適化プロポーザルの内容」を参照してください。
次のステップ
その他のリソース
8.8. 最適化プロポーザルの承認
状態が ProposalReady
の場合、Cruise Control によって生成された最適化プロポーザルを承認できます。その後、Cruise Control は最適化プロポーザルを Kafka クラスターに適用して、パーティションをブローカーに再割り当てし、パーティションのリーダーを変更します。
これはドライランではありません。最適化プロポーザルを承認する前に、以下を行う必要があります。
- 最新でない可能性があるため、プロポーザルを更新します。
- プロポーザルの内容を注意して確認します。
前提条件
- Cruise Control から 最適化プロポーザルを生成済み である必要があります。
-
KafkaRebalance
カスタムリソースの状態がProposalReady
である必要があります。
手順
承認する最適化プロポーザルに対して、以下の手順を実行します。
最適化プロポーザルが新規生成された場合を除き、プロポーザルが Kafka クラスターの状態に関する現在の情報を基にしていることを確認します。これには、最適化プロポーザルを更新し、必ず最新のクラスターメトリクスを使用するようにします。
OpenShift で
KafkaRebalance
リソースにrefresh
アノテーションを付けます。oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance=refresh
KafkaRebalance
リソースのステータスを確認します。oc describe kafkarebalance rebalance-cr-name
-
状態が
ProposalReady
に変わるまで待ちます。
Cruise Control が適用する最適化プロポーザルを承認します。
OpenShift で
KafkaRebalance
リソースにアノテーションを付けます。oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance=approve
- Cluster Operator は アノテーションが付けられたリソースを検出し、Cruise Control に Kafka クラスターのリバランスを指示します。
KafkaRebalance
リソースのステータスを確認します。oc describe kafkarebalance rebalance-cr-name
Cruise Control は以下の 3 つの状態の 1 つを返します。
- Rebalaning: クラスターリバランス操作の実行中です。
-
Ready: クラスターリバランス操作が正常に完了しました。
KafkaRebalance
カスタムリソースは再利用できません。 -
NotReady: エラーが発生しました。「
KafkaRebalance
リソースの問題の修正」 を参照してください。
その他のリソース
8.9. クラスターリバランスの停止
クラスターリバランス操作を開始すると、完了まで時間がかかることがあり、Kafka クラスターの全体的なパフォーマンスに影響します。
実行中のクラスターリバランス操作を停止するには、stop
アノテーションを KafkaRebalance
カスタムリソースに適用します。これにより、現在のパーティション再割り当てのバッチ処理を完了し、リバランスを停止するよう Cruise Control が指示されます。リバランスの停止時、完了したパーティションの再割り当てはすで適用されています。そのため、Kafka クラスターの状態は、リバランス操作の開始前とは異なります。さらなるリバランスが必要な場合は、新しい最適化プロポーザルを生成してください。
中間 (停止) 状態の Kafka クラスターのパフォーマンスは、初期状態の場合よりも悪くなる可能性があります。
前提条件
-
KafkaRebalance
カスタムリソースにapprove
アノテーションを付けて 最適化プロポーザルが承認済みである必要があります。 -
KafkaRebalance
カスタムリソースの状態がRebalancing
である必要があります。
手順
OpenShift で
KafkaRebalance
リソースにアノテーションを付けます。oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance=stop
KafkaRebalance
リソースのステータスを確認します。oc describe kafkarebalance rebalance-cr-name
-
状態が
Stopped
に変わるまで待ちます。
その他のリソース
8.10. KafkaRebalance
リソースの問題の修正
KafkaRebalance
リソースの作成時や、Cruise Control との対話中に問題が発生した場合、エラーとその修正方法の詳細がリソースの状態で報告されます。また、リソースも NotReady
の状態に変わります。
クラスターリバランス操作を続行するには、KafkaRebalance
リソース自体の問題または Cruise Control デプロイメント全体の問題を修正する必要があります。問題には以下が含まれる可能性があります。
-
KafkaRebalance
リソースのパラメーターの設定に誤りがある。 -
KafkaRebalance
リソースの Kafka クラスターを指定するためのstrimzi.io/cluster
ラベルがない。 -
Kafka
リソースにcruiseControl
プロパティーがないため、Cruise Control サーバーがデプロイされていない。 - Cruise Control サーバーに接続できない。
問題の修正後、refresh
アノテーションを KafkaRebalance
リソースに付ける必要があります。「refresh」(更新) 中、Cruise Control サーバーから新しい最適化プロポーザルが要求されます。
前提条件
- 最適化プロポーザルが承認済みである必要があります。
-
リバランス操作の
KafkaRebalance
カスタムリソースの状態がNotReady
である必要があります。
手順
KafkaRebalance
の状態からエラーに関する情報を取得します。oc describe kafkarebalance rebalance-cr-name
-
KafkaRebalance
リソースで問題の解決を試みます。 OpenShift で
KafkaRebalance
リソースにアノテーションを付けます。oc annotate kafkarebalance rebalance-cr-name strimzi.io/rebalance=refresh
KafkaRebalance
リソースのステータスを確認します。oc describe kafkarebalance rebalance-cr-name
-
状態が
PendingProposal
からProposalReady
に変わるまで待ちます。
その他のリソース