すべてのプロダクト
Search
ドキュメントセンター

PolarDB:AutoETL マルチクラスターデータ集約

最終更新日:Jun 23, 2026

AutoETL は、複数の PolarDB for MySQL クラスターのビジネスデータを単一の PolarSearch ノードに集約することで、一元的な全文検索と分析が可能になります。本トピックでは、AutoETL を使用してマルチクラスターデータ集約パイプラインを作成する方法について説明します。

説明

本機能は現在カナリアリリース中です。この機能を利用するには、チケットを送信してください。

背景情報

実際のシナリオでは、ビジネスデータが複数の PolarDB for MySQL クラスターに分散している場合があります。これらのクラスター間で一元的な全文検索や分析を実行する必要がある場合、AutoETL マルチクラスターデータ集約機能を使用して、複数のソースクラスターから集約クラスター上の PolarSearch ノードにデータを同期できます。

データフローは次のとおりです:

  1. 各ソースクラスターで CREATE ETL GRANT ステートメントを実行し、集約クラスターにソースクラスター上のデータへのアクセス権限を付与します。

  2. 集約クラスターで、ETL ストアドプロシージャ (dbms_etl.sync_by_sql) を使用して集約パイプラインを作成します。各ソーステーブルの WITH 句で、polardb-mysql-instance パラメーターを使用してソース PolarDB for MySQL クラスターを指定します。

  3. パイプライン開始後、AutoETL パイプラインは各ソースクラスターが集約クラスターに ETL アクセスを許可していることを確認します。権限付与が確認された後、エンジンは各ソースクラスターからデータを読み取り、集約クラスター上の PolarSearch ノードに同期します。

image

制限

  • 集約に関わるすべての 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"

参考情報