クラスタ間レプリケーションは、DR(災害対策)、リージョン間多活、移行時のダウンタイム削減に直結します。本稿ではKafka Connect上で動くMirrorMaker 2(以下MM2)の基本構造と設定要点を、過不足なく押さえます。
CCAAKではMM2のコンポーネント、トピック命名ポリシー、オフセット同期、内部トピックの役割が頻出です。暗記ではなく公式の振る舞いに即して理解しておきましょう。
MM2はKafka Connectベースのレプリケーション仕組みで、ソースクラスタからターゲットクラスタへトピックデータ、必要に応じてトピック設定やコンシューマグループのオフセット情報を同期します。一般にクラスタには短い別名(エイリアス)を付け、レプリケーションポリシーによってターゲット側のトピック名が決まります。
典型的なユースケースは、DRサイトへの片方向レプリケーション、別リージョンへの配信、段階的クラスタ移行、集約クラスタの構築です。RPO/RTO要件、ネットワーク遅延、対象トピックの粒度を最初に明確化するのが設計の第一歩です。
MM2はKafka Connectの上で3つのコネクタ群として動作します。MirrorSourceConnectorがトピックデータを読み出してターゲットに書き込み、MirrorCheckpointConnectorがコンシューマグループのチェックポイント(ソースとターゲットのオフセット対応情報)を同期し、MirrorHeartbeatConnectorがヘルス確認用のハートビートを送ります。これらは分散Connectワーカー上でタスクとして並列動作します。
トピック命名はデフォルトのDefaultReplicationPolicyにより、ターゲット側では「<ソースエイリアス>.<元トピック名」の形式になります。内部的にはチェックポイント、ハートビート、オフセット同期用の専用トピックがターゲット側に作成され、レプリケーションの整合性維持と監視に利用されます。
MM2の論理構成(片方向レプリケーション)
MM2は単一のプロパティファイルで複数クラスタを定義し、方向ごとに有効化します。正規表現で対象トピックを指定し、内部トピックとターゲット側に作成されるトピックのreplication.factorを十分に確保します。セキュリティはクラスタごとのconsumer/producer/admin接頭辞で指定します(SASL/SSL設定など)。
トピック設定同期やグループオフセット同期は明示的に有効化します。命名ポリシーを変える場合はReplicationPolicyを差し替えますが、移行計画と整合するか慎重に判断してください。
mm2.properties(片方向:src→dst の一例)
clusters=src,dst
src.bootstrap.servers=SRC_BROKERS:9092
dst.bootstrap.servers=DST_BROKERS:9092
# 有効化(方向ごと)
src->dst.enabled=true
# 対象トピック(正規表現)。必要に応じて限定する
src->dst.topics=orders|payments|users
# 例: 除外を使う場合(実装/配布によりプロパティ名が異なることがあるため公式ドキュメントを確認)
# src->dst.topics.blacklist=^_.*
# 命名ポリシー(デフォルトは src.<topic> 形式)
replication.policy.class=org.apache.kafka.connect.mirror.DefaultReplicationPolicy
# 設定とオフセット同期
sync.topic.configs.enabled=true
sync.group.offsets.enabled=true
emit.heartbeats.enabled=true
# 並列度と冗長性
tasks.max=4
replication.factor=3
checkpoints.topic.replication.factor=3
heartbeats.topic.replication.factor=3
offset-syncs.topic.replication.factor=3
# メタデータの更新間隔
refresh.topics.interval.seconds=60
refresh.groups.interval.seconds=60
# セキュリティ例(必要に応じて admin/producer/consumer の各接頭辞で設定)
src.consumer.security.protocol=SASL_SSL
src.consumer.sasl.mechanism=PLAIN
src.consumer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="user" password="pass";
dst.producer.security.protocol=SASL_SSL
dst.producer.sasl.mechanism=PLAIN
dst.producer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="user" password="pass";
# 必要に応じて管理クライアント
# dst.admin.security.protocol=SASL_SSL命名はReplicationPolicyに従います。DefaultReplicationPolicyではターゲット側のトピック名は「<ソースエイリアス>.<元名>」になり、衝突やループを避けやすくなります。IdentityReplicationPolicyを使うと同名トピックになりますが、双方向構成ではループ回避が難しく実務では慎重な設計が必要です。
オフセット同期はMirrorCheckpointConnectorとoffset-syncsにより行われ、sync.group.offsets.enabledを有効にすると、同一のgroup.idでターゲットにフェイルオーバーした際に、直近の整合した位置から再開しやすくなります。確実な移行には、ソース側コンシューマを停止→チェックポイントがターゲットへ反映されるのを待機→ターゲット側で同じgroup.idを起動、という手順が推奨です。
監視はConnectワーカーと各コネクタ/タスクのJMXメトリクス、ターゲット側のheartbeats・checkpoints・offset-syncsトピックのレイテンシやサイズを中心に行います。レプリケーションラグはラグメトリクスやコンシューマラグの可視化で追跡します。
チューニングは並列度(tasks.max)、ソース側コンシューマのフェッチ/バッチ設定、ターゲット側プロデューサのバッチング(linger.ms, batch.size)などが有効です。ネットワークの帯域/RTTがボトルネックになりやすいため、リージョン間では圧縮(compression.type)も検討します。
運用や試験対策では、旧MirrorMakerとの違い、そしてConfluentのCluster Linking(製品機能)との住み分けを理解しておくと混乱を防げます。MM2はConnectベースで拡張性と可観測性が高く、オフセット/設定同期の仕組みを備えます。一方、Cluster Linkingはクラスタ間でのブローカー間リンクにより管理を単純化する設計です(Confluentの提供機能)。
| 観点 | MirrorMaker(旧) | MirrorMaker 2 | Cluster Linking(Confluent) |
|---|---|---|---|
| 基盤 | 専用ツール(Connect非依存) | Kafka Connectベース(Source/Checkpoint/Heartbeat) | ブローカー間リンク(Connect不要) |
| オフセット同期 | 手作業/限定的 | チェックポイント+offset-syncsで同期可能 | リンク機構で自動的に整合 |
| トピック設定同期 | 不可 | sync.topic.configs.enabledで主要設定を同期 | リンク側で設定引き継ぎ(製品仕様) |
| 命名ポリシー | 同名が基本(衝突注意) | デフォルトは <src>.<topic>(変更可) | 同名が基本(製品仕様) |
| 運用性/監視 | 限定的 | Connectのスケール/監視が利用可能 | 製品の管理/監視機能を利用 |
| ユースケース | 簡易な片方向レプリケーション | 一般的なDR/移行/多活 | Confluent環境でのより簡便な多リージョン |
MM2は3つのコネクタ(Source/Checkpoint/Heartbeat)で構成され、Kafka Connect上で動作する点を押さえる。デフォルトのReplicationPolicyではターゲットのトピック名にソースエイリアスの接頭辞が付く。
sync.group.offsets.enabled と sync.topic.configs.enabled を必要に応じて有効化する。内部トピック(heartbeats, checkpoints, offset-syncs)はcompactかつ十分なreplication.factorで運用する。クラスタ間のEOSは提供されないため、重複に強いコンシューマ設計が前提。
CCAAK
問題 1
MM2でソースのコンシューマグループを停止後、ターゲットクラスタで同じgroup.idを用いて中断地点から再開したい。設定と前提の組み合わせとして最も適切なのはどれか。
正解: A
MM2のオフセット同期はMirrorCheckpointConnectorとoffset-syncsに基づき、sync.group.offsets.enabled を有効にしたうえでソース側を停止→チェックポイント反映→ターゲットで同じgroup.id起動、という手順が推奨。auto.offset.reset は既存オフセットがない場合の初期位置指定であり同期の代替にはならない。ReplicationPolicyは命名に影響するがオフセット同期の要件ではない。クラスタ間のEOSは提供されないためプロデューサの冪等化のみでは中断地点再開を保証しない。
双方向レプリケーションは可能ですか?ループはどう防ぎますか?
可能ですが慎重な設計が必要です。デフォルトのDefaultReplicationPolicyでソースエイリアスを接頭辞にすることで自己生成データの再取り込みを避けやすくなります。対象トピックを明示的に限定し、片方向ごとにフィルタリング(正規表現)を行うことでループを防止します。
MM2はクラスタ間でExactly-Once Semantics(EOS)を提供しますか?
提供しません。MM2はパーティション内順序と少なくとも1回の配信を前提にしています。重複排除はターゲット側のコンシューマ/アプリケーションや下流のストレージで対策してください。
スキーマやACLは同期されますか?
スキーマレジストリやACLはMM2の対象外です。トピック設定の一部は sync.topic.configs.enabled で同期されますが、スキーマはスキーマレジストリ側のレプリケーション/ミラー機能、ACLは各環境のセキュリティ運用で別途管理するのが一般的です。
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-...