當您需要將企業線上的RDS MySQL中的生產數據實時同步到阿里云Elasticsearch(ES)中進行搜索分析時,可通過數據傳輸服務DTS快速創建RDS MySQL到阿里云ES的實時同步作業,適用于對實時同步要求較高的同步場景。本文介紹如何配置RDS MySQL到阿里云ES實例的實時同步作業,并驗證全量和增量數據同步的結果。
背景信息
注意事項
DTS不支持同步DDL操作,如果源庫中待同步的表在同步的過程中已經執行了DDL操作,您需要先移除同步對象,然后在ES實例中移除該表對應的索引,最后新增同步對象。詳情請參見移除同步對象和新增同步對象。
如果源庫中待同步的表需要執行增加列的操作,您只需先在ES實例中修改對應表的mapping,然后在源庫中執行相應的DDL操作,最后暫停并啟動DTS增量數據同步任務。
DTS在執行全量數據初始化時將占用源庫和目標庫一定的讀寫資源,可能會導致數據庫的負載上升,在數據庫性能較差、規格較低或業務量較大的情況下(例如源庫有大量慢SQL、存在無主鍵表或目標庫存在死鎖等),可能會加重數據庫壓力,甚至導致數據庫服務不可用。因此您需要在執行數據同步前評估源庫和目標庫的性能,同時建議您在業務低峰期執行數據同步(例如源庫和目標庫的CPU負載在30%以下)。
在業務高峰期全量同步數據,可能造成全量數據同步失敗,重啟全量同步任務即可。
在業務高峰期增量同步數據,可能出現數據同步延遲的情況。
由于MySQL和ES實例支持的數據類型不同,數據類型無法一一對應。所以DTS在進行結構初始化時,會根據目標庫支持的數據類型進行類型映射,詳情請參見結構初始化涉及的數據類型映射關系。
操作流程
準備環境:先在源庫RDS MySQL中添加待同步數據,然后創建目標庫ES實例,并為ES實例開啟自動創建索引功能。
創建數據同步任務:在DTS控制臺配置并購買數據同步任務。
驗證數據同步結果:先在ES的Kibana控制臺驗證全量同步結果,然后在源庫RDS MySQL中添加數據,最后在ES的Kibana控制臺驗證增量同步結果。
操作步驟
步驟一:環境準備
文本以將RDS MySQL 8.0版本實例中的數據同步到阿里云ES 7.10版本實例中為例。
準備源庫待同步數據
創建RDS MySQL 8.0版本實例。具體操作,請參見創建RDS MySQL實例。
創建賬號和數據庫
test_mysql
。具體操作,請參見創建數據庫和賬號。在數據庫
test_mysql
中,新建表es_test
并插入數據。使用的建表語句及數據如下:-- create table CREATE TABLE `es_test` ( `id` bigint(32) NOT NULL, `name` varchar(32) NULL, `age` bigint(32) NULL, `hobby` varchar(32) NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; -- insert data INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (1,'user1',22,'music'); INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (2,'user2',23,'sport'); INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (3,'user3',43,'game'); INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (4,'user4',24,'run'); INSERT INTO `es_test` (`id`,`name`,`age`,`hobby`) VALUES (5,'user5',42,'basketball');
準備目標庫ES實例
創建阿里云ES 7.10版本實例。具體操作,請參見創建阿里云Elasticsearch實例。
ES實例開啟自動創建索引功能。具體操作,請參見配置YML參數。
步驟二:創建數據同步任務
單擊創建任務。
按照頁面提示配置數據同步任務。
說明以下步驟中涉及的參數的說明,請參見RDS MySQL同步至Elasticsearch。
配置源庫及目標庫,在頁面下方單擊測試連接以進行下一步。
配置任務對象。
配置高級設置,本文高級配置保持默認。
在庫表列配置頁面,單擊全部設置為非_routing策略,將全部表設置為非_routing策略。
說明目標庫ES實例為7.x版本時,全部表必須設置為非_routing策略。
配置完成后,根據頁面提示保存并預檢查任務、購買并啟動任務。
購買并啟動任務成功后,同步任務正式開始。您可在數據同步界面查看具體任務進度,待全量同步完成后,您即可在ES實例中查看同步成功的數據。
步驟三(可選):驗證數據同步結果
登錄目標ES實例的Kibana控制臺。
登錄Kibana控制臺,請參見登錄Kibana控制臺。
在Kibana頁面的左上角,選擇
(Dev Tools),在控制臺(Console)中執行以下命令。驗證全量數據同步結果。
執行如下命令,查看全量數據同步結果。
GET /es_test/_search
預期結果如下:
{ "took" : 10, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 5, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "es_test", "_type" : "es_test", "_id" : "3", "_score" : 1.0, "_source" : { "id" : 3, "name" : "user3", "age" : 43, "hobby" : "game" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "5", "_score" : 1.0, "_source" : { "id" : 5, "name" : "user5", "age" : 42, "hobby" : "basketball" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "4", "_score" : 1.0, "_source" : { "id" : 4, "name" : "user4", "age" : 24, "hobby" : "run" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "2", "_score" : 1.0, "_source" : { "id" : 2, "name" : "user2", "age" : 23, "hobby" : "sport" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "1", "_score" : 1.0, "_source" : { "id" : 1, "name" : "user1", "age" : 22, "hobby" : "music" } } ] } }
驗證增量數據同步結果。
通過以下SQL語句在RDS MySQL中插入一條數據。
INSERT INTO `test_mysql`.`es_test` (`id`,`name`,`age`,`hobby`) VALUES (6,'user6',30,'dance');
等待增量同步完成后,再次執行命令
GET /es_test/_search
,查看增量數據同步結果。預期結果如下:
{ "took" : 541, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 6, "relation" : "eq" }, "max_score" : 1.0, "hits" : [ { "_index" : "es_test", "_type" : "es_test", "_id" : "3", "_score" : 1.0, "_source" : { "id" : 3, "name" : "user3", "age" : 43, "hobby" : "game" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "5", "_score" : 1.0, "_source" : { "id" : 5, "name" : "user5", "age" : 42, "hobby" : "basketball" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "4", "_score" : 1.0, "_source" : { "id" : 4, "name" : "user4", "age" : 24, "hobby" : "run" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "2", "_score" : 1.0, "_source" : { "id" : 2, "name" : "user2", "age" : 23, "hobby" : "sport" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "6", "_score" : 1.0, "_source" : { "name" : "user6", "id" : 6, "age" : 30, "hobby" : "dance" } }, { "_index" : "es_test", "_type" : "es_test", "_id" : "1", "_score" : 1.0, "_source" : { "id" : 1, "name" : "user1", "age" : 22, "hobby" : "music" } } ] } }