AutoETL は、複数の PolarDB for MySQL クラスターのビジネスデータを単一の PolarSearch ノードに集約することで、一元的な全文検索と分析が可能になります。本トピックでは、AutoETL を使用してマルチクラスターデータ集約パイプラインを作成する方法について説明します。
本機能は現在カナリアリリース中です。この機能を利用するには、チケットを送信してください。
背景情報
実際のシナリオでは、ビジネスデータが複数の PolarDB for MySQL クラスターに分散している場合があります。これらのクラスター間で一元的な全文検索や分析を実行する必要がある場合、AutoETL マルチクラスターデータ集約機能を使用して、複数のソースクラスターから集約クラスター上の PolarSearch ノードにデータを同期できます。
データフローは次のとおりです:
各ソースクラスターで
CREATE ETL GRANTステートメントを実行し、集約クラスターにソースクラスター上のデータへのアクセス権限を付与します。集約クラスターで、ETL ストアドプロシージャ (
dbms_etl.sync_by_sql) を使用して集約パイプラインを作成します。各ソーステーブルのWITH句で、polardb-mysql-instanceパラメーターを使用してソース PolarDB for MySQL クラスターを指定します。パイプライン開始後、AutoETL パイプラインは各ソースクラスターが集約クラスターに ETL アクセスを許可していることを確認します。権限付与が確認された後、エンジンは各ソースクラスターからデータを読み取り、集約クラスター上の PolarSearch ノードに同期します。
制限
集約に関わるすべての PolarDB for MySQL クラスターは、同一の Alibaba Cloud アカウント (UID) に属している必要があります。
マルチクラスター集約パイプラインは、ETL ストアドプロシージャ (
dbms_etl.sync_by_sql) を使用してのみ作成できます。検索ビューはサポートされていません。ETL 権限を取り消しても、既に実行中の同期パイプラインには影響しません。
ステップ 1:ETL 権限の作成
集約クラスターがソースクラスターからデータを同期できるようにするには、各ソースクラスターで ETL 権限を作成し、AutoETL アクセスを許可する必要があります。
ETL 権限の作成
ソースクラスターで次の SQL ステートメントを実行します。<allow_instance_id> を集約クラスターのクラスター ID に置き換えてください。
CREATE ETL GRANT `<allow_instance_id>`;ETL 権限の取り消し
DROP ETL GRANT `<allow_instance_id>`;ETL 権限の表示
SHOW ETL GRANTS;ステップ 2:集約パイプラインの作成
ETL ストアドプロシージャ (dbms_etl.sync_by_sql) を使用してマルチクラスター集約パイプラインを作成できます。各ソーステーブルの WITH 句で、polardb-mysql-instance パラメーターを使用してソースクラスター ID を指定します。
データの準備
2 つの PolarDB for MySQL クラスター (クラスター A とクラスター B) があり、両クラスターのデータを結合して、集約クラスターであるクラスター B の PolarSearch ノードに集約する場合を想定します。
クラスター A でテストデータを作成し、クラスター B に ETL アクセス権限を付与します。
-- クラスター A で実行 CREATE DATABASE IF NOT EXISTS db1; USE db1; CREATE TABLE IF NOT EXISTS t1 ( id INT PRIMARY KEY, c1 VARCHAR(100), c2 VARCHAR(100) ); INSERT INTO t1(id, c1, c2) VALUES (1, '1', '1'), (2, '1', '1'), (3, '1', '1'); -- クラスター B に ETL アクセスを許可 -- pc-xxx をクラスター B の実際のクラスター ID に置き換えてください CREATE ETL GRANT `pc-xxx`;クラスター B でテストデータを作成します。
-- クラスター B で実行 CREATE DATABASE IF NOT EXISTS db2; USE db2; CREATE TABLE IF NOT EXISTS t2 ( id INT PRIMARY KEY, c1 VARCHAR(100), c2 VARCHAR(100) ); INSERT INTO t2(id, c1, c2) VALUES (1, '2', '2'), (2, '2', '2'), (3, '2', '2');
集約パイプラインの作成
クラスター B で次の SQL ステートメントを実行し、両方のクラスターからクラスター B 上の PolarSearch ノードにデータを同期する集約パイプラインを作成します。
接続アドレス、ポート、認証情報など、ソーステーブルと宛先テーブルの接続情報は、システムによって自動的に設定されます。polardb-mysql-instance パラメーターを使用してソースクラスター ID を指定するだけで済みます。
-- クラスター B で実行
CALL dbms_etl.sync_by_sql("search", "
-- ステップ 1:クラスター A のソーステーブルを定義
CREATE TEMPORARY TABLE `db1`.`t1` (
`id` BIGINT,
`c1` STRING,
`c2` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql',
'database-name' = 'db1',
'table-name' = 't1',
'polardb-mysql-instance' = 'pc-xxx' -- クラスター A の実際のクラスター ID に置き換えてください
);
-- ステップ 2:クラスター B のソーステーブルを定義
CREATE TEMPORARY TABLE `db2`.`t2` (
`id` BIGINT,
`c1` STRING,
`c2` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql',
'database-name' = 'db2',
'table-name' = 't2',
'polardb-mysql-instance' = 'pc-xxx' -- クラスター B の実際のクラスター ID に置き換えてください
);
-- ステップ 3:PolarSearch 宛先テーブルを定義
CREATE TEMPORARY TABLE `dest` (
`id` BIGINT,
`p1_c1` STRING,
`p2_c1` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'opensearch',
'index' = 'dest'
);
-- ステップ 4:計算と挿入ロジックを定義
INSERT INTO `dest`
SELECT
`t1`.`id`,
`t1`.`c1`,
`t2`.`c1`
FROM `db1`.`t1` AS `t1`
LEFT JOIN `db2`.`t2` AS `t2`
ON `t1`.`id` = `t2`.`id`;
");ステップ 3:データの検証
集約クラスター上の PolarSearch ノードに接続し、次の Elasticsearch 互換の REST API クエリを実行して、データが同期されたことを確認します。
# <user>:<password> を PolarSearch ノードの認証情報に置き換えてください
# <polarsearch_endpoint> を PolarSearch ノードのエンドポイントとポートに置き換えてください
curl -u <user>:<password> -X GET "http://<polarsearch_endpoint>/dest/_search"