如果您在使用PolarDB MySQL遇到查詢慢的問題時,可以通過數據傳輸服務DTS將企業線上的PolarDB MySQL中的生產數據實時同步到阿里云Elasticsearch(簡稱ES)中進行搜索分析。DTS同步適用于對實時同步要求較高的關系型數據庫中數據的同步場景。
背景信息
本文涉及以下三個云產品,相關介紹如下:
數據傳輸服務DTS(Data Transmission Service):一種集數據遷移、數據訂閱及數據實時同步于一體的數據傳輸服務。DTS支持同步的SQL操作包括:Insert、Delete、Update。 詳情請參見數據傳輸服務DTS、同步方案概覽。
PolarDB:阿里云自研的下一代關系型云數據庫,有三個獨立的引擎,分別可以100%兼容MySQL、100%兼容PostgreSQL、高度兼容Oracle語法。存儲容量最高可達100TB,單庫最多可擴展到16個節點,適用于企業多樣化的數據庫應用場景。詳情請參見PolarDB MySQL概述。
Elasticsearch:一個基于Lucene的實時分布式的搜索與分析引擎,它提供了一個分布式服務,可以使您快速的近乎于準實時的存儲、查詢和分析超大數據集,通常被用來作為構建復雜查詢特性和需求強大應用的基礎引擎或技術。詳情請參見什么是阿里云Elasticsearch。
注意事項
DTS不支持同步DDL操作,如果源庫中待同步的表在同步的過程中已經執行了DDL操作,您需要先移除同步對象,然后在ES實例中移除該表對應的索引,最后新增同步對象。詳情請參見移除同步對象和新增同步對象。
如果源庫中待同步的表需要執行增加列的操作,您只需先在ES實例中修改對應表的mapping,然后在源庫中執行相應的DDL操作,最后暫停并啟動DTS增量數據同步任務。
DTS在執行全量數據初始化時將占用源庫和目標庫一定的讀寫資源,可能會導致數據庫的負載上升,在數據庫性能較差、規格較低或業務量較大的情況下(例如源庫有大量慢SQL、存在無主鍵表或目標庫存在死鎖等),可能會加重數據庫壓力,甚至導致數據庫服務不可用。因此您需要在執行數據同步前評估源庫和目標庫的性能,同時建議您在業務低峰期執行數據同步(例如源庫和目標庫的CPU負載在30%以下)。
在業務高峰期全量同步數據,可能造成全量數據同步失敗,重啟全量同步任務即可。
在業務高峰期增量同步數據,可能出現數據同步延遲的情況。
操作步驟
完成數據同步主要包括兩個步驟:
準備環境:在源庫PolarDB MySQL中準備待同步數據,然后創建目標庫ES實例,并為ES實例開啟自動創建索引功能。
創建數據同步任務:在DTS控制臺創建源庫到目標庫的數據同步鏈路,購買并啟動同步鏈路任務后數據會自動進行全量和增量同步。
步驟一:環境準備
文本以將PolarDB MySQL 8.0.1企業版集群中的數據同步到阿里云ES 7.10版本實例中為例。
準備源庫待同步數據
創建PolarDB MySQL 8.0.1企業版集群。具體操作,請參見購買企業版集群。
為PolarDB MySQL集群開啟Binlog功能。具體操作,請參見開啟Binlog。
創建賬號和數據庫
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');
準備目標庫ES實例
創建阿里云ES 7.10版本實例。具體操作,請參見創建阿里云Elasticsearch實例。
ES實例開啟自動創建索引功能。具體操作,請參見配置YML參數。
步驟二:創建數據同步任務
單擊創建任務。
按照頁面提示配置數據同步任務。
以下步驟中涉及的參數的說明,請參見PolarDB MySQL為源的數據同步。
配置源庫及目標庫,在頁面下方單擊測試連接以進行下一步。
配置任務對象。
配置高級設置,本文高級配置保持默認。
在庫表列配置頁面,單擊全部設置為非_routing策略,將全部表設置為非_routing策略。
說明目標庫ES實例為7.x版本時,全部表必須設置為非_routing策略。
配置完成后,根據頁面提示保存并預檢查任務、購買并啟動任務。
購買并啟動任務成功后,同步任務正式開始。您可在數據同步界面查看具體任務進度,待全量同步完成后,您即可在ES實例中查看同步成功的數據。
步驟三(可選):驗證數據同步結果
登錄目標ES實例的Kibana控制臺。
登錄Kibana控制臺,請參見登錄Kibana控制臺。
在Kibana頁面的左上角,選擇
(Dev Tools),在控制臺(Console)中執行以下命令。驗證全量數據同步結果。
執行以下命令,查看全量數據同步結果。
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" } } ] } }
驗證增量數據同步結果。
通過以下SQL語句,在PolarDB MySQL集群中插入一條數據。
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" } } ] } }