Kafkaのアップグレードは、正しく計画すれば無停止で進められます。鍵になるのは互換性の理解と、段階的に進めるローリング更新の手順です。本稿では、試験対策(CCAAK)と運用現場の両方で役に立つ、公式ドキュメント準拠の考え方と手順をまとめます。
特に、inter.broker.protocol.version(IBPV)の固定、必要に応じたメッセージ形式の固定、コントローラやクライアントの順序、KRaftとZooKeeperでの差分、検証・ロールバックの勘所を、手順とチェックリストで具体化します。
Kafkaの互換性は大きく、ワイヤプロトコル(ブローカー間・クライアント対ブローカー)、レコードのメッセージ形式、メタデータ機能レベル(KRaftの場合)の3層で考えます。ローリング更新では、まず既存の通信やレコード形式を壊さないように、IBPVやメッセージ形式を現行バージョンで固定してからバイナリを更新します。
クライアントは一般に、新しいブローカーに対しても古いAPIバージョンで会話できるため、ブローカーを先に上げるのが原則です。ZooKeeperモードではブローカーとコントローラの役割はブローカー側に内包されますが、KRaftモードではコントローラ群とブローカー群を別にローリングする順序性が加わります。
以下はZooKeeperモードの一般的な流れです。KRaftでも基本は同じですが、コントローラ群を先に、次いでブローカー群という順序性と、最終段の機能レベル最終化が追加されます。
大切なのは、最初に互換性を固定し、1台ずつ更新して健全性を確認し、全台が上がってから固定を解除(最新化)するという順序です。
ローリング更新の概念図(B1→B2→B3の順で1台ずつ)
実行ランブック例(ZooKeeperモード想定。KRaftは後述の注意を参照)
# 0) 事前確認(健全性)
$ kafka-topics.sh --bootstrap-server broker:9092 --describe --under-replicated-partitions
$ kafka-topics.sh --bootstrap-server broker:9092 --describe --unavailable-partitions
$ kafka-broker-api-versions.sh --bootstrap-server broker:9092 | head
# 1) 互換性の固定(server.properties を全ブローカーで揃える)
# 例: いまの運用バージョンが 2.8 の場合
inter.broker.protocol.version=2.8
log.message.format.version=2.8 # プロパティが存在する場合のみ。ない環境はスキップ
# 2) ブローカーを1台ずつ更新
# (オプション)停止前にリーダーを減らす
$ kafka-preferred-replica-election.sh --zookeeper zk:2181 # 利用可能な場合
# 対象ブローカーB1を停止→パッケージ更新→起動
$ sudo systemctl stop kafka
# パッケージ更新はディストリ/配布物に合わせて実施
$ sudo tar -xf kafka_2.13-3.6.0.tgz -C /opt/kafka --strip-components=1
$ sudo systemctl start kafka
# 健全性チェック(URP=0、オフライン分割なし、クライアントエラーなし)
$ kafka-topics.sh --bootstrap-server broker:9092 --describe --under-replicated-partitions
# B2, B3 …と繰り返し
# 3) 全台更新後に固定解除(最新版へ)
inter.broker.protocol.version=3.6 # 例
log.message.format.version=3.6 # プロパティが存在する場合のみ
# 4) 設定反映のための最終ローリング再起動
$ sudo systemctl restart kafka # 各ブローカー順番に
# 5) KRaftの場合の最終化(コントローラで実施。実際のオプションは環境のバージョンに合わせる)
$ kafka-features.sh --bootstrap-server controller:9093 --describe
$ kafka-features.sh --bootstrap-server controller:9093 --finalize-upgradeinter.broker.protocol.versionは、ブローカー間のワイヤプロトコルを既存バージョンに固定する設定です。これにより、新旧ブローカーが混在しても同じプロトコルで通信できるため、ローリング更新中の互換性が保たれます。固定は全ブローカーで揃えて適用し、全台の更新後に最新化します。
log.message.format.versionがある環境では、レコードのエンコード形式(マジックバイトやヘッダ構造など)を旧来の形式に固定できます。固定を外しても既存のログセグメントは書き換えられず、新規に書かれるレコードから新形式になります。よって切替時に大規模なIOが発生しないのが通常です。
設定確認のミニコマンド
# IBPV/メッセージ形式が想定どおりか(静的設定ファイルの例)
$ grep -E "^(inter.broker.protocol.version|log.message.format.version)" /etc/kafka/server.properties
# APIバージョンの対応(クライアント対ブローカー)
$ kafka-broker-api-versions.sh --bootstrap-server broker:9092 | sed -n '1,20p'
# クラスタ健全性(代表値)
$ kafka-metrics.sh # メトリクス収集の仕組みに合わせて、以下のような指標を監視
# kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions == 0
# kafka.controller:type=KafkaController,name=ActiveControllerCount == 1 (ZK)
# kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec の平常性各ブローカー再起動後は、パーティションのレプリケーション完了、リーダーの安定、クライアントのタイムアウト増加がないことを確認します。ベンチマークではなく、業務トラフィックに近いスモークテストを流すのが実務的です。
異常が出たら、そのブローカーのみを旧バイナリに戻すロールバックを優先し、固定設定(IBPV/メッセージ形式)は変更しないのが安全です。全台の更新が進むまでは、固定を外さない限り後戻りしやすい構えを維持できます。
標準はローリング更新ですが、要件次第で停止更新や並行クラスター(いわゆるBlue/Green)を選ぶこともあります。監査対応や大規模バージョンスキップ時のリスク、インフラ費用を天秤にかけて選択します。
CCAAK視点では、ローリング更新の前提条件(IBPV固定、全台更新後の固定解除、クライアントは後追い)を確実に説明できることが重要です。
| 戦略 | ダウンタイム | リスク/複雑性 | 追加コスト |
|---|---|---|---|
| ローリング更新(推奨) | ほぼゼロ(瞬間的なリーダー再選出のみ) | 中(順序・固定の管理が必要) | 低 |
| 停止更新(全停止→一括更新) | 大(全停止) | 低(作業は単純) | 低 |
| 並行クラスタ(Blue/Green) | ゼロ(切替で瞬断最小) | 高(データ二重取り込みや整合性確認が必要) | 高 |
試験でよく問われるのは、固定→更新→解除の順序、クライアント更新順、メッセージ形式の扱い、KRaftの機能最終化の存在です。選択肢に「全台更新前にIBPVを上げる」「クライアントを先に更新」などの紛れ込みがあれば誤りです。
実務では、変更前後の観測点を明記し、1台ごとに合格基準を満たすまで次へ進まない運用が安定します。
CCAAK
問題 1
Kafka 2.8 から 3.x への無停止アップグレードをZooKeeperモードで行います。最も安全な手順はどれか。
正解: A
ローリング更新では、互換性を壊さないよう最初にIBPV(必要に応じてメッセージ形式)を現行値で固定し、全台のバイナリ更新が完了してから固定を解除する。クライアントは最後に更新するのが原則。
log.message.format.versionは必ず設定が必要ですか?
環境とバージョンにより存在しない場合があります。存在する環境では、ローリング更新中の互換性維持のため、現行バージョンに固定してからアップグレードし、全台更新後に最新化します。切替時に既存ログは再書き換えされません。
KRaftモードでは何が追加で必要ですか?
コントローラ群を先に、次いでブローカー群をローリング更新し、最後にメタデータの機能レベルを最終化します(kafka-featuresツール等)。最終化までは旧機能レベルが有効のため、新機能の利用は最終化後に行います。
クライアントはいつ更新すべきですか?
原則としてブローカー群のアップグレード完了と、IBPV/メッセージ形式(およびKRaftの機能レベル)の最終化が済んでから。多くのクライアントは後方互換があるため、サーバ先行が安全です。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Kafka Topic と Partition の基礎: 分散とスケーラビリティの要
CCDAK 対策と実務の両立を意識し、Topic/Partition/Replica/Consumer Group の役...
CCDAK 試験ガイド:出題範囲・配点・申込み・対策
Confluent Certified Developer for Apache Kafka (CCDAK) の出題範囲...
Confluent Certified Administrator (CCAAK) 対策: 出題範囲・配点の考え方・運用観点の要点
CCAAKに向けて、試験領域の押さえどころを運用目線で整理。プロダクションで通用する設定・監視・セキュリティの実践知を、...
Kafka の Replica と In-Sync Replicas を正しく設計する: 耐障害性と一貫性
レプリカとISRの仕組みを起点に、acks と min.insync.replicas、クリーン/アンクリーンリーダー選...
Kafka の Offset とコミット: ポジション管理と at-least-once の基礎
CCDAK 対策と実務の両立を意識して、Kafka コンシューマのオフセット管理とコミット戦略を整理。at-least-...