Contents
Kafka ConnectによるMySQLデータ同期の概要と目的
Kafka Connectは、リアルタイムでMySQLからKafkaへデータを同期するための強力なツールです。本記事では、Kafka Connect MySQL データ同期手順を具体的に解説し、クラウド環境での安定した構築方法を紹介します。データエンジニアやシステム管理者がプラグイン選定からデプロイまでを理解できるよう、必要な知識と実践的な手順を網羅しています。
Kafka Connectアーキテクチャの設計原則
Kafka Connectは、データ移動と変換を簡潔に実現するためのプラグインベースフレームワークです。その設計原則を理解することで、リアルタイム同期の効率性や拡張性が向上します。
プラグインベースの構成特徴
Kafka Connectはコネクタ(Connector)形式で動作し、柔軟なカスタマイズが可能です。以下の表に代表的な構成要素と役割をまとめます。
| 項目 | 説明 | 補足 |
|---|---|---|
| ソースコネクタ(例: Debezium MySQL Connector) | MySQLからKafkaへのデータ同期を担当 | データベースの変更をリアルタイムで取得する |
| ワーカー(Worker) | コネクタの実行環境を提供し、複数のタスクを管理 | クラスタ構成でスケーラビリティが向上 |
| コンフィギュレーションファイル | connect-mysql-source.propertiesなどで動作を制御 |
パラメータの細かい調整が可能 |
Debezium MySQL Connectorの初期設定手順
DebeziumはMySQLの変更データキャプチャー(CDC)により、リアルタイムなデータ同期を実現します。以下に必要な準備と具体的な手順を解説します。
MySQLサーバー構成要件
Debeziumを導入する前に、以下の条件を満たしているか確認してください。
- バージョン: MySQL 5.7以降またはMariaDB 10.3以降
- ユーザー権限:
REPLICATION SLAVEおよびREPLICATION CLIENTの権限が必要 - バイナリログの有効化(後述)
バイナリログの有効化方法
MySQLサーバーでバイナリログを有効にするには、以下のようにmy.cnfまたはmy.iniファイルに設定を追加します。
-
MySQL構成ファイルを開く
bash
sudo nano /etc/mysql/my.cnf -
以下の記述を
[mysqld]セクション内に追加
ini
[mysqld]
log-bin=mysql-bin
server-id=1
binlog_format=row
expire_logs_days=7
max_binlog_size=500M -
MySQLを再起動
bash
sudo systemctl restart mysql -
権限設定を行う(例:
debeziumユーザーを作成)
sql
CREATE USER 'debezium'@'%' IDENTIFIED BY 'your_secure_password';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'debezium'@'%';
FLUSH PRIVILEGES;
注意: バイナリログの有効化は、MySQLパフォーマンスに影響を与える可能性があります。テスト環境で事前に確認することを推奨します。
例: 実際には20〜30%のディスク使用量増加や15%程度のCPU負荷上昇が報告されています。
Kafka Connect MySQLソースプラグインの設定例
Kafka Connectでは、connect-mysql-source.propertiesファイルを使ってMySQLとKafkaとの接続情報を定義します。このファイルの構成が正しくないと同期処理に失敗する可能性があります。
connect-mysql-source.propertiesファイル構造
以下は基本的な設定例です。環境に応じてパラメータを調整してください。パスワードにはyour_secure_passwordなど適切な管理方法を用いることを推奨します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
name=mysql-source-connector configurations={ "database.hostname": "mysql-host", "database.port": "3306", "database.user": "debezium", "database.password": "your_secure_password", "database.allowPublicKeyRetrieval": "true", "database.server.id": "184054", "database.server.name": "inventory-server", "database.include.list": "inventory", "message.key.headers": "true" } |
主要パラメータ解説
以下は重要な設定項目とその役割をまとめた表です。
| パラメータ | 説明 | 必須か |
|---|---|---|
| database.hostname | MySQLサーバーのホスト名 | はい |
| database.port | MySQLの接続ポート(通常3306) | はい |
| database.server.id | サーバー固有ID(他のMySQL接続と重複しないように設定) | はい |
| database.include.list | 同期対象のデータベース名を指定 | はい |
| message.key.headers | メッセージキーとしてヘッダー情報を含めるか | いいえ(デフォルトfalse) |
ヒント:
database.server.nameはKafka内のトピック名に影響を与えるため、一意の値を設定することが重要です。
クラウド環境での展開ガイド
AWS MSKやAlibaba Cloudなどのクラウド環境では、ネットワーク構成やセキュリティポリシーが異なります。それぞれの特徴に応じた手順を確認しましょう。
AWS MSKでのKafka Connectデプロイ
AWS Managed Streaming for Apache Kafka (MSK) を使用する場合、以下のような手順でKafka Connectを構築します。
- クラスター作成
- AWSコンソールからMSKクラスターを作成し、VPCとサブネットを選択
-
Kafka Connectが動作するためのセキュリティグループを設定(例: 9092ポート開放)
-
ローカル環境でのKafka Connect実装
- Kafka Connectプラグインを事前に構築し、
connect-mysql-source.propertiesファイルを作成 -
kafka-connect-distributed.propertiesでZookeeperとMSKの接続情報を設定 -
AWS MSKへのデプロイ
- EC2やEKSで実行するKafka ConnectをMSKクラスターに接続
- IAMロールを取得し、セキュリティグループでアクセス制限を設定
注意: AWS環境では、MySQLとMSKの間の通信がVPC内であることを確認してください。
IAMロール手順: 1. AWSコンソールからIAM > ロール > 新規作成を選択
2. ポリシーにAmazonMSKFullAccessを追加
3. Kafka Connectインスタンスにアタッチ
Alibaba CloudでのKafka Connect構築
Alibaba Cloudの場合、以下の特徴があります。
- ネットワーク構成: VPC内のプライベートアドレスで接続を行うことが推奨されます
-
セキュリティグループ設定: MySQLとKafkaの両方にアクセスが許可されているか確認する必要があります
-
Alibaba Cloud Kafkaサービスの選択
-
「Alibaba Cloud Kafka」サービスからクラスターを作成し、インスタンスタイプを選択
-
MySQLへの接続設定
-
MySQLデータベースにデプロイされたDebeziumが、Kafka Connectと通信できるようにセキュリティグループを調整
-
Kafka Connectの起動
- Kafka Connectプラグインをローカルで構築し、クラスター接続情報を設定
比較: AWS MSKは管理されたサービスだが、Alibaba Cloudではより柔軟なネットワーク構成が可能。選択に際しては、自社のニーズに応じて評価することが重要です。
データ同期の検証とトラブルシューティング
Kafka Connectを使ってMySQLからデータを同期するには、定期的な検証とトラブルシューティングが不可欠です。特にクラウド環境では、ネットワークやセキュリティ設定の変更により予期せぬエラーが発生することがあります。
プロダクション環境での検証手順
以下のような手順で同期状況を確認してください。
- Kafkaトピックにデータが送信されているか
-
kafka-console-consumer.shコマンドでメッセージを確認
bash
./bin/kafka-console-consumer.sh --bootstrap-server <broker:port> --topic inventory.customers --from-beginning -
Debeziumのログを確認する
-
DebeziumがMySQLからデータを正しく取得できているか、ログで確認
-
Kafka Connectのステータスを監視
http://<connect-server>:8083/connector-pluginsにアクセスし、プラグインが正常動作しているかを確認
よくあるエラーケースと対処法
| エラーメッセージ | 原因 | 対処法 |
|---|---|---|
| Connection refused | MySQLまたはKafkaへの接続が失敗している | ネットワーク設定やポート開放を確認 |
| SSL handshake failed | 認証プロトコルの不一致 | SSL/TLS設定を同じバージョンに統一 |
| Unknown database error | 指定されたデータベースが存在しない | database.include.listに正しい名前を入力 |
| No data available for schema | データ同期がうまく行われていない | MySQLのバイナリログが正しく有効化されているか確認 |
ヒント: 認証情報を管理するために、AWS Secrets Managerなどを利用するとセキュリティと運用の手間を軽減できます。