MaterializeMySQLを使用してApsaraDB RDS for MySQLからApsaraDB RDS for ClickHouseへデータ連携する方法
MaterializeMySQLを使用してApsaraDB RDS for MySQLからApsaraDB RDS for ClickHouseへデータ連携する方法
本記事では、ApsaraDB RDS for MySQLからMaterializeMySQLを使ってApsaraDB for ClickHouseへデータ連携する方法をご紹介します。MaterializeMySQLはClickHouseの機能です。
構成図は次の通りです。
ClickHouseとは
ClickHouseは非集計データを含む大量のデータを安定的かつ継続しながら集計といったリアルタイム分析を支える列指向の分散型データベースサービスです。 トラフィック分析、広告およびマーケティング分析、行動分析、リアルタイム監視などのビジネスシナリオで幅広く 使用されています。
少し前になりますが、LogServiceについての資料をSlideShareへアップロードしていますので、こちらも参考になればと思います。
ApsaraDB RDS for MySQL とは
Alibaba Cloudのフルマネージド型リレーショナルデータベースサービスです。
※ApsaraDBは、Alibaba Cloudがクラウドコンピューティングの上で稼働するデータベースとして名付けたもので、Apsaraはインド神話にある水の妖精で、「雲の海に生きるもの」を意味するものです。だからクラウドコンピューティングのデータベースとしてApsaraDB(アプサラス)ですね。
https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%82%B5%E3%83%A9%E3%82%B9
1. ClickHouseClientの準備
1-1.ClickHouseインスタンスを準備します
この手法は過去の記事でも記載していますが、再掲として記載します。
https://sbopsv.github.io/cloud-tech/usecase-ClickHouse/ACH_002_clickhouse-quick-start
1)まずはApsaraDB for ClickHouseインスタンスを作成します。
①VPCを作成
②ClickHouseインスタンスを作成
著者は以下のインスタンススペックでインスタンスを作成しています。
ClickHouse version:20.8.7.15 Edition:Single-replica Edition
2)ClickHouseの登録アカウントを作成
インスタンスをクリックし、左側にアカウント管理画面で、アカウントを作成します
3)ClickHouseクラスターにDMSで接続
①ClickHouseのインスタンスをクリックし、トップメニューの「Log On to Database」をクリックします
② DBアカウントとパスワードを入力し、ClickHouseへログイン
③DMS画面でClickHouseのインスタンスが表示されます
2. ApsaraDB RDS for MySQLおよびデータの準備
2-1.MySQLインスタンスを作成
1)MySQLインスタンスを作成します
①AlibabaCloudのサイトをログインし、コンソール画面に遷移します
②RDSをクリックし、RDSコンソール画面に遷移します
③インスタンス作成をクリックし、RDSを作成します。
注意として、MaterializeMySQLによるデータ連携の場合 GTID
機能を使う必要があり、ApsaraDB for RDS EnterpriseではGTIDがOFFであるため、BasicとHAのタイプを選択しなければならないです。
④VPCを設定します
⑤Mysqlインスタンス情報を確認します
④Mysqlインスタンスが作成されました
2)MySQLのデータベースを作成します
①データベース画面にデータベース作成ボタンをクリックします
②データベースを設定します
③データベースが作成されます
3)MySQLのアカウントを作成
①アカウント画面にアカウント作成ボタンをクリックします
②Privileged Accountアカウントを設定します
※通常のアカウント(Nomal Account)の場合は、MySQLライブラリのRELOAD、REPLICATION SLAVE、REPLICATION CLIENT、およびSELECTPRIVILEGE権限をアタッチする必要があります
③アカウントが作成されます
2-2.DMSでDBをログイン
1)DMSでDBをログイン
①データベースログインをクリックします
②データベースアカウントとパスワードを入力し、接続テストボタンをクリックします
③「OK」をクリックします
④「Login」をクリックします
⑤DMSでデータベース接続が成功したことを確認します
2-3.DMSでMySQLのテーブルデータの準備
1)下記shoppingテーブル作成
①userテーブルを作成します
create table user(user_id bigint not null auto_increment comment 'user_id ID',user_name varchar(30) comment 'user name',phone_num varchar(20) comment 'phonenum',email varchar(100) comment 'email',acct decimal(18,2) comment 'account',primary key (user_id),key I1 (user_name));
②inventoryテーブルを作成します
create table inventory(inventory_id bigint not null auto_increment comment 'inventory_id',inventory_name varchar(30) comment 'inventory name',price_unit decimal(18,2) comment 'price unit',inventory_num bigint not null default 0 comment 'inventory num',primary key(inventory_id));
③ordersテーブルを作成します
create table orders(order_id bigint not null auto_increment comment 'order id',user_id bigint not null comment 'user id',inventory_id bigint not null comment 'inventory id',price_unit decimal(18,2) comment 'price unit',order_num bigint not null default 0 comment 'order num',create_time datetime not null default current_timestamp,update_time datetime not null default current_timestamp on update current_timestamp,primary key(order_id),key I1(user_id),key I2(inventory_id));
③テーブルを確認します
2)モックアップデータを作成します
①userテーブルを選択し、右クリックメニューから「データプラン」 - 「テストデータ作成」をクリックします
②10万件テストデータを設定します
③作成タスクを確認します
④データを確認します
SELECT count(*) FROM `user` ;
SELECT * FROM `user`LIMIT 20;
⑤同じ方法でinventoryデータを作成します
SELECT count(*) FROM `inventory` ;
SELECT * FROM `inventory`LIMIT 20;
⑥同じ方法でordersデータを作成します
SELECT count(*) FROM `orders` ;
SELECT * FROM `orders`LIMIT 20;
3)ordersデータを更新
①下記コマンドでordersを更新します
update orders set update_time = create_time;
②update_timeが create_timeと同じであることを確認します
SELECT * FROM `orders`LIMIT 20;
3.MaterializeエンジンでMySQLデータをClickHouseに同期します
ここから本題です。
ApsaraDB for ClickHouseはデータベースエンジンを MaterializeMySQL
と設定することで、ApsaraRDS for MySQLのテーブルをApsaraDB for ClickHouseへリアルタイムでデータを同期することができます。
そのため、ApsaraDB for ClickHouseサービスはMySQLのコピーとして、Binlogを読み取り、DDLおよびDMLリクエストを実行することで、MySQL Binlogメカニズムに基づくデータベースのリアルタイム同期機能を実現することができます。
- 前提条件:
- データソースとなるApsaraRDS for MySQLクラスターと、ターゲットのApsaraDB for ClickHouseクラスターは同じVPCネットワークに配置している必要があります
- ClickHouseクラスターのアドレスを ApsaraRDS for MySQLのホワイトリストに追加する必要があります
- MaterializeMySQLテーブルエンジンのユーザーは、MySQLライブラリのRELOAD、REPLICATION SLAVE、REPLICATION CLIENT、およびSELECT PRIVILEGE権限を持っている必要があります
- MySQL側でGTIDが対応していること、およびON状態になっている必要があります
3-1.DMSでClickHouseデータを確認します
1)DMSでClickHouseデータベースを作成します
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password')SETTINGSinclude_tables ='a,b,c...';
パーシングルール:
- *:/含む空の文字列を除く任意の文字を置き換えます
- ?:任意の1文字を置き換えます
- {N..M} :NとMを含む、NからMの範囲の任意の数を置き換えます
①下記コマンドを実行し、MaterializeMySQLデータベースを作成します
※RDSのホワイトリストを設定し、Mysqlインスタンスにアクセス権限がある状態にします。
CREATE DATABASE mysql_clickhouse ENGINE = MaterializeMySQL('rm-0iw928qvgwn4c8ue8.mysql.japan.rds.aliyuncs.com:3306', 'sbdb', 'sbtest', 'Test1234')SETTINGSinclude_tables ='*';
- Internal Endpointを確認します
SHOW TABLES FROM mysql_clickhouse;
2)DMSでテーブルを検索します
SELECT * FROM mysql_clickhouse.user;
SELECT * FROM mysql_clickhouse.inventory;
SELECT * FROM mysql_clickhouse.orders;
3)Mysqlでuserテーブルにデータを挿入
①userテーブルにデータを挿入します
INSERT INTO sbdb.user VALUES (100001,'test','ts','des','46.88');
②Clickhouseからデータを同期します
SELECT * FROM mysql_clickhouse.user WHERE user_id = 100001;
4)Mysqlでuserテーブルにデータを削除します
DELETE FROM sbdb.user WHERE user_id = 100001;
②Clickhouseからデータを同期します
SELECT * FROM mysql_clickhouse.user WHERE user_id = 100001;
5)Mysqlでuserテーブルにデータを更新
①userテーブルにデータを更新します
UPDATE sbdb.user SET user_name='test' where user_id =100000;
②Clickhouseからデータ同期します
SELECT * FROM mysql_clickhouse.user WHERE user_id = 100000;
最後に
ここまで、ApsaraDB for ClickHouseはデータベースエンジンを MaterializeMySQL
と設定することで、ApsaraRDS for MySQLのテーブルをApsaraDB for ClickHouseへリアルタイムでデータを同期する方法を紹介しました。
ApsaraDB for ClickHouseはMySQLのテーブルとスムーズに連携できるので、例えば、RDS for MySQLでWebアプリケーション運用のち、MaterializeMySQLを使ってClickHouseへリアルタイム同期しながら、ClickHouseでリアルタイム可視化、といったソリューションとして仕上げることもできます。