DRDS(PolarDB-X 1.0)數(shù)據(jù)源
DRDS(PolarDB-X 1.0)數(shù)據(jù)源為您提供讀取和寫入DRDS(PolarDB-X 1.0)雙向通道的功能,本文為您介紹DataWorks的DRDS(PolarDB-X 1.0)數(shù)據(jù)同步的能力支持情況。
支持的版本
實時讀取
支持DRDS(PolarDB-X 1.0)實例。創(chuàng)建DRDS(PolarDB-X 1.0)實例的操作可參見創(chuàng)建PolarDB-X 1.0實例。
使用限制
離線讀寫
目前DRDS(PolarDB-X 1.0)的插件僅適配MySQL引擎的場景。DRDS(PolarDB-X 1.0)是一套分布式MySQL數(shù)據(jù)庫,并且大部分通信協(xié)議遵守MySQL使用場景。
DRDS(PolarDB-X 1.0)下的MySQL8.0版本支持使用Serverless資源組(推薦)和獨享數(shù)據(jù)集成資源組。
在底層實現(xiàn)上,DRDS(PolarDB-X 1.0) Writer通過JDBC連接遠程DRDS(PolarDB-X 1.0)數(shù)據(jù)庫的Proxy,執(zhí)行相應的
replace into
語句,寫入數(shù)據(jù)至DRDS(PolarDB-X 1.0)。執(zhí)行的SQL語句是
replace into
,為避免數(shù)據(jù)重復寫入,需要您的表具備主鍵(Primary Key)或唯一性索引(Unique index)。DRDS(PolarDB-X 1.0) Writer通過數(shù)據(jù)同步框架獲取Reader生成的協(xié)議數(shù)據(jù),通過
replace into
(沒有遇到主鍵/唯一性索引沖突時,與insert into
行為一致,沖突時會用新行替換原有行所有字段)語句寫入數(shù)據(jù)至DRDS(PolarDB-X 1.0)。DRDS(PolarDB-X 1.0) Writer累積一定數(shù)據(jù),提交給DRDS(PolarDB-X 1.0)的Proxy,該Proxy內(nèi)部決定數(shù)據(jù)是寫入一張還是多張表,以及多張表寫入時如何路由數(shù)據(jù)。說明整個任務至少需要具備
replace into
的權限。是否需要其它權限,取決于您配置任務時在preSql和postSql中指定的語句。支持讀取視圖表。
實時讀
目前僅支持使用實例模式配置的數(shù)據(jù)源,如果您使用JDBC連接串配置的數(shù)據(jù)源,任務運行將會出錯。
實例的存儲類型:僅支持PolarDB(即租戶側(cè)PolarDB MySQL)和存量的用戶RDS(新購已不支持),不支持RDS MySQL(即私有定制RDS MySQL)。
不支持XA ROLLBACK。
針對已經(jīng)XA PREPARE的事務數(shù)據(jù),實時同步會將其同步到目標端,如果XA ROLLBACK,實時同步不會針對XA PREPARE的數(shù)據(jù)做回滾寫入的操作。若要處理XA ROLLBACK場景,需要手動將XA ROLLBACK的表從實時同步任務中移除,再添加表后重新進行同步。
支持的字段類型
DRDS(PolarDB-X 1.0) Reader和DRDS(PolarDB-X 1.0) Writer支持大部分DRDS(PolarDB-X 1.0)類型,但也存在個別類型沒有支持的情況,請注意檢查您的數(shù)據(jù)類型。
DRDS(PolarDB-X 1.0) Reader和DRDS(PolarDB-X 1.0) Writer針對DRDS(PolarDB-X 1.0)類型的轉(zhuǎn)換列表,如下所示。
類型分類 | DRDS(PolarDB-X 1.0)數(shù)據(jù)類型 |
整數(shù)類 | INT、TINYINT、SMALLINT、MEDIUMINT和BIGINT |
浮點類 | FLOAT、DOUBLE和DECIMAL |
字符串類 | VARCHAR、CHAR、TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT |
日期時間類 | DATE、DATETIME、TIMESTAMP、TIME和YEAR |
布爾類 | BIT和BOOL |
二進制類 | TINYBLOB、MEDIUMBLOB、BLOB、LONGBLOB和VARBINARY |
數(shù)據(jù)同步前準備
您需要規(guī)劃一個數(shù)據(jù)庫的登錄賬戶用于后續(xù)執(zhí)行操作,此賬號需要擁有DRDS(PolarDB-X 1.0)的相關操作權限,詳情請參見新建賬號。
創(chuàng)建數(shù)據(jù)源
在進行數(shù)據(jù)同步任務開發(fā)時,您需要在DataWorks上創(chuàng)建一個對應的數(shù)據(jù)源,操作流程請參見創(chuàng)建并管理數(shù)據(jù)源,詳細的配置參數(shù)解釋可在配置界面查看對應參數(shù)的文案提示。
數(shù)據(jù)同步任務開發(fā)
數(shù)據(jù)同步任務的配置入口和通用配置流程可參見下文的配置指導。
單表離線同步任務配置指導
操作流程請參見通過向?qū)J脚渲秒x線同步任務、通過腳本模式配置離線同步任務。
腳本模式配置的全量參數(shù)和腳本Demo請參見下文的附錄:腳本Demo與參數(shù)說明。
整庫離線讀、單表/整庫全增量實時讀同步配置指導
操作流程請參見數(shù)據(jù)集成側(cè)同步任務配置。
常見問題
一致性視圖問題
DRDS(PolarDB-X 1.0)本身屬于分布式數(shù)據(jù)庫,對外無法提供一致性的多庫多表視圖。不同于MySQL等單庫單表同步,DRDS(PolarDB-X 1.0) Reader無法抽取同一個時間切片的分庫分表快照信息,即DRDS(PolarDB-X 1.0) Reader抽取底層不同的分表將獲取不同的分表快照,無法保證強一致性。
數(shù)據(jù)庫編碼問題
DRDS(PolarDB-X 1.0)本身的編碼設置非常靈活,包括指定編碼到庫、表、字段級別,甚至可以設置不同編碼。優(yōu)先級從高到低為字段、表、庫、實例。建議您在庫級別將編碼統(tǒng)一設置為UTF-8。
DRDS(PolarDB-X 1.0) Reader底層使用JDBC進行數(shù)據(jù)抽取,JDBC天然適配各類編碼,并在底層進行了編碼轉(zhuǎn)換。因此DRDS(PolarDB-X 1.0) Reader不需要您指定編碼,可以自動獲取編碼并轉(zhuǎn)碼。
對于DRDS(PolarDB-X 1.0)底層寫入編碼和其設定的編碼不一致的混亂情況,DRDS(PolarDB-X 1.0) Reader對此無法識別,該類情況的同步結果有可能為亂碼。
增量數(shù)據(jù)同步的方式
DRDS(PolarDB-X 1.0) Reader使用JDBC SELECT語句完成數(shù)據(jù)抽取工作,因此您可以使用
SELECT…WHERE…
進行增量數(shù)據(jù)抽取,方式如下:數(shù)據(jù)庫在線應用寫入數(shù)據(jù)庫時,填充modify字段為更改時間戳,包括新增、更新、刪除(邏輯刪除)。對于這類應用,DRDS(PolarDB-X 1.0) Reader只需要where條件后跟上一同步階段時間戳即可。
對于新增流水型數(shù)據(jù),DRDS(PolarDB-X 1.0) Reader在where條件后跟上一階段最大自增ID即可。
對于業(yè)務上無字段區(qū)分新增、修改數(shù)據(jù)的情況,DRDS(PolarDB-X 1.0) Reader無法進行增量數(shù)據(jù)同步,只能同步全量數(shù)據(jù)。
不支持在where語句中配置物理表相關的篩選條件。
附錄:腳本Demo與參數(shù)說明
離線任務腳本配置方式
如果您配置離線任務時使用腳本模式的方式進行配置,您需要按照統(tǒng)一的腳本格式要求,在任務腳本中編寫相應的參數(shù),詳情請參見通過腳本模式配置離線同步任務,以下為您介紹腳本模式下數(shù)據(jù)源的參數(shù)配置詳情。
Reader腳本Demo
{
"type":"job",
"version":"2.0",//版本號
"steps":[
{
"stepType":"drds",//插件名
"parameter":{
"datasource":"",//數(shù)據(jù)源名
"column":[//列名
"id",
"name"
],
"where":"",//過濾條件
"table":"",//表名
"splitPk": ""http://切分鍵
},
"name":"Reader",
"category":"reader"
},
{
"stepType":"stream",//插件名
"parameter":{},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"http://錯誤記錄數(shù)
},
"speed":{
"throttle":true,//當throttle值為false時,mbps參數(shù)不生效,表示不限流;當throttle值為true時,表示限流。
"concurrent":1,//并發(fā)數(shù)
"mbps":"12"http://限流,此處1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}
Reader腳本參數(shù)
參數(shù) | 描述 | 是否必選 | 默認值 |
datasource | 數(shù)據(jù)源名稱,腳本模式支持添加數(shù)據(jù)源,該配置項填寫的內(nèi)容必須與添加的數(shù)據(jù)源名稱保持一致。 | 是 | 無 |
table | 所選取的需要同步的表。 | 是 | 無 |
column | 所配置的表中需要同步的列名集合,使用JSON的數(shù)組描述字段信息,默認使用所有列配置,例如[*]:
| 是 | 無 |
where | 篩選條件,DRDS(PolarDB-X 1.0) Reader根據(jù)指定的column、table、where條件拼接SQL,并根據(jù)該SQL進行數(shù)據(jù)抽?。?
例如,在測試時使用where條件指定實際業(yè)務場景。通常會選擇當天的數(shù)據(jù)進行同步,您可以指定where條件為 | 否 | 無 |
Writer腳本Demo
{
"type":"job",
"version":"2.0",//版本號。
"steps":[
{
"stepType":"stream",
"parameter":{},
"name":"Reader",
"category":"reader"
},
{
"stepType":"drds",//插件名。
"parameter":{
"postSql":[],//執(zhí)行數(shù)據(jù)同步任務之后執(zhí)行的SQL語句。
"datasource":"",//數(shù)據(jù)源。
"column":[//列名。
"id"
],
"writeMode":"insert ignore",
"batchSize":"1024",//一次性批量提交的記錄數(shù)大小。
"table":"test",//表名。
"preSql":[]//執(zhí)行數(shù)據(jù)同步任務之前執(zhí)行的SQL語句。
},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"http://錯誤記錄數(shù)。
},
"speed":{
"throttle":true,//當throttle值為false時,mbps參數(shù)不生效,表示不限流;當throttle值為true時,表示限流。
"concurrent":1, //作業(yè)并發(fā)數(shù)。
"mbps":"12"http://限流,此處1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}
Writer腳本參數(shù)
參數(shù) | 描述 | 必選 | 默認值 |
datasource | 數(shù)據(jù)源名稱,腳本模式支持添加數(shù)據(jù)源,該配置項填寫的內(nèi)容必須與添加的數(shù)據(jù)源名稱保持一致。 | 是 | 無 |
table | 所選取的需要同步的表。 | 是 | 無 |
writeMode | 選擇導入模式,包括insert ignore和replace into:
| 否 | insert ignore |
column | 目標表需要寫入數(shù)據(jù)的字段,字段之間用英文逗號(,)分隔,例如"column": ["id", "name", "age"]。如果要依次寫入全部列,使用(*)表示,例如"column": ["*"]。 | 是 | 無 |
preSql | 執(zhí)行數(shù)據(jù)同步任務之前率先執(zhí)行的SQL語句。目前向?qū)J絻H允許執(zhí)行一條SQL語句,腳本模式可以支持多條SQL語句。 例如 | 否 | 無 |
postSql | 執(zhí)行數(shù)據(jù)同步任務之后執(zhí)行的SQL語句。目前向?qū)J絻H允許執(zhí)行一條SQL語句,腳本模式可以支持多條SQL語句。 例如 | 否 | 無 |
batchSize | 一次性批量提交的記錄數(shù)大小,該值可以極大減少數(shù)據(jù)同步系統(tǒng)與DRDS(PolarDB-X 1.0)的網(wǎng)絡交互次數(shù),并提升整體吞吐量。如果該值設置過大,會導致數(shù)據(jù)同步運行進程OOM異常。 | 否 | 1,024 |