パート 5: Kafka Connect と MirrorMaker
サポートバージョン: Strimzi 0.45+, Kafka 3.9, MirrorMaker 2
最終更新: July 9, 2026
Kafka Connect の概要
Kafka Connect は、カスタムの統合コードを書くことなく、Kafka と外部システム(database、object storage、search engine など)の間でデータを移動するための framework です。connector 設定を通じて data pipeline を宣言的に記述すると、残りは Connect が処理します。
Connectors には、データが流れる方向に応じて 2 つの種類があります。
- Source connectors は、外部システムから Kafka へデータを取り込みます。Debezium は代表的な例です。database の write-ahead log(または binlog)を読み取り、row-level の変更イベントを CDC (Change Data Capture) pipeline として Kafka に stream します。JDBC Source Connector は、より単純な query-based のアプローチを取り、定期的に table を polling して結果を Kafka に書き込みます。
- Sink connectors は、Kafka から外部システムへデータを送り出します。S3 Sink Connector は topic data を JSON や Parquet などの形式で S3 に書き込み、Elasticsearch Sink Connector は検索と分析のために topic records を index 化します。
Kafka Connect は 2 つの runtime mode をサポートします。
- Distributed mode: 複数の worker process(Pods)が group を形成し、単一の Connect cluster として動作します。1 つの worker が group coordinator として機能し、connectors とその tasks を group 全体に分散します。worker が停止した場合、その tasks は生存している workers に自動的に re-balance されます。connector lifecycle(create、delete、reconfigure)は REST API(default では port 8083)を通じて操作されます。これは Kubernetes で使用される唯一の mode です。
- Standalone mode: file-based の offset store を持つ単一 process で、local development を想定しています。高可用性や水平 scaling がないため、Kubernetes では使用されません。
Distributed workers は、offset、connector/task configuration、task status を 3 つの internal topics(offset.storage.topic, config.storage.topic, status.storage.topic)に永続化します。これらの topics が失われると、cluster 上のすべての connector が state を失うため、production deployment では必ず replication factor を少なくとも 3 に設定する必要があります。
Strimzi で Kafka Connect をデプロイする
Strimzi は、KafkaConnect CRD を通じて distributed Connect cluster 自体を管理し、その上で動作する個々の connector instances を KafkaConnector CRD を通じて管理します。KafkaConnector resources を使用すると、REST API を手動で呼び出す代わりに、connectors を GitOps でデプロイおよび version control できます。Strimzi に KafkaConnector resources を reconcile させるには、KafkaConnect resource に strimzi.io/use-connector-resources: "true" annotation が必要です。
Connector plugins は base Strimzi Kafka Connect image には bundle されていないため、custom image が必要です。Strimzi が推奨する pattern では、Dockerfile を手書きする必要がありません。plugin artifacts(tgz/zip/jar、または Maven coordinates)を KafkaConnect.spec.build の下で宣言すると、Strimzi Operator が image を build し、指定した registry(Amazon ECR など)へ push します。
KafkaConnect build spec
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
name: connect-cluster
namespace: kafka
annotations:
strimzi.io/use-connector-resources: "true"
spec:
version: 3.9.0
replicas: 3
bootstrapServers: my-cluster-kafka-bootstrap:9093
tls:
trustedCertificates:
- secretName: my-cluster-cluster-ca-cert
certificate: ca.crt
config:
group.id: connect-cluster
offset.storage.topic: connect-cluster-offsets
config.storage.topic: connect-cluster-configs
status.storage.topic: connect-cluster-status
offset.storage.replication.factor: 3
config.storage.replication.factor: 3
status.storage.replication.factor: 3
key.converter: org.apache.kafka.connect.json.JsonConverter
value.converter: org.apache.kafka.connect.json.JsonConverter
build:
output:
type: docker
image: <account-id>.dkr.ecr.<region>.amazonaws.com/connect-cluster:latest
pushSecret: ecr-registry-credentials
plugins:
- name: debezium-postgres
artifacts:
- type: tgz
url: https://repo1.maven.org/maven2/io/debezium/debezium-connector-postgres/2.7.3.Final/debezium-connector-postgres-2.7.3.Final-plugin.tar.gz
- name: aiven-s3-sink
artifacts:
- type: zip
url: https://github.com/Aiven-Open/cloud-storage-connectors-for-apache-kafka/releases/download/v3.4.0/s3-sink-connector-for-apache-kafka-3.4.0.zip
resources:
requests:
cpu: "1"
memory: 2Gi
limits:
cpu: "2"
memory: 2Gispec.build が変更されるたびに(plugin の追加、version の引き上げなど)、Operator は image を rebuild し、Deployment を自動的に roll out します。pushSecret で参照される Secret には、ECR への push を成功させるための registry credentials(docker-registry type の Secret)が必要です。必要であれば、IRSA を通じてその access を付与できます。
KafkaConnector — Debezium PostgreSQL source の例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
name: orders-db-source
namespace: kafka
labels:
strimzi.io/cluster: connect-cluster
spec:
class: io.debezium.connector.postgresql.PostgresConnector
tasksMax: 1
config:
database.hostname: orders-db.xxxxxxx.us-east-1.rds.amazonaws.com
database.port: 5432
database.user: debezium
database.password: "${secrets:kafka/debezium-db-credentials:password}"
database.dbname: orders
topic.prefix: orders-db
plugin.name: pgoutput
slot.name: debezium_orders
table.include.list: public.orders,public.order_itemsKafkaConnector — S3 sink の例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
name: orders-s3-sink
namespace: kafka
labels:
strimzi.io/cluster: connect-cluster
spec:
class: io.aiven.kafka.connect.s3.S3SinkConnector
tasksMax: 3
config:
topics: orders-db.public.orders
aws.s3.bucket.name: orders-data-lake
aws.s3.region: us-east-1
format.output.type: jsonl
file.compression.type: gzip
flush.size: 10000
rotate.schedule.interval.ms: 300000kubectl get kafkaconnector -n kafka は各 connector の status を表示します。Ready: True condition は、その tasks が workers に割り当てられ、実行中であることを意味します。
MirrorMaker 2 Architecture
MirrorMaker 2 (MM2) は、Kafka Connect framework の上に構築された、topic-level の cluster-to-cluster replication tool です。単に messages を copy するだけではありません。source cluster の partitioning を保持し、consumer group offsets を変換します。これにより、disaster recovery 時に clean な consumer failover が可能になります。内部的に、MM2 は 3 つの connectors で構成されています。
- MirrorSourceConnector: 実際の message replication を行い、topic configuration と ACLs も同期します。
- MirrorCheckpointConnector: source cluster の consumer group offsets を target cluster 上の対応する offsets に定期的に変換し、それらを checkpoint topic に記録します。この offset translation によって、DR cluster に fail over する consumer は「どこまで処理済みだったか」を把握できます。
- MirrorHeartbeatConnector: source cluster が稼働しており、replication pipeline が機能していることを示す heartbeat messages を定期的に送信します。これは replication lag や完全な disconnection の検出に使用されます。
MM2 は source topic の名前を target cluster でそのまま再利用しません。default の DefaultReplicationPolicy は remote topics に <source-cluster-alias>.<topic> という名前を付けます。たとえば、us-east-1 という alias の cluster から orders topic を replicate すると、target 上には us-east-1.orders という remote topic が作成されます。この naming convention により、consumers は topic name だけで locally-produced messages と mirrored messages を区別できます。また、bidirectional setup で infinite replication loops を防ぐ仕組みとしても機能します。
Disaster Recovery Patterns
Active-Passive
これは最も一般的な pattern です。replication は primary-region cluster から DR-region cluster への一方向で実行されます。通常運用では、applications は primary cluster にのみ接続し、DR cluster は idle のまま replicated data を蓄積します。regional failure が発生したら、MirrorCheckpointConnector によって記録された offset translations を使って consumer groups を DR cluster に移動し、利用可能な最新の checkpoint から consumption を再開します。これは完全な exactly-once cutover ではありません。failure に対して checkpoint がいつ取得されたかによって、少数の messages が再処理される可能性があります。また MM2 replication は asynchronous であるため、failure の瞬間にまだ DR cluster へ replicate されていない message は失われます(RPO は replication lag によって制限され、zero ではありません)。しかし重要な利点は、その lag window に data loss を最小化しながら高速に recovery できることです。
Active-Active
両方の regions が traffic を処理し、各 cluster が相手側へ bidirectional に replicate します。これには実際の risk があります。topic が A → B に mirror され(A.orders として)、明示的に防止しない限り、B → A にそのまま mirror され返され、永久に loop する可能性があります。Strimzi/MM2 は、replication.policy.class で設定される naming policy(default の DefaultReplicationPolicy、または remote topics に元の名前を維持させたい場合の IdentityReplicationPolicy)を通じてこれを防ぎます。すでに remote-cluster prefix(A.orders など)を持つ topics は、さらなる mirroring から除外されます。topicsPattern を cross-region replication が実際に必要な topics のみに絞ることで、偶発的な replication loops に対する第 2 の保護層を追加できます。
KafkaMirrorMaker2 CR の例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaMirrorMaker2
metadata:
name: primary-to-dr
namespace: kafka
spec:
version: 3.9.0
replicas: 3
connectCluster: dr-region
clusters:
- alias: us-east-1
bootstrapServers: primary-kafka-bootstrap.us-east-1.example.com:9093
tls:
trustedCertificates:
- secretName: primary-cluster-ca-cert
certificate: ca.crt
authentication:
type: tls
certificateAndKey:
secretName: mm2-user
certificate: user.crt
key: user.key
- alias: dr-region
bootstrapServers: dr-kafka-bootstrap.us-west-2.example.com:9093
config:
config.storage.replication.factor: 3
offset.storage.replication.factor: 3
status.storage.replication.factor: 3
mirrors:
- sourceCluster: us-east-1
targetCluster: dr-region
sourceConnector:
tasksMax: 5
config:
replication.factor: 3
offset-syncs.topic.replication.factor: 3
sync.topic.acls.enabled: "true"
heartbeatConnector:
config:
heartbeats.topic.replication.factor: 3
checkpointConnector:
config:
checkpoints.topic.replication.factor: 3
sync.group.offsets.enabled: "true"
topicsPattern: "orders.*|payments.*"
groupsPattern: "orders-consumer-.*"connectCluster: dr-region は、MM2 worker Pods に対して、Connect 自身の internal topics を格納するためにどの cluster(ここでは DR region)を使用するべきかを指示します。sync.group.offsets.enabled: "true" を有効にすると、MirrorCheckpointConnector は変換済み offsets を DR cluster の __consumer_offsets に定期的に書き込みます。これにより、fail over した consumer は最初に offsets を手動で commit しなくても consumption を再開できます。
Cross-Region Replication Considerations
- Network cost and latency: regions 間(または AZs 間でさえ)の replication には data transfer cost と round-trip latency が伴います。MM2 workers を target region で実行し、source cluster から data を pull するのが一般的です。batch size(
producer.override.batch.size)と compression(producer.override.compression.type: zstd)を tuning すると、実際に転送される volume が減り、cross-region data transfer cost の削減に直接つながります。 sync.topic.acls.enabled: source cluster の topic ACLs も target に同期するかどうかを制御します。有効にすると access control policy を二重に保守する必要がありません。しかし 2 つの clusters の security posture が異なる場合(たとえば DR cluster が primary より厳格な access を要求する場合)、無効にして各側で ACLs を独立して管理する方が安全なことがあります。- Monitoring replication lag: MM2 は replication health のための独自 metrics を公開します。
replication-latency-msは message が source で produce されてから target に完全に replicate されるまでの時間を報告し、checkpoint connector の lag-related metrics は offset translation がどれだけ最新かを示します。これらを Prometheus に scrape し、SLA(例:「replication lag を 5 分未満に保つ」)に基づいて alert することで、DR cluster が実際に fail over 可能な状態にあることを継続的に検証できます。
次のステップ
Kafka Connect と MirrorMaker 2 による data movement と disaster recovery が整ったら、次のステップは、この workload が fully managed の Amazon MSK service とどのように統合されるか、またはどのように比較されるかを確認することです。これは パート 6: MSK Integration で扱います。
クイズ
この章で学んだ内容を確認するには、トピッククイズ に挑戦してください。