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 は、ストレージとコンピューティングにおいて優れたパフォーマンスを提供し、企業の多様な要件を満たします。詳細については、「PolarDB for MySQL の概要」をご参照ください。
Elasticsearch:Lucene ベースの分散型リアルタイム検索・分析エンジンです。大量のデータセットをほぼリアルタイムで保存、クエリ、分析できます。ほとんどの場合、複雑なクエリと高いアプリケーションパフォーマンスに対応するための基本エンジンまたはテクノロジーとして使用されます。詳細については、「Alibaba Cloud Elasticsearch とは」をご参照ください。
注意事項
DTS は、DDL 操作によって生成されたデータの変更を同期しません。データ同期中にソースデータベースのテーブルに対して DDL 操作が実行された場合は、次の操作が必要です:データ同期タスクからテーブルを削除し、Elasticsearch クラスターからテーブルのインデックスを削除してから、再度データ同期タスクにテーブルを追加します。詳細については、「データ同期タスクからのオブジェクトの削除」および「データ同期タスクへのオブジェクトの追加」をご参照ください。
ソーステーブルに列を追加する場合は、テーブルに対応するインデックスのマッピングを変更します。次に、ソーステーブルで関連する DDL 操作を実行し、データ同期タスクを一時停止してから、再度タスクを開始します。
DTS がフルデータ同期を実行すると、ソースデータベースと宛先データベースの両方で読み取りおよび書き込みリソースが消費され、データベースの負荷が増加する可能性があります。データベースのパフォーマンスが低い、仕様が低い、またはワークロードが重い (たとえば、ソースデータベースに多数のスロークエリやプライマリキーのないテーブルがある、または宛先データベースでデッドロックが発生するなど) 場合、データベースの負荷が増加し、サービスが利用できなくなる可能性があります。データを同期する前に、ソースデータベースと宛先データベースのパフォーマンスを評価してください。両方のデータベースの CPU 使用率が 30% 未満であるオフピーク時にデータ同期を実行してください。
ピーク時にフルデータ同期タスクが失敗した場合は、再起動できます。
ピーク時に増分データ同期を実行すると、データ同期の遅延が発生する可能性があります。
手順
データを同期するには、次の手順を実行します:
準備:同期するデータをソースの PolarDB for MySQL データベースに追加し、Alibaba Cloud Elasticsearch クラスターを作成し、Elasticsearch クラスターの自動インデックス作成機能を有効にします。
データ同期タスクの作成と実行:DTS コンソールでデータ同期タスクを作成して実行します。その後、フルデータと増分データが自動的に同期されます。
ステップ 1:準備
この例では、PolarDB for MySQL 8.0.1 の Enterprise Edition クラスターと Alibaba Cloud Elasticsearch V7.10 クラスターを準備します。
ソースデータベースと同期対象データの準備
PolarDB for MySQL 8.0.1 の Enterprise Edition クラスターを作成します。詳細については、「Enterprise Edition クラスターの購入」をご参照ください。
PolarDB for MySQL クラスターでバイナリロギング機能を有効にします。詳細については、「バイナリロギングの有効化」をご参照ください。

アカウントと
test_polardbという名前のデータベースを作成します。詳細については、「データベースアカウントの作成と管理」および「データベースの管理」をご参照ください。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 クラスターの準備
Alibaba Cloud Elasticsearch V7.10 クラスターを作成します。詳細については、「Alibaba Cloud Elasticsearch クラスターの作成」をご参照ください。
Elasticsearch クラスターの自動インデックス作成機能を有効にします。詳細については、「YML ファイルの設定」をご参照ください。

ステップ 2:データ同期タスクの作成と実行
DTS データ同期タスクリストページ (新バージョン) にログインします。
タスクの作成 をクリックします。
表示されたページで、プロンプトに従ってデータ同期タスクを作成して設定します。
次の手順の関連パラメーターについては、「PolarDB for MySQL クラスターからのデータ同期」をご参照ください。
ソースデータベースと宛先データベースを設定し、接続をテストして続行 をクリックします。

データを同期するオブジェクトを設定します。

詳細設定を行います。この例では、デフォルトの詳細設定を使用します。
[データベース/テーブル/列の設定] ページで、[すべてを非ルーティングポリシーに設定] をクリックします。
宛先の Elasticsearch クラスターが 7.x バージョンである場合、すべてのテーブルのルーティングポリシーを非ルーティングに設定する必要があります。
設定が完了したら、データ同期タスクを保存し、タスクの事前チェックを実行し、DTS インスタンスを購入してデータ同期タスクを開始します。
DTS インスタンスの購入後、データ同期タスクは自動的に開始されます。[データ同期] ページでタスクの進捗状況を確認できます。フルデータの同期が完了したら、Elasticsearch クラスターでデータを確認できます。

ステップ 3 (オプション):データ同期結果の検証
Elasticsearch クラスターの Kibana コンソールにログインします。
詳細については、「Kibana コンソールへのログイン」をご参照ください。
Kibana ページで、 に移動します。 [コンソール] で、次のコマンドを実行します。
フルデータの同期結果の検証
次のコマンドを実行します:
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" } } ] } }増分データの同期結果の検証
次のステートメントを実行して、ソーステーブルにデータレコードを挿入します:
INSERT INTO `test_polardb`.`product` (`id`,`name`,`price`,`code`,`color`) VALUES (6,'mobile phone F','2750','fmp','white');増分データ同期が完了したら、
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" } } ] } }
> [管理] > [開発ツール]