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

Elasticsearch:DTS を使用した PolarDB for MySQL から Alibaba Cloud Elasticsearch へのデータ同期

最終更新日:Aug 21, 2026

PolarDB for MySQL のクエリが遅い場合、Data Transmission Service (DTS) を使用して、本番データをリアルタイムで Alibaba Cloud Elasticsearch クラスターに同期し、検索や分析に利用できます。このソリューションは、リレーショナルデータベースからの高性能なリアルタイムデータ同期が求められるシナリオに適しています。

背景情報

使用するクラウドサービスは次のとおりです。

  • Data Transmission Service (DTS):データ移行、データサブスクリプション、リアルタイムデータ同期を統合したデータストリーミングサービスです。DTS は、INSERT、DELETE、UPDATE 操作の同期をサポートしています。詳細については、Data Transmission Service (DTS) および「データ同期シナリオの概要」をご参照ください。

  • PolarDB は Alibaba Cloud が開発した次世代のリレーショナルデータベースサービスで、MySQL、PostgreSQL、Oracle と互換性があります。PolarDB クラスターは最大 100 TB のストレージをサポートし、16 ノードまで拡張できます。詳細については、「PolarDB for MySQL の概要」をご参照ください。

  • Elasticsearch は Lucene ベースの分散型リアルタイム検索・分析エンジンであり、大規模なデータセットをほぼリアルタイムで保存、クエリ、分析します。詳細については、「Alibaba Cloud Elasticsearch とは」をご参照ください。

注意事項

  • DTS は、DDL 操作によって生成されたデータ変更を同期しません。データ同期中にソースデータベースのテーブルに対して DDL 操作が実行された場合、次の操作を実行する必要があります:データ同期タスクからテーブルを削除し、Elasticsearch クラスターからテーブルに対応するインデックスを削除してから、再度テーブルをデータ同期タスクに追加します。詳細については、「データ同期タスクからオブジェクトを削除」および「データ同期タスクにオブジェクトを追加」をご参照ください。

  • ソーステーブルに列を追加する場合は、テーブルに対応するインデックスのマッピングを変更してください。その後、ソーステーブルに対して関連する DDL 操作を実行し、データ同期タスクを一時停止してから再度開始してください。

  • フルデータ同期は、ソースデータベースと宛先データベースの両方で読み書きリソースを消費するため、データベース負荷が増加する可能性があります。データベースのパフォーマンスが低い、仕様が低い、またはワークロードが重い (例えば、SQL クエリが遅い、主キーのないテーブル、宛先でのデッドロックなど) 場合、負荷の増加によってサービス利用不可となる可能性があります。事前にデータベースのパフォーマンスを評価し、両方のデータベースの CPU 使用率が 30% 未満のオフピーク時にデータ同期を実行してください。

    • ピーク時にフルデータ同期タスクが失敗した場合は、再起動できます。

    • ピーク時に増分データ同期を実行すると、データ同期のレイテンシが発生する可能性があります。

操作手順

データを同期するには、次の手順を実行します。

  1. 準備:同期するデータをソースの PolarDB for MySQL データベースに追加し、Alibaba Cloud Elasticsearch クラスターを作成し、Elasticsearch クラスターの自動インデックス作成機能を有効にします。

  2. データ同期タスクの作成と実行:DTS コンソールでデータ同期タスクを作成して実行します。その後、フルデータと増分データが自動的に同期されます。

ステップ 1: 準備

この例では、PolarDB for MySQL 8.0.1 Enterprise Edition クラスターと Alibaba Cloud Elasticsearch V7.10 クラスターが準備されています。

