Kafka はブローカー内のレプリケーションで単一リージョン障害には強い一方、リージョン断には追加の設計が不可欠です。本稿は、RPO/RTO を起点とした DR 戦略と、MirrorMaker 2 または Cluster Linking によるリージョン間レプリケーションの実務指針をまとめます。
Confluent CCAAK では、耐久性パラメータ、レプリケーション方式、フェイルオーバー時のクライアント挙動やオフセット同期が頻出です。試験と運用の両面を意識し、確実に点が取れる設計・手順を提示します。
DR 設計の出発点は、想定する障害スコープと SLO(RPO/RTO)の確定です。リージョン断はネットワーク分断や電源喪失を含み、通常はクラスタ間のデータ複製が非同期になるため RPO は 0 になりません。RPO を小さくするほど、リンク帯域・遅延・コストのトレードオフが顕在化します。
クラスタ内の耐久性とクラスタ間の耐久性は分けて考えます。前者は min.insync.replicas、acks、unclean.leader.election.enable などで制御し、後者は MirrorMaker 2 または Cluster Linking の遅延・チェックポイント間隔・障害時の昇格手順で制御します。
耐久性を下支えする代表設定(broker と producer)
# server.properties(クラスタ内の耐久性)
min.insync.replicas=2
unclean.leader.election.enable=false
replica.lag.time.max.ms=30000
# リージョン内のゾーン配置に合わせる
broker.rack=az-a
# プロデューサ設定(書き込みの耐久性)
acks=all
enable.idempotence=true
max.in.flight.requests.per.connection=1
retries=1000000
request.timeout.ms=30000
delivery.timeout.ms=120000Kafka はリージョン間のネイティブ同期レプリケーションを持ちません。一般的な選択肢は MirrorMaker 2(Apache Kafka Connect ベース)と、Confluent の Cluster Linking です。どちらも原則非同期で、RPO はネットワーク遅延と処理遅延の合算で決まります。
MirrorMaker 2 は OSS ベースで柔軟なトポロジを組め、チェックポイントでコンシューマグループのオフセット同期を支援します。Cluster Linking はブローカーレベルのリンクで、ミラートピックの遅延が小さく運用も単純化されます(Confluent 環境前提)。
| 方式 | 実装範囲 | オフセット同期 | 遅延の目安 |
|---|---|---|---|
| MirrorMaker 2 | Kafka Connect 上のコネクタ群 | チェックポイントによる翻訳可 | 数秒〜数十秒(負荷依存) |
| Cluster Linking | ブローカーネイティブ(Confluent) | リンク内で翻訳可(ミラートピック) | 低遅延(トピック単位) |
| ストレージ/スナップショット転送 | 外部仕組み(非推奨) | 不可 | 大きい(分〜時) |
リージョン間レプリケーションの全体像
MirrorMaker 2 と Cluster Linking の最小構成例
# MirrorMaker 2(connect-mirror-maker 用プロパティ)
clusters = A, B
A.bootstrap.servers=a1:9092,a2:9092
B.bootstrap.servers=b1:9092,b2:9092
A->B.enabled=true
A->B.topics=orders.*,inventory.*
A->B.emit.checkpoints.enabled=true
replication.policy.class=org.apache.kafka.connect.mirror.IdentityReplicationPolicy
sync.topic.configs.enabled=true
sync.topic.acls.enabled=false
# Cluster Linking(Confluent CLI の一例。実コマンドは環境に依存)
confluent kafka link create dr-link \
--cluster B \
--source-cluster A \
--source-bootstrap-server a1:9092 \
--link-mode READ_ONLY
# ミラートピック作成
confluent kafka mirror create --link dr-link --topic ordersリージョン内の高可用性は replication.factor と rack awareness で担保します。一般に RF=3、min.insync.replicas=2 を基準とし、各パーティションのレプリカを別 AZ に配置します。broker.rack を正しく設定し、パーティション割り当て時にゾーン分散されるようにします。
データ保全を優先する DR 設計では unclean.leader.election.enable=false を徹底します。切り替え前提では、トピック名・スキーマ互換性・クリーンアップポリシー(delete/compact)を両リージョンで一致させ、Cluster Linking のミラートピックは昇格(プロモート)までは書き込み不可である点を理解しておきます。
代表的なトピック作成コマンド
kafka-topics \
--bootstrap-server a1:9092 \
--create \
--topic orders \
--partitions 12 \
--replication-factor 3 \
--config min.insync.replicas=2 \
--config cleanup.policy=delete計画フェイルオーバーでは、まずプライマリ側の書き込みを停止し、リージョン間のレプリケーション遅延とチェックポイントの到達を確認してから DR 側を昇格させます。非計画時は、直近のチェックポイントに基づきコンシューマオフセットを翻訳し、重複許容の設計(冪等プロデューサ、トランザクション、下流の冪等性)で吸収します。
クライアントはブートストラップ先をリージョン冗長化し、DNS/TLS SNI/負荷分散で切り替えやすくします。プロデューサは enable.idempotence と適切な delivery.timeout.ms、コンシューマはグループの静的メンバーシップ(group.instance.id)で大規模リバランスを抑制します。
フェイルオーバー手順のサンプル(計画・MM2/CL)
# 1) プライマリ側の書き込みを停止
# 2) リージョン間遅延を確認(例: 60 秒以下)
# - MM2: replication-latency-ms、checkpoints の遅延
# - CL: ミラートピックの lag メトリクス
# 3) DR 側の昇格
# Cluster Linking(例。環境によりコマンドは異なる)
confluent kafka mirror failover --link dr-link --topics 'orders.*'
# 4) クライアントの接続先を切替(DNS/設定配布)
# 5) 書き込み再開
# 非計画時(MM2 オフセット翻訳の概念例)
# 事前に MirrorCheckpointConnector を有効化している前提
# 翻訳されたオフセットに基づきコンシューマグループを調整
kafka-consumer-groups \
--bootstrap-server b1:9092 \
--group app-g \
--reset-offsets --topic orders --to-offset <translated-offset> --executeDR 側で稼働を継続した後にプライマリへ戻す場合、DR 側を真実の源泉として逆方向のレプリケーションを張り直し、差分が取り切れてからトラフィックを戻します。アクティブ−パッシブであれば単方向の切替で済むため、手順を自動化しやすいです。
アクティブ−アクティブは同一キーへの同時更新や順序差分が発生し得るため、重複排除キー設計や下流の upsert/整合ロジックが必須です。トランザクションはクラスタを越えては効かない点に注意し、必要に応じて一意キーと冪等処理で補います。
フェイルバックのためのリンク再作成例
# Cluster Linking(DR -> Primary に逆リンクを作成)
confluent kafka link create backfill \
--cluster A \
--source-cluster B \
--source-bootstrap-server b1:9092 \
--link-mode READ_ONLY
# MirrorMaker 2(双方向を有効化)
clusters = A, B
A->B.enabled=true
B->A.enabled=true
# フェイルバック時は B->A の topics を対象に限定試験では、クラスタ内耐久性とリージョン間 DR の切り分け、設定の意味と副作用、切替時のオフセット同期やクライアント挙動が問われます。非同期レプリケーション前提で RPO は 0 にならない点、unclean leader election を許可しない設計、min.insync.replicas と acks の関係を確実に押さえます。
運用では、UnderReplicatedPartitions、ActiveControllerCount、ミラーレイテンシ、リンク健全性を常時監視し、アラートと自動手順を連動させます。
Prometheus 風アラート例(抜粋)
alert: KafkaUnderReplicatedPartitions
expr: kafka_server_replicamanager_underreplicatedpartitions > 0
for: 5m
labels:
severity: critical
annotations:
summary: Under-replicated partitions detected
alert: ActiveControllerCountNotOne
expr: kafka_controller_kafkacontroller_activecontrollercount != 1
for: 1m
labels:
severity: warning
annotations:
summary: Active controller count is not 1
alert: MirrorLagHigh
expr: mm2_replication_latency_ms > 60000
for: 2m
labels:
severity: warning
annotations:
summary: MirrorMaker 2 replication latency exceeds 60sCCAAK
問題 1
2 リージョン構成で MirrorMaker 2 により A→B を非同期複製しています。RPO は 60 秒、RTO は 15 分です。計画フェイルオーバーでコンシューマの重複を最小化しつつ正しい位置から再開したい。最も適切な手順はどれですか?
正解: A
計画切替では書き込み停止→レプリケーション遅延とチェックポイント到達の確認→B 側でのオフセット翻訳→接続切替が定石です。B と D はデータ喪失や順序崩れのリスクが高く、C は RPO を悪化させます。
なぜリージョンをまたいだ同期レプリケーションを使わないのですか?
Kafka は設計上、リージョン間では非同期複製が前提です。広域網の遅延や分断により、同期にするとスループットと可用性が大きく損なわれます。RPO を小さくしたい場合は帯域・遅延・監視を強化し、計画切替時は遅延をゼロ近傍まで吸収してから昇格します。
Exactly-once はリージョンをまたいで保証されますか?
いいえ。Kafka のトランザクションと冪等プロデュースはクラスタ内の保証です。リージョン間では非同期のため、DR 設計では一意キーや下流の冪等処理で重複を吸収する前提にします。
Zookeeper から KRaft への移行は DR 設計に影響しますか?
クラスタ内メタデータ管理は変わりますが、リージョン間 DR の基本(MM2/Cluster Linking による非同期複製、RPO/RTO 設計、フェイルオーバー手順)は同じです。移行時はメトリクス名や運用コマンドの差異に注意します。
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-...