アーキテクチャセンター
Kafka と Canal を使用して Redis と MySQL 間のデータ同期を設定

Kafka と Canal を使用して Redis と MySQL 間のデータ同期を設定

概要
本ソリューションは、KafkaCanal を使用して、RedisMySQL 間のデータ同期を実現します。
Canal は MySQL のセカンダリインスタンスとして振る舞い、MySQL のインタラクティブなプロトコルをシミュレートして、プライマリ MySQL インスタンスにダンププロトコルを送信します。プライマリ MySQL インスタンスはダンプリクエストを受信し、バイナリログをセカンダリ MySQL インスタンス(Canal など)にプッシュし始めます。その後、Canal はバイナリログオブジェクト(元はバイトストリーム)を解析し、MySQL、Kafka、Elasticsearch などのストレージ宛先に送信します。
リファレンスアーキテクチャ
以下のアーキテクチャ図は、Kafka と Canal を使用して Redis と MySQL 間でデータ同期を実現する方法を示しています。この図で示すシナリオ:
MySQL、Kafka、Redis は Terraform を使用して作成されます。
Canal を ECS にデプロイします。
手順
デプロイガイドの第 4 章の手順に従い、Terraform を使用してリソースを作成し、環境を構築します。
1. Terraform をインストールする
2. Terraform でこの main.tf ファイルを使用して、VPC、vSwitch、セキュリティグループなどのリソースを作成します。
3. MySQL クライアントをインストールします
4. Redis クライアントをインストールする
5. JDK をインストールします
6. Kafka 環境を準備します
7. RDS 環境を準備する
Canal のインストールとデータ同期の設定
1. 次のコマンドを実行して、Canal インストールパッケージをダウンロードします。
cd && wget https://labex-ali-data.oss-us-west-1.aliyuncs.com/canal/canal.deployer-1.1.5.tar.gz
2. 以下のコマンドを実行して、canal ディレクトリを作成し、canal インストールパッケージをこのディレクトリにダウンロードします。
mkdir canal tar -zxvf canal.deployer-1.1.5.tar.gz -C canal
3. 以下のコマンドを実行して、canal ディレクトリ内のファイルを確認します。
cd canal && ls
4. vim conf/canal.properties コマンドを実行して、関連する設定を変更します。
注:YOUR-KAFKA-ADDR をご自身の Kafka 接続エンドポイントに置き換えます。
5. vim conf/example/instance.properties コマンドを実行して、関連する設定を変更します。
注:YOUR-RDS-ADDR を RDS の接続エンドポイントに置き換えます。
6. 次のコマンドを実行して、Canal サービスを起動します。
bin/startup.sh
7. Alibaba Cloud Kafka コンソールに移動し、Kafka のトピックがメッセージの受信を開始したことを確認します。これは、Canal が RDS のログデータを Kafka に同期していることを示します。
8. 以下のコマンドを実行して、Kafka のデータを Redis に同期するためのサンプル jar パッケージをダウンロードします。
cd && wget https://labex-ali-data.oss-us-west-1.aliyuncs.com/canal/canal-0.0.1-SNAPSHOT.jar
9. 以下のコマンドを実行して、同期プロセスを開始します。
注:YOUR-KAFKA-ADDR と YOUR-REDIS-ADDR をそれぞれの Kafka と Redis の接続エンドポイントに置き換えます。
java -cp canal-0.0.1-SNAPSHOT.jar canal.SyncKafkaRedis YOUR-KAFKA-ADDR topic1 group1 YOUR-REDIS-ADDR Aliyun-test
データが同期されていることが確認できます。出力メッセージは Kafka から消費されます。
データ同期のテスト
ECS のコマンドラインインターフェースを 2 つ新しく作成します。同期プロセスを実行中のものをコマンドライン 1 と呼びます。新しく作成したものは、それぞれコマンドライン 2、コマンドライン 3 と呼びます。
1. RDS データベースの user テーブルにデータを挿入します。
以下のコマンドを入力して、user テーブルにデータを挿入します。
insert into user values("19832", "name1", "ddsdfdfd", "addr1", "17138141002", "nickname1"); insert into user values("20122", "name2", "xdfdsafd", "addr2", "13877686321", "nickname2");
2. RDS のデータを更新します。
コマンドライン 2 で、次のコマンドを入力して id = "19832" のデータを更新します。
update user set username = "nanzhao" where id = "19832";
コマンドライン 3 で、次のコマンドを入力します。データが更新されたことを確認できます。
get 19832
3. RDS のデータを削除します。
コマンドライン 2 で、次のコマンドを入力して id = "19832" のデータを削除します。
delete from user where id = "19832";
コマンドライン 3 で、次のコマンドを入力します。Redis キーが存在しなくなっていることを確認できます。これは同期が成功したことを示します。
get 19832
Web アプリでの Redis データの表示
1. Apache 環境をインストールします。
「labex2」インスタンスにリモートログインします。
ECS インスタンスのデフォルトのアカウント名とパスワードは以下のとおりです。
アカウント名:root
パスワード:Aliyun-test

次のコマンドを実行して apache2 をインストールします。
apt update && apt install -y apache2 python3-pip
2. 以下のコマンドを実行して、Python の Redis 依存関係をインストールします。
pip3 install redis
3. 次のコマンドを実行して、フォルダを作成します。
mkdir /var/www/python
4. 以下のコマンドを実行して、イベントモジュールを無効化し、prefork モジュールを有効にします。
a2dismod mpm_event
a2enmod mpm_prefork cgi
5. vim /etc/apache2/sites-enabled/000-default.conf コマンドを実行して、Apache 設定ファイルを開きます。ファイル内のすべての内容をデプロイガイドのセクション 7.1のコードに置き換えます。設定を保存して終了します。
6. vim /var/www/python/showRedis.py コマンドを実行して、新しいファイルを作成します。デプロイガイドのセクション 7.1 のコードをコピーして、ファイルに貼り付けます。設定を保存して終了します。
注:YOUR-REDIS-PUBLIC-DOMAIN を Redis インスタンスのアドレスに置き換えます。
7. 以下のコマンドを実行して、ファイルに実行権限を付与します。
chmod 755 /var/www/python/showRedis.py
8. 次のコマンドを実行して Apache を再起動し、前述の設定を反映させます。
service apache2 restart
9. IP アドレスを ECS のパブリックネットワークアドレスに置き換えて、Web ブラウザーからアクセスします。Redis のデータは、次のステップ実行後にこの Web ページに表示されます。
10. 「データ同期のテスト」で MySQL へのデータの挿入、更新、削除の操作を繰り返し、ブラウザをリフレッシュして Redis のデータを確認します。

Alibaba Cloud のサポート専門家に連絡する

お問い合わせ
phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.