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