10.5. Kafka のアップグレード
Cluster Operator を 2.3 にアップグレードした後、次にすべての Kafka ブローカーをサポートされる最新バージョンの Kafka にアップグレードします。
Kafka のアップグレードは、Kafka ブローカーのローリング更新によって Cluster Operator によって実行されます。
Cluster Operator は、Kafka クラスターの設定に基づいてローリング更新を開始します。
Kafka.spec.kafka.config に以下が含まれている場合 | Cluster Operator によって開始されるもの |
|---|---|
|
|
単一のローリング更新。更新後、 |
|
| 2 つのローリング更新 |
|
| 2 つのローリング更新 |
Kafka 3.0.0 以降、inter.broker.protocol.version が 3.0 以上に設定されていると、log.message.format.version オプションは無視されるため、設定する必要はありません。ブローカーの log.message.format.version プロパティーおよびトピックの message.format.version プロパティーは、非推奨となり、Kafka の今後のリリースで削除されます。
Cluster Operator は、Kafka のアップグレードの一環として、ZooKeeper のローリング更新を開始します。
- ZooKeeper バージョンが変更されなくても、単一のローリング更新が発生します。
- 新しいバージョンの Kafka に新しいバージョンの ZooKeeper が必要な場合、追加のローリング更新が発生します。
10.5.1. Kafka バージョン リンクのコピーリンクがクリップボードにコピーされました!
Kafka のログメッセージ形式バージョンと inter-broker プロトコルバージョンは、それぞれメッセージに追加されるログ形式バージョンとクラスターで使用される Kafka プロトコルのバージョンを指定します。正しいバージョンが使用されるようにするため、アップグレードプロセスでは、既存の Kafka ブローカーの設定変更と、クライアントアプリケーション (コンシューマーおよびプロデューサー) のコード変更が行われます。
以下の表は、Kafka バージョンの違いを示しています。
| Kafka バージョン | Inter-broker プロトコルバージョン | ログメッセージ形式バージョン | ZooKeeper バージョン |
|---|---|---|---|
| 3.2.0 | 3.2 | 3.2 | 3.6.3 |
| 3.2.1 | 3.2 | 3.2 | 3.6.3 |
| 3.2.3 | 3.2 | 3.2 | 3.6.3 |
| 3.3.1 | 3.3 | 3.3 | 3.6.3 |
Inter-broker プロトコルバージョン
Kafka では、Inter-broker の通信に使用されるネットワークプロトコルは Inter-broker プロトコル と呼ばれます。Kafka の各バージョンには、互換性のあるバージョンの Inter-broker プロトコルがあります。上記の表が示すように、プロトコルのマイナーバージョンは、通常 Kafka のマイナーバージョンと一致するように番号が増加されます。
Inter-broker プロトコルのバージョンは、Kafka リソースでクラスター全体に設定されます。これを変更するには、Kafka.spec.kafka.config の inter.broker.protocol.version プロパティーを編集します。
ログメッセージ形式バージョン
プロデューサーが Kafka ブローカーにメッセージを送信すると、特定の形式を使用してメッセージがエンコードされます。この形式は Kafka のリリース間で変更される可能性があるため、メッセージにはエンコードに使用されたメッセージ形式のバージョンが指定されます。
特定のメッセージ形式のバージョンを設定するために使用されるプロパティーは以下のとおりです。
-
トピック用の
message.format.versionプロパティー -
Kafka ブローカーの
log.message.format.versionプロパティー
Kafka 3.0.0 以降、メッセージ形式のバージョンの値は inter.broker.protocol.version と一致すると見なされ、設定する必要はありません。値は、使用される Kafka バージョンを反映します。
Kafka 3.0.0 以降にアップグレードする場合、inter.broker.protocol.version を更新する際にこれらの設定を削除できます。それ以外の場合は、アップグレード先の Kafka バージョンに基づいてメッセージ形式のバージョンを設定します。
トピックの message.format.version のデフォルト値は、Kafka ブローカーに設定される log.message.format.version によって定義されます。トピックの message.format.version は、トピック設定を編集すると手動で設定できます。
10.5.2. クライアントをアップグレードするストラテジー リンクのコピーリンクがクリップボードにコピーされました!
クライアントアプリケーション (Kafka Connect コネクターを含む) のアップグレードに適切な方法は、特定の状況によって異なります。
消費するアプリケーションは、そのアプリケーションが理解するメッセージ形式のメッセージを受信する必要があります。その状態であることを、以下のいずれかの方法で確認できます。
- プロデューサーをアップグレードする 前に、トピックのすべてのコンシューマーをアップグレードする。
- ブローカーでメッセージをダウンコンバートする。
ブローカーのダウンコンバートを使用すると、ブローカーに余分な負荷が加わるので、すべてのトピックで長期にわたりダウンコンバートに頼るのは最適な方法ではありません。ブローカーの実行を最適化するには、ブローカーがメッセージを一切ダウンコンバートしないようにしてください。
ブローカーのダウンコンバートは 2 通りの方法で設定できます。
-
トピックレベルの
message.format.version。単一のトピックが設定されます。 -
ブローカーレベルの
log.message.format.version。トップレベルのmessage.format.versionが設定されていないトピックのデフォルトです。
新バージョンの形式でトピックにパブリッシュされるメッセージは、コンシューマーによって認識されます。これは、メッセージがコンシューマーに送信されるときでなく、ブローカーがプロデューサーからメッセージを受信するときに、ブローカーがダウンコンバートを実行するからです。
クライアントのアップグレードに使用できる一般的なストラテジーを以下に示します。クライアントアプリケーションをアップグレードするストラテジーは他にもあります。
Kafka 3.0.0 以降にアップグレードすると、各ストラテジーで概説されている手順がわずかに変わります。Kafka 3.0.0 以降、メッセージ形式のバージョンの値は inter.broker.protocol.version と一致すると見なされ、設定する必要はありません。
ブローカーレベルのコンシューマーの最初のストラテジー
- コンシューマーとして機能するアプリケーションをすべてアップグレードします。
-
ブローカーレベル
log.message.format.versionを新バージョンに変更します。 - プロデューサーとして機能するアプリケーションをアップグレードします。
このストラテジーは分かりやすく、ブローカーのダウンコンバートの発生をすべて防ぎます。ただし、所属組織内のすべてのコンシューマーを整然とアップグレードできることが前提になります。また、コンシューマーとプロデューサーの両方に該当するアプリケーションには通用しません。さらにリスクとして、アップグレード済みのクライアントに問題がある場合は、新しい形式のメッセージがメッセージログに追加され、以前のコンシューマーバージョンに戻せなくなる場合があります。
トピックレベルのコンシューマーの最初のストラテジー
トピックごとに以下を実行します。
- コンシューマーとして機能するアプリケーションをすべてアップグレードします。
-
トピックレベルの
message.format.versionを新バージョンに変更します。 - プロデューサーとして機能するアプリケーションをアップグレードします。
このストラテジーではブローカーのダウンコンバートがすべて回避され、トピックごとにアップグレードできます。この方法は、同じトピックのコンシューマーとプロデューサーの両方に該当するアプリケーションには通用しません。ここでもリスクとして、アップグレード済みのクライアントに問題がある場合は、新しい形式のメッセージがメッセージログに追加される可能性があります。
ダウンコンバージョンを使用したトピックレベルのコンシューマーの最初のストラテジー
トピックごとに以下を実行します。
-
トピックレベルの
message.format.versionを、旧バージョンに変更します (または、デフォルトがブローカーレベルのlog.message.format.versionのトピックを利用します)。 - コンシューマーおよびプロデューサーとして機能するアプリケーションをすべてアップグレードします。
- アップグレードしたアプリケーションが正しく機能することを確認します。
-
トピックレベルの
message.format.versionを新バージョンに変更します。
このストラテジーにはブローカーのダウンコンバートが必要ですが、ダウンコンバートは一度に 1 つのトピック (またはトピックの小さなグループ) のみに必要になるので、ブローカーへの負荷は最小限に抑えられます。この方法は、同じトピックのコンシューマーとプロデューサーの両方に該当するアプリケーションにも通用します。この方法により、新しいメッセージ形式バージョンを使用する前に、アップグレードされたプロデューサーとコンシューマーが正しく機能することが保証されます。
この方法の主な欠点は、多くのトピックやアプリケーションが含まれるクラスターでの管理が複雑になる場合があることです。
複数のストラテジーを適用することもできます。たとえば、最初のアプリケーションおよびトピックには、"per-topic consumers first, with down conversion" ストラテジーを使用することができます。これが問題なく適用されたら、より効率的な別のストラテジーの使用を検討できます。
10.5.3. Kafka バージョンおよびイメージマッピング リンクのコピーリンクがクリップボードにコピーされました!
Kafka のアップグレード時に、STRIMZI_KAFKA_IMAGES 環境変数と Kafka.spec.kafka.version プロパティーの設定について考慮してください。
-
それぞれの
KafkaリソースはKafka.spec.kafka.versionで設定できます。 Cluster Operator の
STRIMZI_KAFKA_IMAGES環境変数により、Kafka のバージョンと、指定のKafkaリソースでそのバージョンが要求されるときに使用されるイメージをマッピングできます。-
Kafka.spec.kafka.imageを設定しないと、そのバージョンのデフォルトのイメージが使用されます。 -
Kafka.spec.kafka.imageを設定すると、デフォルトのイメージがオーバーライドされます。
-
Cluster Operator は、Kafka ブローカーの想定されるバージョンが実際にイメージに含まれているかどうかを検証できません。所定のイメージが所定の Kafka バージョンに対応することを必ず確認してください。
10.5.4. Kafka ブローカーおよびクライアントアプリケーションのアップグレード リンクのコピーリンクがクリップボードにコピーされました!
AMQ Streams Kafka クラスターを、サポートされている最新の Kafka バージョンおよび インターブローカープロトコルバージョン にアップグレードします。
クライアントをアップグレードするストラテジー を選択する必要もあります。Kafka クライアントは、この手順の 6 でアップグレードされます。
前提条件
- Cluster Operator が稼働しています。
-
AMQ Streams Kafka クラスターをアップグレードする前に、
KafkaリソースのKafka.spec.kafka.configプロパティーに、新しい Kafka バージョンでサポートされていない設定オプションが含まれてい ない ことを確認してください。
手順
Kafka クラスター設定を更新します。
oc edit kafka <my_cluster>設定されている場合は、
inter.broker.protocol.versionおよびlog.message.format.versionプロパティーが 現在の バージョンに設定されていることを確認してください。たとえば、Kafka バージョン 3.2.3 から 3.3.1 にアップグレードする場合、現在のバージョンは 3.2 です。
kind: Kafka spec: # ... kafka: version: 3.2.3 config: log.message.format.version: "3.2" inter.broker.protocol.version: "3.2" # ...log.message.format.versionおよびinter.broker.protocol.versionが設定されていない場合、AMQ Streams では、次のステップの Kafka バージョンの更新後、これらのバージョンを現在のデフォルトに自動的に更新します。注記log.message.format.versionおよびinter.broker.protocol.versionの値は、浮動小数点数として解釈されないように文字列である必要があります。Kafka.spec.kafka.versionを変更して、新しい Kafka バージョンを指定します。現在の Kafka バージョンのデフォルトでlog.message.format.versionおよびinter.broker.protocol.versionのままにします。注記kafka.versionを変更すると、クラスターのすべてのブローカーがアップグレードされ、新しいブローカーバイナリーの使用が開始されます。このプロセスでは、一部のブローカーは古いバイナリーを使用し、他のブローカーはすでに新しいバイナリーにアップグレードされています。inter.broker.protocol.versionを現在の設定のままにしておくと、ブローカーはアップグレード中に相互に通信し続けることができます。たとえば、Kafka 3.2.3 から 3.3.1 にアップグレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.3.11 config: log.message.format.version: "3.2"2 inter.broker.protocol.version: "3.2"3 # ...警告新しい Kafka バージョンの
inter.broker.protocol.versionが変更された場合は、Kafka をダウングレードできません。ブローカー間プロトコルのバージョンは、__consumer_offsetsに書き込まれたメッセージなど、ブローカーによって保存される永続メタデータに使用されるスキーマを判断します。ダウングレードされたクラスターはメッセージを理解しません。Kafka クラスターのイメージが
Kafka.spec.kafka.imageの Kafka カスタムリソースで定義されている場合、imageを更新して、新しい Kafka バージョンでコンテナーイメージを示すようにします。Kafka バージョンおよびイメージマッピング を参照してください。
エディターを保存して終了し、ローリング更新の完了を待ちます。
Pod の状態の遷移を監視して、ローリング更新の進捗を確認します。
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'ローリング更新により、各 Pod が新バージョンの Kafka のブローカーバイナリーを使用するようになります。
クライアントのアップグレードに選択したストラテジー に応じて、新バージョンのクライアントバイナリーを使用するようにすべてのクライアントアプリケーションをアップグレードします。
必要に応じて、Kafka Connect および MirrorMaker の
versionプロパティーを新バージョンの Kafka として設定します。-
Kafka Connect では、
KafkaConnect.spec.versionを更新します。 -
MirrorMaker では、
KafkaMirrorMaker.spec.versionを更新します。 -
MirrorMaker 2.0 の場合は、
KafkaMirrorMaker2.spec.versionを更新します。
-
Kafka Connect では、
設定されている場合、新しい
inter.broker.protocol.versionバージョンを使用するように Kafka リソースを更新します。それ以外の場合は、ステップ 9 に進みます。たとえば、Kafka 3.3.1 にアップグレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.3.1 config: log.message.format.version: "3.2" inter.broker.protocol.version: "3.3" # ...- Cluster Operator によってクラスターが更新されるまで待ちます。
設定されている場合、新しい
log.message.format.versionバージョンを使用するように Kafka リソースを更新します。それ以外の場合は、ステップ 10 に進みます。たとえば、Kafka 3.3.1 にアップグレードする場合:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: # ... kafka: version: 3.3.1 config: log.message.format.version: "3.3" inter.broker.protocol.version: "3.3" # ...重要Kafka 3.0.0 以降、
inter.broker.protocol.versionが3.0以上に設定されていると、log.message.format.versionオプションは無視されるため、設定する必要はありません。Cluster Operator によってクラスターが更新されるまで待ちます。
- これで、Kafka クラスターおよびクライアントが新バージョンの Kafka を使用するようになります。
- ブローカーは、ブローカー間プロトコルバージョンと新バージョンの Kafka のメッセージ形式バージョンを使用して、メッセージを送信するように設定されます。
Kafka のアップグレードに続いて、必要に応じて、コンシューマーをアップグレードして、増分協調リバランスプロトコルを使用 できます。