ソースデータベースと同期対象データの準備

  1. PolarDB for MySQL 8.0.1 Enterprise Edition クラスターを作成します。詳細については、「Enterprise Edition クラスターの購入」をご参照ください。

  2. PolarDB for MySQL クラスターでバイナリロギング機能が有効になっています。詳細については、「バイナリロギングの有効化」をご参照ください。

    左側のナビゲーションウィンドウで [設定と管理] > [Binlog 管理] を選択し、[Binlog 管理] ページで [今すぐ有効化] をクリックします。

  3. アカウントと test_polardb という名前のデータベースを作成します。詳細については、「データベースアカウントの作成と管理」および「データベースの管理」をご参照ください。

  4. test_polardb データベースに、product という名前のテーブルを作成し、データを挿入します。

    • テーブルの作成

      CREATE TABLE `product` (
          `id` bigint(32) NOT NULL AUTO_INCREMENT,
          `name` varchar(32) NULL,
          `price` varchar(32) NULL,
          `code` varchar(32) NULL,
          `color` varchar(32) NULL,
          PRIMARY KEY (`id`)
      ) ENGINE=InnoDB
      DEFAULT CHARACTER SET=utf8;
    • テーブルへのテストデータの挿入

      INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (1,'mobile phone A','2000','amp','golden');
      INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (2,'mobile phone B','2200','bmp','white');
      INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (3,'mobile phone C','2600','cmp','black');
      INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (4,'mobile phone D','2700','dmp','red');
      INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (5,'mobile phone E','2800','emp','silvery');

宛先 Elasticsearch クラスターの準備

  1. Alibaba Cloud Elasticsearch V7.10 クラスターを作成します。詳細については、「Alibaba Cloud Elasticsearch クラスターの作成」をご参照ください。

  2. Elasticsearch クラスターの自動インデックス作成機能を有効にします。詳細については、「YML ファイルの設定」をご参照ください。

    インスタンスの [設定と管理] > [クラスター設定] ページで、[YML ファイル設定] セクションにある [自動インデックス作成] 設定項目を見つけ、右側の [設定の変更] をクリックして有効にします。

ステップ 2: データ同期タスクの作成と実行

  1. DTS の データ同期タスクリストページ (新バージョン) にログインします。

  2. タスクの作成 をクリックします。

  3. 表示されたページで、画面の指示に従ってデータ同期タスクを作成および設定します。

    以降の手順で設定する各パラメーターの詳細については、「PolarDB for MySQL クラスターからのデータ同期」をご参照ください。

    1. ソースデータベースと宛先データベースを設定し、次に接続をテストして続行をクリックします。

      ソースデータベース情報:

      • [データベースタイプ] を [PolarDB for MySQL] に設定します

      • [アクセス方法] を [クラウドインスタンス] に、[インスタンスリージョン] を [中国 (杭州)] に設定します

      • [クロスアカウント] を [いいえ] に設定します

      • [PolarDB インスタンス ID] を選択し、[データベースアカウント] と [データベースパスワード] を入力します

      • [接続タイプ] を [非暗号化接続] に設定します

      宛先データベース情報:

      • [データベースタイプ] を [Elasticsearch] に設定します

      • [アクセス方法] を [クラウドインスタンス] に、[インスタンスリージョン] を [中国 (杭州)] に設定します

      • [タイプ] を [クラスター] に設定します

      • [インスタンス ID] を選択し、[データベースアカウント] を [elastic] に設定し、[データベースパスワード] を入力します

    2. 同期対象のオブジェクトを設定します。

      • [同期タイプ]:[スキーマ同期]、[全量データ同期]、[増分データ同期] を選択します

      • [インデックス名]: [TableName] を選択します

      • [競合テーブルの処理モード]: [事前チェックとエラー報告] を選択します

      • [移行先データベースのオブジェクト名の大文字と小文字の区別ポリシー]:[DTS デフォルトポリシー] を選択します

      • [ソースオブジェクト] セクションで、test_polardb データベースの [product] テーブルを [選択されたオブジェクト] セクションに移動します

    3. 詳細設定を構成します。この例では、デフォルトの詳細設定が使用されます。

    4. [データベース/テーブル/列の設定] ページで、[すべてを非ルーティングポリシーに設定] をクリックします。

      宛先の Elasticsearch クラスターが 7.x バージョンを実行している場合は、すべてのテーブルのルーティングポリシーを非ルーティングに設定する必要があります。

  4. 設定が完了したら、データ同期タスクを保存し、タスクの事前チェックを実行し、DTS インスタンスを購入してデータ同期タスクを開始します。

    DTS インスタンスを購入すると、データ同期タスクが自動的に開始されます。進行状況は、[データ同期] ページで確認できます。フルデータ同期が完了すると、同期されたデータを Elasticsearch クラスターでクエリできます。

    [実行フェーズ情報] 列で、[スキーマ同期]、[完全データ同期]、および [増分データ同期] の 3 つのフェーズを含む同期の進捗を確認できます。各フェーズが完了すると、緑色のチェックマークが表示されます。

