このトピックでは、Kafka Connect 上で MirrorMaker 2 (MM2) を使用してクラスター間でデータを同期する方法について説明します。
背景
ユースケース
Kafka MM2 は、次のユースケースに適しています。
- リモートデータ同期: MM2 を使用すると、異なるリージョンにあるクラスター間で Kafka データをレプリケートできます。
- ディザスタリカバリ: MM2 を使用して、異なるデータセンターにプライマリおよびバックアップクラスターを備えた高可用性アーキテクチャを構築できます。MM2 はクラスター間のデータをリアルタイムで同期します。一方のクラスターに障害が発生した場合、アプリケーションをもう一方のクラスターに切り替えて、ジオディザスタリカバリを実現できます。
- データ移行: MM2 を使用してデータを移行し、クラウド移行、ハイブリッドクラウドの採用、またはクラスターのアップグレード中にビジネスの継続性を確保できます。
- データ集約: MM2 を使用して、複数の Kafka サブクラスターから中央の Kafka クラスターにデータを同期し、データ集約を行うことができます。
機能
データレプリケーションツールとして、MM2 は次の機能を提供します。
- トピックデータと設定のレプリケート。
- コンシューマーグループとそのオフセットのレプリケート。
- アクセス制御リスト (ACL) のレプリケート。
- 新しいトピックとパーティションの自動検出。
- MM2 メトリクスの提供。
- 高可用性で水平方向にスケーラブルなフレームワークの提供。
タスクの実行方法
MM2 タスクは、次の方法で実行できます。
- 分散 Connect クラスターのコネクターとして実行 (推奨):この方法では、既存の Kafka Connect クラスターで MM2 コネクタータスクを実行します。このトピックの手順に従って、Kafka Connect サービスを使用して MM2 タスクを管理できます。
- 専用の MirrorMaker クラスターで実行:この方法では、Kafka Connect クラスターは必要ありません。ドライバープログラムを通じてすべての MM2 タスクを直接管理します。詳細な手順については、「MirrorMaker 2 (専用) を使用したクラスター間のデータ同期」をご参照ください。
- スタンドアロン Kafka Connect クラスターのワーカーとして実行:この方法では、単一の MirrorSourceConnector タスクを実行し、テスト環境に適しています。
説明 分散 Kafka Connect クラスターで MM2 コネクタータスクを実行すると、Kafka Connect クラスターの REST API を使用して管理できます。
MM2 の詳細については、Apache Kafka ドキュメントをご参照ください。
前提条件
ソースクラスター (emrsource) とターゲットクラスター (emrdest) の 2 つの Kafka クラスターを作成します。両方のクラスターで Kafka サービスを選択します。DataFlow クラスターの作成方法については、「クラスターの作成」をご参照ください。説明 この例では、ソースクラスターとターゲットクラスターはどちらも、同じ Virtual Private Cloud (VPC) 内にある E-MapReduce V3.42.0 DataFlow クラスターです。
制限事項
ターゲットクラスターの Kafka バージョンは 2.12_2.4.1 以降である必要があります。
操作手順
ステップ 1:Kafka Connect クラスターの作成
- E-MapReduce のタスクノードグループを作成します。
E-MapReduce コンソールの
emrdestターゲットクラスターの Nodes ページで、タスクノードグループを作成します。- [Create Node Group] をクリックします。
- [Create Node Group] パネルで、次のパラメーターを設定します。他のパラメーターはデフォルト値を使用するか、必要に応じて設定します。
パラメーター 説明 [Node Group Type] [TASK (Task Node Group)] を選択します。 [Node Group Name] 名前を入力します。この例では emr-taskを使用します。[Storage Configuration] データディスクを選択します。
- タスクノードグループをスケールアウトします。
- Nodes ページで、
emr-taskノードグループを見つけ、[Actions] 列の スケールアウト をクリックします。 - 表示されるダイアログボックスで、追加するインスタンスの数を指定し、Terms of Service を選択します。
この例では、1 つのインスタンスを追加します。必要に応じて、タスクインスタンスの数をスケールアウトできます。高可用性 Kafka Connect クラスターの場合、少なくとも 2 つのインスタンスを追加します。
- OK をクリックします。
- Nodes ページで、
- KafkaConnect サービスのステータスを確認し、Kafka Connect クラスターが実行中であることを確かめます。
- ページ上部の Services をクリックします。
- Kafka サービスセクションで、Status をクリックします。
- Components セクションで、KafkaConnect のステータスが実行中であることを確認します。
[Topology] リストで、KafkaConnect ノード task-1-1 (ロール:Task) のヘルスステータスが [Healthy] で、コンポーネントのステータスが [Running] であることを確認します。
- SSH を使用して
emrdestターゲットクラスターに接続します。詳細については、「クラスターへの接続」をご参照ください。 - 次のコマンドを実行して、Kafka Connect REST サービスのステータスを確認します。
curl -X GET http://task-1-1:8083| jq .出力は次のようになります。% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 91 100 91 0 0 13407 0 --:--:-- --:--:-- --:--:-- 15166 { "version": "2.4.1", "commit": "42ce056344c5625a", "kafka_cluster_id": "6Z7IdHW4SVO1Pbql4c****" }
ステップ 2:MirrorMaker 2 コネクターの使用
- MM2 コネクターの設定ファイルを準備します。
次のファイルを準備します。
- MirrorSourceConnector 設定ファイルを準備します。この例では、MirrorSourceConnector 設定ファイルの名前は mm2-source-connector.json です。次の例を使用して、ご使用の環境に合わせてパラメーター値を置き換えてください。設定オプションの詳細については、KIP-382 の関連セクションをご参照ください。
{ "name": "mm2-source-connector", "connector.class": "org.apache.kafka.connect.mirror.MirrorSourceConnector", "clusters": "emrsource,emrdest", "source.cluster.alias": "emrsource", "target.cluster.alias": "emrdest", "target.cluster.bootstrap.servers": "core-1-1:9092;core-1-2:9092;core-1-3:9092", "source.cluster.bootstrap.servers": "10.0.**.**:9092", "topics": "^foo.*", "tasks.max": "4", "key.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", "replication.factor": "3", "offset-syncs.topic.replication.factor": "3", "sync.topic.acls.interval.seconds": "20", "sync.topic.configs.interval.seconds": "20", "refresh.topics.interval.seconds": "20", "refresh.groups.interval.seconds": "20", "consumer.group.id": "mm2-mirror-source-consumer-group", "producer.enable.idempotence":"true", "source.cluster.security.protocol": "PLAINTEXT", "target.cluster.security.protocol": "PLAINTEXT" }説明 この例のパラメーター:source.cluster.bootstrap.servers:このパラメーターの値を、emrsourceソースクラスターの Kafka サービスのエンドポイントに置き換えてください。ソース Kafka クラスターと Kafka Connect クラスター間の通信を確保してください。topics:このパラメーターは、ソースクラスターからfooで始まる名前のトピックをレプリケートします。
- MirrorCheckpointConnector 設定ファイルを準備します。この例では、MirrorCheckpointConnector 設定ファイルの名前は mm2-checkpoint-connector.json です。次の例を使用して、ご使用の環境に合わせてパラメーター値を置き換えてください。設定オプションの詳細については、KIP-382 の関連セクションをご参照ください。
{ "name": "mm2-checkpoint-connector", "connector.class": "org.apache.kafka.connect.mirror.MirrorCheckpointConnector", "clusters": "emrsource,emrdest", "source.cluster.alias": "emrsource", "target.cluster.alias": "emrdest", "target.cluster.bootstrap.servers": "core-1-1:9092;core-1-2:9092;core-1-3:9092", "source.cluster.bootstrap.servers": "10.0.**.**:9092", "tasks.max": "1", "key.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", "replication.factor": "3", "checkpoints.topic.replication.factor": "3", "emit.checkpoints.interval.seconds": "20", "source.cluster.security.protocol": "PLAINTEXT", "target.cluster.security.protocol": "PLAINTEXT" } - MirrorHeartbeatConnector 設定ファイルを準備します。この例では、MirrorHeartbeatConnector 設定ファイルの名前は mm2-heartbeat-connector.json です。次の例を使用して、ご使用の環境に合わせてパラメーター値を置き換えてください。設定オプションの詳細については、KIP-382 の関連セクションをご参照ください。
{ "name": "mm2-heartbeat-connector", "connector.class": "org.apache.kafka.connect.mirror.MirrorHeartbeatConnector", "clusters": "emrsource,emrdest", "source.cluster.alias": "emrsource", "target.cluster.alias": "emrdest", "target.cluster.bootstrap.servers": "core-1-1:9092;core-1-2:9092;core-1-3:9092", "source.cluster.bootstrap.servers": "10.0.**.**:9092", "tasks.max": "1", "key.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter", "replication.factor": "3", "heartbeats.topic.replication.factor": "3", "emit.heartbeats.interval.seconds": "20", "source.cluster.security.protocol": "PLAINTEXT", "target.cluster.security.protocol": "PLAINTEXT" }
- MirrorSourceConnector 設定ファイルを準備します。
- MirrorSourceConnector を使用します。
- Kafka Connect REST サービスで、mm2-source-connector.json ファイルを使用して MirrorSourceConnector タスクを作成します。
curl -X PUT -H "Content-Type: application/json" --data @mm2-source-connector.json http://task-1-1:8083/connectors/mm2-source-connector/config - 次のコマンドを実行して、
mm2-source-connectorのステータスを確認します。curl -s task-1-1:8083/connectors/mm2-source-connector/status | jq .
- Kafka Connect REST サービスで、mm2-source-connector.json ファイルを使用して MirrorSourceConnector タスクを作成します。
- MirrorCheckpointConnector を使用します。
- Kafka Connect REST サービスで、mm2-checkpoint-connector.json ファイルを使用して MirrorCheckpointConnector タスクを作成します。
curl -X PUT -H "Content-Type: application/json" --data @mm2-checkpoint-connector.json http://task-1-1:8083/connectors/mm2-checkpoint-connector/config - 次のコマンドを実行して、
mm2-checkpoint-connectorのステータスを確認します。curl -s task-1-1:8083/connectors/mm2-checkpoint-connector/status | jq .
- Kafka Connect REST サービスで、mm2-checkpoint-connector.json ファイルを使用して MirrorCheckpointConnector タスクを作成します。
- MirrorHeartbeatConnector を使用します。
- Kafka Connect REST サービスで、mm2-heartbeat-connector.json ファイルを使用して MirrorHeartbeatConnector タスクを作成します。
curl -X PUT -H "Content-Type: application/json" --data @mm2-heartbeat-connector.json http://task-1-1:8083/connectors/mm2-heartbeat-connector/config - 次のコマンドを実行して、
mm2-heartbeat-connectorのステータスを確認します。curl -s task-1-1:8083/connectors/mm2-heartbeat-connector/status | jq .
- Kafka Connect REST サービスで、mm2-heartbeat-connector.json ファイルを使用して MirrorHeartbeatConnector タスクを作成します。
- ターゲットクラスターで、次のコマンドを実行して MM2 に関連するトピックを表示します。
kafka-topics.sh --list --bootstrap-server core-1-1:9092ターゲットクラスターには、次のトピックが作成されます。emrsource.fooで始まるトピック:MirrorSourceConnector が作成します。これらは、ソースクラスター内の
fooで始まるトピックに対応します。emrsource.checkpoints.internal: MirrorCheckpointConnector が作成し、オフセットなどの情報を保存します。heartbeats: MirrorHeartbeatConnector が作成します。