通過DTS將MySQL數(shù)據(jù)實(shí)時(shí)同步到阿里云Elasticsearch
本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。
當(dāng)您需要將企業(yè)線上的RDS MySQL中的生產(chǎn)數(shù)據(jù)實(shí)時(shí)同步到阿里云Elasticsearch中進(jìn)行搜索分析時(shí),可通過數(shù)據(jù)傳輸服務(wù)DTS(Data Transmission Service),快速創(chuàng)建RDS MySQL到阿里云Elasticsearch的實(shí)時(shí)同步作業(yè)。本文介紹如何配置RDS MySQL到阿里云Elasticsearch的實(shí)時(shí)同步作業(yè),并驗(yàn)證全量和增量數(shù)據(jù)的同步結(jié)果。
背景信息
數(shù)據(jù)傳輸服務(wù)DTS是一種集數(shù)據(jù)遷移、數(shù)據(jù)訂閱及數(shù)據(jù)實(shí)時(shí)同步于一體的數(shù)據(jù)傳輸服務(wù),詳細(xì)信息請(qǐng)參見數(shù)據(jù)傳輸服務(wù)DTS。DTS支持同步的SQL操作包括Insert、Delete和Update,支持同步的數(shù)據(jù)源版本要求請(qǐng)參見同步方案概覽。
通過在DTS中配置從源(MySQL)同步到目標(biāo)(Elasticsearch),可實(shí)現(xiàn)全量、增量數(shù)據(jù)同步。適用于對(duì)實(shí)時(shí)同步要求較高的關(guān)系型數(shù)據(jù)庫(kù)中數(shù)據(jù)的同步場(chǎng)景或需要將關(guān)系型數(shù)據(jù)庫(kù)中的全量或增量數(shù)據(jù)同步到阿里云Elasticsearch場(chǎng)景。
前提條件
已創(chuàng)建RDS MySQL實(shí)例、阿里云Elasticsearch實(shí)例。建議您在同一專有網(wǎng)絡(luò)下創(chuàng)建相關(guān)實(shí)例。
創(chuàng)建RDS MySQL實(shí)例。具體操作請(qǐng)參見創(chuàng)建RDS MySQL實(shí)例。本文以MySQL 5.7版本為例。
創(chuàng)建阿里云Elasticsearch實(shí)例。具體操作請(qǐng)參見創(chuàng)建阿里云Elasticsearch實(shí)例。本文創(chuàng)建的實(shí)例的版本為通用商業(yè)版6.7。
使用限制
通過DTS將數(shù)據(jù)同步至阿里云Elasticsearch,不支持7.16和8.x版本的Elasticsearch實(shí)例。
DTS不支持同步DDL操作,如果源庫(kù)中待同步的表在同步的過程中已經(jīng)執(zhí)行了DDL操作,您需要先移除同步對(duì)象,然后在Elasticsearch實(shí)例中移除該表對(duì)應(yīng)的索引,最后新增同步對(duì)象。詳情請(qǐng)參見移除同步對(duì)象和新增同步對(duì)象。
注意事項(xiàng)
DTS在執(zhí)行全量數(shù)據(jù)初始化時(shí)將占用源庫(kù)和目標(biāo)庫(kù)一定的讀寫資源,可能會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的負(fù)載上升,在數(shù)據(jù)庫(kù)性能較差、規(guī)格較低或業(yè)務(wù)量較大的情況下(例如源庫(kù)有大量慢SQL、存在無主鍵表或目標(biāo)庫(kù)存在死鎖等),可能會(huì)加重?cái)?shù)據(jù)庫(kù)壓力,甚至導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)不可用。因此您需要在執(zhí)行數(shù)據(jù)同步前評(píng)估源庫(kù)和目標(biāo)庫(kù)的性能,同時(shí)建議您在業(yè)務(wù)低峰期執(zhí)行數(shù)據(jù)同步(例如源庫(kù)和目標(biāo)庫(kù)的CPU負(fù)載在30%以下)。
如果源庫(kù)中待同步的表需要執(zhí)行增加列的操作,您只需先在Elasticsearch實(shí)例中修改對(duì)應(yīng)表的mapping,然后在源庫(kù)中執(zhí)行相應(yīng)的DDL操作,最后暫停并啟動(dòng)DTS同步實(shí)例即可。
操作步驟
步驟一:環(huán)境準(zhǔn)備
在阿里云Elasticsearch實(shí)例中開啟自動(dòng)創(chuàng)建索引功能。
具體操作步驟請(qǐng)參見配置YML參數(shù)。本文使用6.7版本的實(shí)例。
說明阿里云Elasticsearch為了保證用戶操作數(shù)據(jù)的安全性,默認(rèn)把自動(dòng)創(chuàng)建索引的配置設(shè)置為不允許。通過DTS同步數(shù)據(jù),使用的是提交數(shù)據(jù)的方式創(chuàng)建索引,而不是Create index API方式。所以在同步數(shù)據(jù)前,需要先開啟集群的自動(dòng)創(chuàng)建索引功能。
創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)和表,并插入數(shù)據(jù)。
您可以選擇使用阿里云的RDS數(shù)據(jù)庫(kù),也可以在本地服務(wù)器上的自建數(shù)據(jù)庫(kù)。本文以RDS MySQL數(shù)據(jù)庫(kù)為例,創(chuàng)建RDS MySQL數(shù)據(jù)庫(kù)及表的詳細(xì)步驟請(qǐng)參見快速入門。
重要建議您創(chuàng)建與阿里云Elasticsearch實(shí)例同一地域下的RDS MySQL實(shí)例,不同地域的同步任務(wù)不能確保互通。
本文創(chuàng)建的數(shù)據(jù)庫(kù)、使用的建表語句及數(shù)據(jù)如下。
在RDS MySQL中創(chuàng)建數(shù)據(jù)庫(kù)(Database)
test_logstash
建表語句
-- 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');
步驟二:配置數(shù)據(jù)同步鏈路
進(jìn)入同步任務(wù)的列表頁(yè)面。
在頂部菜單欄中,單擊集成與開發(fā)(DTS)。
在左側(cè)導(dǎo)航欄,選擇 。
說明實(shí)際操作可能會(huì)因DMS的模式和布局不同,而有所差異。更多信息,請(qǐng)參見極簡(jiǎn)模式和自定義DMS界面布局與樣式。
您也可以登錄新版DTS同步任務(wù)的列表頁(yè)面。
單擊創(chuàng)建任務(wù),按照頁(yè)面提示創(chuàng)建并配置數(shù)據(jù)同步任務(wù)。
您需要依次完成源庫(kù)及目標(biāo)庫(kù)配置、任務(wù)對(duì)象配置、映射字段配置、高級(jí)配置和庫(kù)表字段配置,本文使用的配置及相關(guān)說明如下,更多詳細(xì)信息請(qǐng)參見MySQL為源的數(shù)據(jù)同步和PolarDB-X同步至Elasticsearch。
配置源庫(kù)及目標(biāo)庫(kù)。
類別
配置
說明
無
任務(wù)名稱
DTS為每個(gè)任務(wù)自動(dòng)生成一個(gè)同步作業(yè)名稱,該名稱沒有唯一性要求。
建議配置具有業(yè)務(wù)意義的名稱,便于后續(xù)的識(shí)別。
源庫(kù)信息
數(shù)據(jù)庫(kù)類型
選擇MySQL。
接入方式
選擇云實(shí)例。
實(shí)例地區(qū)
選擇源MySQL數(shù)據(jù)庫(kù)所屬地域。
是否跨阿里云賬號(hào)
本場(chǎng)景為同一阿里云賬號(hào)間同步數(shù)據(jù),選擇不跨賬號(hào)。
實(shí)例ID
選擇源RDS MySQL實(shí)例ID。
數(shù)據(jù)庫(kù)賬號(hào)
填入源RDS MySQL實(shí)例的數(shù)據(jù)庫(kù)賬號(hào),需具備待同步對(duì)象的讀權(quán)限。
數(shù)據(jù)庫(kù)密碼
填入數(shù)據(jù)庫(kù)賬號(hào)對(duì)應(yīng)的密碼。
連接方式
根據(jù)需求選擇非加密連接或SSL安全連接。如果設(shè)置為SSL安全連接,您需要提前開啟RDS MySQL實(shí)例的SSL加密功能,詳情請(qǐng)參見設(shè)置SSL加密。
目標(biāo)庫(kù)信息
數(shù)據(jù)庫(kù)類型
選擇ElasticSearch。
接入方式
固定為云實(shí)例。
實(shí)例地區(qū)
選擇目標(biāo)Elasticsearch實(shí)例所屬地域,建議與源MySQL數(shù)據(jù)庫(kù)保持一致。
實(shí)例ID
選擇目標(biāo)Elasticsearch實(shí)例ID。
數(shù)據(jù)庫(kù)賬號(hào)
填入連接Elasticsearch實(shí)例的賬號(hào),默認(rèn)賬號(hào)為elastic。
數(shù)據(jù)庫(kù)密碼
填入數(shù)據(jù)庫(kù)賬號(hào)對(duì)應(yīng)的密碼。
配置任務(wù)對(duì)象。
配置
說明
同步類型
固定選中增量同步。默認(rèn)情況下,您還需要同時(shí)選中庫(kù)表結(jié)構(gòu)同步和全量同步。預(yù)檢查完成后,DTS會(huì)將源實(shí)例中待同步對(duì)象的全量數(shù)據(jù)在目標(biāo)集群中初始化,作為后續(xù)增量同步數(shù)據(jù)的基線數(shù)據(jù)。
目標(biāo)已存在表的處理模式
預(yù)檢查并報(bào)錯(cuò)攔截:檢查目標(biāo)數(shù)據(jù)庫(kù)中是否有同名的表。如果目標(biāo)數(shù)據(jù)庫(kù)中沒有同名的表,則通過該檢查項(xiàng)目;如果目標(biāo)數(shù)據(jù)庫(kù)中有同名的表,則在預(yù)檢查階段提示錯(cuò)誤,數(shù)據(jù)同步任務(wù)不會(huì)被啟動(dòng)。
說明如果目標(biāo)庫(kù)中同名的表不方便刪除或重命名,您可以更改該表在目標(biāo)庫(kù)中的名稱,請(qǐng)參見庫(kù)表列名映射。
忽略報(bào)錯(cuò)并繼續(xù)執(zhí)行:跳過目標(biāo)數(shù)據(jù)庫(kù)中是否有同名表的檢查項(xiàng)。
警告選擇為忽略報(bào)錯(cuò)并繼續(xù)執(zhí)行,可能導(dǎo)致數(shù)據(jù)不一致,給業(yè)務(wù)帶來風(fēng)險(xiǎn),例如:
表結(jié)構(gòu)一致的情況下,如在目標(biāo)庫(kù)遇到與源庫(kù)主鍵或唯一鍵的值相同的記錄:
全量期間,DTS會(huì)保留目標(biāo)集群中的該條記錄,即源庫(kù)中的該條記錄不會(huì)同步至目標(biāo)數(shù)據(jù)庫(kù)中。
增量期間,DTS不會(huì)保留目標(biāo)集群中的該條記錄,即源庫(kù)中的該條記錄會(huì)覆蓋至目標(biāo)數(shù)據(jù)庫(kù)中。
表結(jié)構(gòu)不一致的情況下,可能會(huì)導(dǎo)致無法初始化數(shù)據(jù)、只能同步部分列的數(shù)據(jù)或同步失敗,請(qǐng)謹(jǐn)慎操作。
索引名稱
表名
選擇為表名后,在目標(biāo)Elasticsearch實(shí)例中創(chuàng)建的索引名稱和表名一致,在本案例中即為es_test。
庫(kù)名_表名
選擇為庫(kù)名_表名后,在目標(biāo)Elasticsearch實(shí)例中創(chuàng)建的索引名稱為庫(kù)名_表名,在本案例中即為test_logstash_es_test。
源庫(kù)對(duì)象
在源庫(kù)對(duì)象框中單擊待同步對(duì)象,然后單擊將其移動(dòng)至已選擇對(duì)象框。
已選擇對(duì)象
如需更改單個(gè)同步對(duì)象在目標(biāo)實(shí)例中的名稱,請(qǐng)右擊已選擇對(duì)象中的同步對(duì)象,設(shè)置方式,請(qǐng)參見庫(kù)表列名單個(gè)映射。
如需批量更改同步對(duì)象在目標(biāo)實(shí)例中的名稱,請(qǐng)單擊已選擇對(duì)象方框右上方的批量編輯,設(shè)置方式,請(qǐng)參見庫(kù)表列名批量映射。
配置映射字段,修改同步后的字段名稱。
如果您需要修改同步后的字段名稱,可在已選擇對(duì)象區(qū)域框中,右鍵單擊對(duì)應(yīng)的表名,設(shè)置該表在目標(biāo)Elasticsearch實(shí)例中的索引名稱、Type名稱等信息,然后單擊確定。本文使用的配置及相關(guān)說明如下,未提及的配置保持默認(rèn),更多詳細(xì)信息請(qǐng)參見庫(kù)表列名單個(gè)映射。
配置
說明
索引名稱
自定義索引名稱,詳情請(qǐng)參見基本概念。
重要輸入索引名稱時(shí),請(qǐng)確保Elasticsearch集群中不存在同名索引,否則報(bào)錯(cuò)
index already exists
。Type名稱
自定義索引類型名稱,詳情請(qǐng)參見基本概念。
過濾條件
您可以設(shè)置SQL過濾條件,過濾待同步的數(shù)據(jù),只有滿足過濾條件的數(shù)據(jù)才會(huì)被同步到目標(biāo)實(shí)例,詳情請(qǐng)參見通過SQL條件過濾任務(wù)數(shù)據(jù)。
字段參數(shù)
選擇所需的字段參數(shù)和字段參數(shù)值,字段參數(shù)及取值介紹請(qǐng)參見Mapping parameters。
重要如果添加參數(shù)時(shí),將對(duì)應(yīng)參數(shù)的index值設(shè)置為false,那么該字段將不能被查詢,詳情請(qǐng)參見index。
配置高級(jí)參數(shù)。
本文使用默認(rèn)配置,相關(guān)說明如下。
配置
說明
選擇調(diào)度該任務(wù)的專屬集群
DTS默認(rèn)調(diào)度到共享集群上,用戶不需要選擇調(diào)度到指定的集群節(jié)點(diǎn)上。
專屬集群需要先購(gòu)買后,運(yùn)行成功才能選擇使用
您可以購(gòu)買指定規(guī)格的專屬集群來運(yùn)行DTS遷移、同步、訂閱等任務(wù),實(shí)現(xiàn)與其他用戶的DTS任務(wù)資源隔離,專屬集群中的DTS實(shí)例相比共享集群的實(shí)例,實(shí)現(xiàn)資源獨(dú)享,穩(wěn)定性更好,性能更優(yōu)。
監(jiān)控報(bào)警
是否設(shè)置告警,當(dāng)同步失敗或延遲超過閾值后,將通知告警聯(lián)系人。
不設(shè)置:不設(shè)置告警。
設(shè)置:設(shè)置告警,您還需要設(shè)置告警閾值和告警聯(lián)系人。更多信息,請(qǐng)參見在配置任務(wù)過程中配置監(jiān)控報(bào)警。
源庫(kù)、目標(biāo)庫(kù)無法連接后的重試時(shí)間
在同步任務(wù)啟動(dòng)后,若源庫(kù)或目標(biāo)庫(kù)連接失敗則DTS會(huì)報(bào)錯(cuò),并會(huì)立即進(jìn)行持續(xù)的重試連接,默認(rèn)持續(xù)重試時(shí)間為720分鐘,您也可以在取值范圍(10~1440分鐘)內(nèi)自定義重試時(shí)間,建議設(shè)置30分鐘以上。如果DTS在設(shè)置的重試時(shí)間內(nèi)重新連接上源庫(kù)、目標(biāo)庫(kù),同步任務(wù)將自動(dòng)恢復(fù)。否則,同步任務(wù)將會(huì)失敗。
說明針對(duì)同源或者同目標(biāo)的多個(gè)DTS實(shí)例,如DTS實(shí)例A和DTS實(shí)例B,設(shè)置網(wǎng)絡(luò)重試時(shí)間時(shí)A設(shè)置30分鐘,B設(shè)置60分鐘,則重試時(shí)間以低的30分鐘為準(zhǔn)。
由于連接重試期間,DTS將收取任務(wù)運(yùn)行費(fèi)用,建議您根據(jù)業(yè)務(wù)需要自定義重試時(shí)間,或者在源和目標(biāo)庫(kù)實(shí)例釋放后盡快釋放DTS實(shí)例。
分片配置
根據(jù)目標(biāo)Elasticsearch中索引的分片配置,設(shè)置索引的主分片和副本分片的數(shù)量。Elasticsearch 7.x以下版本的索引默認(rèn)包含5個(gè)主shard,1個(gè)副shard。Elasticsearch 7.x及以上版本的索引默認(rèn)包含1個(gè)主shard,1個(gè)副shard。
重要shard大小和數(shù)量是影響Elasticsearch集群穩(wěn)定性和性能的重要因素,您需要設(shè)置合理的shard數(shù),shard的評(píng)估方法請(qǐng)參見規(guī)格容量評(píng)估。
字符串Index
同步至目標(biāo)Elasticsearch實(shí)例中的字符串編入索引的方式:
analyzed:先分析字符串,再寫入索引。您還需要選擇具體的分析器,分析器的類型及作用,請(qǐng)參見分析器。
not analyzed:不分析,直接使用原始值寫入索引。
no:不寫入索引。
時(shí)區(qū)
DTS同步時(shí)間類型的數(shù)據(jù)(如DATETIME、TIMESTAMP)至目標(biāo)Elasticsearch實(shí)例時(shí),您可以選擇所帶時(shí)區(qū)。
說明如目標(biāo)實(shí)例中此類時(shí)間類型數(shù)據(jù)無需帶有時(shí)區(qū),則在同步前您需在目標(biāo)實(shí)例中設(shè)置該時(shí)間類型數(shù)據(jù)的文檔類型(type)。
DOCID取值
DOCID默認(rèn)為表的主鍵,如表中無主鍵,則DOCID為Elasticsearch自動(dòng)生成的ID列。
配置ETL功能
ETL配置功能暫不支持在目標(biāo)端進(jìn)行表結(jié)構(gòu)變更,涉及變更操作需要您在鏈路啟動(dòng)前預(yù)先在目標(biāo)端完成。
ETL配置的二次修改可能因您的配置造成鏈路中斷或歷史數(shù)據(jù)修改,請(qǐng)謹(jǐn)慎操作。
ETL配置二次修改啟動(dòng)時(shí)僅針對(duì)啟動(dòng)后的增量數(shù)據(jù)進(jìn)行適配,歷史數(shù)據(jù)不支持修改后的配置。
配置庫(kù)表字段,設(shè)置待同步的表在目標(biāo)Elasticsearch的_routing策略和_id取值。
本文使用的配置及相關(guān)說明如下。
類型
說明
設(shè)置_routing
設(shè)置_routing可以將文檔路由存儲(chǔ)在目標(biāo)Elasticsearch實(shí)例的指定分片上,請(qǐng)參見_routing。
選擇為是,您可以自定義列進(jìn)行路由。
選擇為否,則用_id進(jìn)行路由。
說明創(chuàng)建的目標(biāo)Elasticsearch實(shí)例為7.x版本時(shí),您必須選擇為否。
_id取值
表的主鍵列
聯(lián)合主鍵合并為一列。
業(yè)務(wù)主鍵
如果選擇為業(yè)務(wù)主鍵,那么您還需要設(shè)置對(duì)應(yīng)的業(yè)務(wù)主鍵列。
配置完成后,根據(jù)頁(yè)面提示保存任務(wù)、進(jìn)行預(yù)檢查、購(gòu)買并啟動(dòng)任務(wù)。
購(gòu)買成功后,同步任務(wù)正式開始,您可在數(shù)據(jù)同步界面查看具體任務(wù)進(jìn)度。待全量同步完成,增量同步進(jìn)行中時(shí),您即可在Elasticsearch中查看同步成功的數(shù)據(jù)。
重要由于MySQL和Elasticsearch實(shí)例支持的數(shù)據(jù)類型不同,數(shù)據(jù)類型無法一一對(duì)應(yīng)。所以DTS在進(jìn)行結(jié)構(gòu)初始化時(shí),會(huì)根據(jù)目標(biāo)庫(kù)支持的數(shù)據(jù)類型進(jìn)行類型映射,詳情請(qǐng)參見結(jié)構(gòu)初始化涉及的數(shù)據(jù)類型映射關(guān)系。
步驟三:驗(yàn)證數(shù)據(jù)同步結(jié)果
- 登錄目標(biāo)阿里云Elasticsearch實(shí)例的Kibana控制臺(tái),根據(jù)頁(yè)面提示進(jìn)入Kibana主頁(yè)。登錄Kibana控制臺(tái)的具體操作,請(qǐng)參見登錄Kibana控制臺(tái)。說明 本文以阿里云Elasticsearch 6.7.0版本為例,其他版本操作可能略有差別,請(qǐng)以實(shí)際界面為準(zhǔn)。
- 在左側(cè)導(dǎo)航欄,單擊Dev Tools。
在Console中,執(zhí)行如下命令查看全量數(shù)據(jù)同步結(jié)果。
GET /es_test_index/es_test_type/_search
預(yù)期結(jié)果如下。
在MySQL中插入一條數(shù)據(jù),在Elasticsearch中查看增量數(shù)據(jù)同步結(jié)果。
例如通過以下SQL語句插入一條數(shù)據(jù)。
INSERT INTO `test_logstash`.`es_test` (`id`,`name`,`age`,`hobby`) VALUES (6,'user6',30,'dance');
在Elasticsearch中查看結(jié)果,預(yù)期結(jié)果如下。