ステップ 3 (オプション): データ同期結果の検証

  1. Elasticsearch クラスターの Kibana コンソールにログインします。

    詳細については、「Kibana コンソールへのログイン」をご参照ください。

  2. Kibana ページで、菜单.png > [管理] > [開発ツール]に移動し、[コンソール]で次のコマンドを実行します。

  3. フルデータ同期の結果を検証します。

    次のコマンドを実行します。

    GET /product/_search

    コマンドが正常に実行されると、次の結果が返されます。

    {
      "took" : 3,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 5,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "product",
            "_type" : "product",
            "_id" : "3",
            "_score" : 1.0,
            "_source" : {
              "id" : 3,
              "name" : "mobile phone C",
              "price" : "2600",
              "code" : "cmp",
              "color" : "black"
            }
          },
          {
            "_index" : "product",
            "_type" : "product",
            "_id" : "5",
            "_score" : 1.0,
            "_source" : {
              "id" : 5,
              "name" : "mobile phone E",
              "price" : "2800",
              "code" : "emp",
              "color" : "silvery"
            }
          },
          {
            "_index" : "product",
            "_type" : "product",
            "_id" : "4",
            "_score" : 1.0,
            "_source" : {
              "id" : 4,
              "name" : "mobile phone D",
              "price" : "2700",
              "code" : "dmp",
              "color" : "red"
            }
          },
          {
            "_index" : "product",
            "_type" : "product",
            "_id" : "2",
            "_score" : 1.0,
            "_source" : {
              "id" : 2,
              "name" : "mobile phone B",
              "price" : "2200",
              "code" : "bmp",
              "color" : "white"
            }
          },
          {
            "_index" : "product",
            "_type" : "product",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "id" : 1,
              "name" : "mobile phone A",
              "price" : "2000",
              "code" : "amp",
              "color" : "golden"
            }
          }
        ]
      }
    }
  4. 増分データ同期の結果を検証します。

    1. 次のステートメントを実行して、ソーステーブルにデータレコードを挿入します。

      INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (6,'mobile phone F','2750','fmp','white');
    2. 増分データ同期が完了したら、再度 GET /product/_search コマンドを実行して結果を確認します。

      コマンドが正常に実行されると、次の結果が返されます。

      {
        "took" : 439,
        "timed_out" : false,
        "_shards" : {
          "total" : 5,
          "successful" : 5,
          "skipped" : 0,
          "failed" : 0
        },
        "hits" : {
          "total" : {
            "value" : 6,
            "relation" : "eq"
          },
          "max_score" : 1.0,
          "hits" : [
            {
              "_index" : "product",
              "_type" : "product",
              "_id" : "3",
              "_score" : 1.0,
              "_source" : {
                "id" : 3,
                "name" : "mobile phone C",
                "price" : "2600",
                "code" : "cmp",
                "color" : "black"
              }
            },
            {
              "_index" : "product",
              "_type" : "product",
              "_id" : "5",
              "_score" : 1.0,
              "_source" : {
                "id" : 5,
                "name" : "mobile phone E",
                "price" : "2800",
                "code" : "emp",
                "color" : "silvery"
              }
            },
            {
              "_index" : "product",
              "_type" : "product",
              "_id" : "4",
              "_score" : 1.0,
              "_source" : {
                "id" : 4,
                "name" : "mobile phone D",
                "price" : "2700",
                "code" : "dmp",
                "color" : "red"
              }
            },
            {
              "_index" : "product",
              "_type" : "product",
              "_id" : "2",
              "_score" : 1.0,
              "_source" : {
                "id" : 2,
                "name" : "mobile phone B",
                "price" : "2200",
                "code" : "bmp",
                "color" : "white"
              }
            },
            {
              "_index" : "product",
              "_type" : "product",
              "_id" : "6",
              "_score" : 1.0,
              "_source" : {
                "code" : "fmp",
                "color" : "white",
                "price" : "2750",
                "name" : "mobile phone F",
                "id" : 6
              }
            },
            {
              "_index" : "product",
              "_type" : "product",
              "_id" : "1",
              "_score" : 1.0,
              "_source" : {
                "id" : 1,
                "name" : "mobile phone A",
                "price" : "2000",
                "code" : "amp",
                "color" : "golden"
              }
            }
          ]
        }
      }