PostgreSQL數據源為您提供讀取和寫入PostgreSQL雙向通道的功能,方便您后續(xù)可以通過向導模式和腳本模式配置數據同步任務。本文為您介紹DataWorks的PostgreSQL數據同步能力支持情況。
支持的版本
目前僅支持配置PostgreSQL數據源為PostgreSQL10
、11
、12
、13
、14
、15
版本。您可以通過如下語句查看PostgreSQL數據庫的版本。
SHOW SERVER_VERSION;
使用限制
離線讀寫
支持讀取視圖表。
PostgreSQL數據源支持Password認證方式(支持SCRAM-SHA-256認證方式),如果PostgreSQL數據庫端更改了密碼和密碼認證方式,則需要更新數據源配置,并且重新測試連通性和手動運行相關任務驗證。
當PostgreSQL中表名稱、字段名稱是以數字開頭,或者名稱中包含大小寫英文字母、中劃線(-)時需要使用雙引號("")進行轉義,不進行轉義會導致PostgreSQL插件讀取或寫入PostgreSQL數據失敗。但是在PostgreSQL Reader和Writer插件中,雙引號("")為JSON關鍵字,因此,您需要使用反斜線(\)再次對雙引號("")進行轉義。例如,表名稱為123Test
,則轉義后表名稱為\"123Test\"
。
雙引號("")中,前引號(")和后引號(")均需使用反斜線(\)進行轉義。
向導模式不支持轉義,您需要轉換為腳本模式進行轉義。
使用腳本模式進行轉義的代碼示例如下。
"parameter": {
"datasource": "abc",
"column": [
"id",
"\"123Test\"", //添加轉義符
],
"where": "",
"splitPk": "id",
"table": "public.wpw_test"
},
實時讀
數據集成實時同步任務存在如下約束與限制:
數據集成對
ADD COLUMN
進行了特別支持:約束:
ADD COLUMN
時不能有ADD COLUMN
和DROP COLUMN
或者其他DDL的組合。重要ADD COLUMN
時其他DROP COLUMN、 RNAME COLUMN
等ALTER COLUMN
的行為將使數據同步任務不能正常工作。限制:除了
ADD COLUMN
外,無法識別用戶的其他DDL操作。
不支持
ALTER TABLE/CREATE TABLE
。不支持TEMPORARY表、UNLOGGED表和Hyper表復制,PostgreSQL數據庫沒有提供機制來對這兩種類型的表進行l(wèi)og解析訂閱。
不支持Sequences復制(
serial/bigserial/identity
)。不支持TRUNCATE操作。
不支持大對象復制(Bytea)。
不支持視圖、物化視圖、外部表復制。
支持的字段類型
離線讀寫
支持大部分PostgreSQL類型,但也存在部分類型沒有支持的情況,請注意檢查您的數據類型。
針對PostgreSQL的類型轉換列表,如下所示。
類型分類 | PostgreSQL數據類型 |
整數類 | BIGINT、BIGSERIAL、INTEGER、SMALLINT和SERIAL |
浮點類 | DOUBLE PRECISION、MONEY、NUMERIC和REAL |
字符串類 | VARCHAR、CHAR、TEXT、BIT和INET |
日期時間類 | DATE、TIME和TIMESTAMP |
布爾型 | BOOL |
二進制類 | BYTEA |
除上述羅列字段類型外,其它類型均不支持。
PostgreSQL Reader中MONEY、INET和BIT需要您使用
a_inet::varchar
類似的語法進行轉換。
數據同步前準備
在DataWorks上進行數據同步前,您需要參考本文提前在PostgreSQL側進行數據同步環(huán)境準備,以便在DataWorks上進行PostgreSQL數據同步任務配置與執(zhí)行時服務正常。以下為您介紹PostgreSQL同步前的相關環(huán)境準備。
準備工作1:創(chuàng)建賬號并配置賬號權限
您需要規(guī)劃一個數據庫的登錄賬號用于后續(xù)執(zhí)行操作,此賬號需要擁有數據庫的REPLICATION、 LOGIN
權限。
實時同步只支持邏輯復制機制,邏輯復制使用發(fā)布和訂閱模型,其中一個或多個訂閱者訂閱發(fā)布者節(jié)點上的一個或多個發(fā)布。訂閱者從他們訂閱的發(fā)布中提取數據。
表的邏輯復制通常從對發(fā)布者數據庫上的數據進行快照并將其復制到訂閱者開始。完成后,發(fā)布者上的更改會實時發(fā)送給訂閱者。
創(chuàng)建賬號。
操作詳情請參見創(chuàng)建賬號和數據庫。
配置權限。
檢查賬號是否有
replication
權限。select userepl from pg_user where usename='xxx'
預期返回結果為True,返回False則表示無權限,您可以通過如下語句進行授權。
ALTER USER <user> REPLICATION;
準備工作2:檢查是否支持備庫
SELECT pg_is_in_recovery()
目前僅支持主庫,預期返回結果為False,返回True時表示是備庫,實時同步不支持備庫,需修改數據源配置信息為主庫的信息,請參見配置PostgreSQL數據源。
準備工作3:檢查wal_level
是否為logical
show wal_level
wal_level
指定了wal_log
的級別,預期返回結果為logical,否則不支持邏輯復制機制。
準備工作4:檢查是否可以啟動wal_sender
進程
-- 查詢 max_wal_senders
show max_wal_senders;
-- 查詢 pg_stat_replication 數量
select count(*) from pg_stat_replication
當max_wal_senders
不為空,且max_wal_senders
值大于pg_stat_replication
數量時,則表示有空閑可用的wal_sender
進程。PostgreSQL數據庫會為同步數據程序啟動wal_sender
進程來給訂閱者發(fā)送日志。
對于每一個需要同步的表,需要手動執(zhí)行ALTER TABLE [tableName] REPLICA IDENTITY FULL
語句進行授權,否則實時同步任務會報錯。
PostgreSQL實時同步任務啟動后,會在數據庫中自動創(chuàng)建slot、publications,slot名稱格式為:di_slot_ + 解決方案ID
,publication名稱格式為:di_pub_ + 解決方案ID
,當實時同步任務停止或下線后,需手動刪除,否則可能會導致PostgreSQL WAL持續(xù)增長。
創(chuàng)建數據源
在進行數據同步任務開發(fā)時,您需要在DataWorks上創(chuàng)建一個對應的數據源,操作流程請參見創(chuàng)建并管理數據源,詳細的配置參數解釋可在配置界面查看對應參數的文案提示。
如果您的PostgreSQL數據庫開啟了SSL認證,那么您在添加DataWorks的PostgreSQL數據源時也需要開啟SSL認證,具體操作流程請參見附錄二:PostgreSQL數據源增加SSL認證。
數據同步任務開發(fā):PostgreSQL同步流程引導
數據同步任務的配置入口和通用配置流程可參見下文的配置指導。
單表離線同步任務配置指導
操作流程請參見通過向導模式配置離線同步任務、通過腳本模式配置離線同步任務。
腳本模式配置的全量參數和腳本Demo請參見下文的附錄一:腳本Demo與參數說明。
整庫離線讀、單表/整庫全增量實時讀等同步任務配置指導
操作流程請參見數據集成側同步任務配置。
常見問題
主備同步數據恢復問題
主備同步問題指PostgreSQL使用主從災備,備庫從主庫不間斷恢復數據。由于主備數據同步存在一定的時間差,特別在于某些特定情況,例如網絡延遲等問題,導致備庫同步恢復的數據與主庫有較大差別,從備庫同步的數據不是一份當前時間的完整鏡像。
一致性約束
PostgreSQL在數據存儲劃分中屬于RDBMS系統(tǒng),對外可以提供強一致性數據查詢接口。例如一次同步任務啟動運行過程中,當該庫存在其他數據寫入方寫入數據時,由于數據庫本身的快照特性,PostgreSQL Reader完全不會獲取到寫入的更新數據。
上述是在PostgreSQL Reader單線程模型下數據同步一致性的特性,PostgreSQL Reader可以根據您配置的信息使用并發(fā)數據抽取,因此不能嚴格保證數據一致性。
當PostgreSQL Reader根據splitPk進行數據切分后,會先后啟動多個并發(fā)任務完成數據同步。多個并發(fā)任務相互之間不屬于同一個讀事務,同時多個并發(fā)任務存在時間間隔,因此這份數據并不是完整的、一致的數據快照信息。
針對多線程的一致性快照需求,目前在技術上無法實現,只能從工程角度解決。工程化的方式存在取舍,在此提供以下解決思路,您可以根據自身情況進行選擇。
使用單線程同步,即不再進行數據切片。缺點是速度比較慢,但是能夠很好保證一致性。
關閉其它數據寫入方,保證當前數據為靜態(tài)數據,例如鎖表、關閉備庫同步等。缺點是可能影響在線業(yè)務。
數據庫編碼問題
PostgreSQL在服務器端僅支持EUC_CN和UTF-8兩種簡體中文編碼,PostgreSQL Reader底層使用JDBC進行數據抽取,JDBC天然適配各類編碼,并在底層進行了編碼轉換。因此PostgreSQL Reader不需您指定編碼,可以自動獲取編碼并轉碼。
對于PostgreSQL底層寫入編碼和其設定的編碼不一致的混亂情況,PostgreSQL Reader對此無法識別,也無法提供解決方案,導出結果有可能為亂碼。
增量數據同步的方式
PostgreSQL Reader使用JDBC SELECT語句完成數據抽取工作,因此可以使用
SELECT…WHERE…
進行增量數據抽取,方式如下:數據庫在線應用寫入數據庫時,填充modify字段為更改時間戳,包括新增、更新、刪除(邏輯刪除)。對于該類應用,PostgreSQL Reader只需要where條件后跟上一同步階段時間戳即可。
對于新增流水型數據,PostgreSQL Reader在where條件后跟上一階段最大自增ID即可。
對于業(yè)務上無字段區(qū)分新增、修改數據的情況,PostgreSQL Reader無法進行增量數據同步,只能同步全量數據。
SQL安全性
PostgreSQL Reader提供querySql語句交給您自己實現SELECT抽取語句,PostgreSQL Reader本身對querySql不進行任何安全性校驗。
附錄一:腳本Demo與參數說明
離線任務腳本配置方式
如果您配置離線任務時使用腳本模式的方式進行配置,您需要按照統(tǒng)一的腳本格式要求,在任務腳本中編寫相應的參數,詳情請參見通過腳本模式配置離線同步任務,以下為您介紹腳本模式下數據源的參數配置詳情。
Reader腳本Demo
配置一個從PostgreSQL數據庫同步抽取數據作業(yè),使用腳本開發(fā)的詳情請參見通過腳本模式配置離線同步任務。
{
"type":"job",
"version":"2.0",//版本號。
"steps":[
{
"stepType":"postgresql",//插件名。
"parameter":{
"datasource":"",//數據源。
"column":[//字段。
"col1",
"col2"
],
"where":"",//篩選條件。
"splitPk":"",//用splitPk代表的字段進行數據分片,數據同步會啟動并發(fā)任務進行數據同步。
"table":""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, //作業(yè)并發(fā)數。
"mbps":"12"http://限流,此處1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}
Reader腳本參數
參數 | 描述 | 是否必選 | 默認值 |
datasource | 數據源名稱,腳本模式支持添加數據源,此配置項填寫的內容必須與添加的數據源名稱保持一致。 | 是 | 無 |
table | 選取的需要同步的表名稱。 | 是 | 無 |
column | 所配置的表中需要同步的列名集合,使用JSON的數組描述字段信息 。默認使用所有列配置,例如[ * ]。
| 是 | 無 |
splitPk | PostgreSQL Reader進行數據抽取時,如果指定splitPk,表示您希望使用splitPk代表的字段進行數據分片,數據同步會啟動并發(fā)任務,以提高數據同步的效能:
| 否 | 無 |
where | 篩選條件,PostgreSQL Reader根據指定的column、table和where條件拼接SQL,并根據該SQL進行數據抽取。例如在測試時,您可以使用where條件指定實際業(yè)務場景,通常會選擇當天的數據進行同步,指定where條件為
| 否 | 無 |
querySql(高級模式,向導模式不提供) | 在部分業(yè)務場景中,where配置項不足以描述所篩選的條件,您可以通過該配置型來自定義篩選SQL。當配置該項后,數據同步系統(tǒng)會忽略tables、columns和splitPk配置項,直接使用該配置的內容篩選數據。例如需要進行多表JOIN后同步數據,使用 | 否 | 無 |
fetchSize | 該配置項定義了插件和數據庫服務器端每次批量數據獲取條數,該值決定了數據集成和服務器端的網絡交互次數,能夠較大地提升數據抽取性能。 說明 fetchSize值過大(>2048)可能造成數據同步進程OOM。 | 否 | 512 |
Writer腳本Demo
腳本配置示例如下,詳情請參見上述參數說明。
{
"type":"job",
"version":"2.0",//版本號。
"steps":[
{
"stepType":"stream",
"parameter":{},
"name":"Reader",
"category":"reader"
},
{
"stepType":"postgresql",//插件名。
"parameter":{
"datasource":"",//數據源。
"column":[// 字段。
"col1",
"col2"
],
"table":"",//表名。
"preSql":[],//執(zhí)行數據同步任務之前率先執(zhí)行的SQL語句。
"postSql":[],//執(zhí)行數據同步任務之后率先執(zhí)行的SQL語句。
},
"name":"Writer",
"category":"writer"
}
],
"setting":{
"errorLimit":{
"record":"0"http://錯誤記錄數
},
"speed":{
"throttle":true,//當throttle值為false時,mbps參數不生效,表示不限流;當throttle值為true時,表示限流。
"concurrent":1, //作業(yè)并發(fā)數。
"mbps":"12"http://限流,此處1mbps = 1MB/s。
}
},
"order":{
"hops":[
{
"from":"Reader",
"to":"Writer"
}
]
}
}
Writer腳本參數
參數 | 描述 | 是否必選 | 默認值 |
datasource | 數據源名稱,腳本模式支持添加數據源,該配置項填寫的內容必須要與添加的數據源名稱保持一致。 | 是 | 無 |
table | 選取的需要同步的表名稱。 | 是 | 無 |
writeMode | 選擇導入模式,目前支持insert和copy兩種方式:
| 否 | insert |
column | 目標表需要寫入數據的字段,字段之間用英文逗號分隔。例如 | 是 | 無 |
preSql | 執(zhí)行數據同步任務之前率先執(zhí)行的SQL語句。目前向導模式僅允許執(zhí)行一條SQL語句,腳本模式可以支持多條SQL語句,例如清除舊數據。 | 否 | 無 |
postSql | 執(zhí)行數據同步任務之后執(zhí)行的SQL語句。目前向導模式僅允許執(zhí)行一條SQL語句,腳本模式可以支持多條SQL語句,例如加上某一個時間戳。 | 否 | 無 |
batchSize | 一次性批量提交的記錄數大小,該值可以極大減少數據集成與PostgreSQL的網絡交互次數,并提升整體吞吐量。但是該值設置過大可能會造成數據集成運行進程OOM情況。 | 否 | 1,024 |
pgType | PostgreSQL特有類型的轉化配置,支持bigint[]、double[]、text[]、Jsonb和JSON類型。配置示例如下。
| 否 | 無 |
附錄二:PostgreSQL數據源增加SSL認證
PostgreSQL SSL認證文件說明
在DataWorks上創(chuàng)建或修改PostgreSQL數據源連接方式,支持配置SSL認證方式,SSL認證相關的配置項說明,具體如下。
PostgreSQL數據庫 | DataWorks的PostgreSQL數據源配置 | |||
SSL鏈路加密 | 客戶端加密 | 配置ACL | 配置項 | 說明 |
開啟 | 不啟用 | 不涉及 | Truststore證書文件 | 可選,客戶端使用該證書來認證服務器。
|
啟用 | 配置ACL為prefer |
| Keystore證書文件和私鑰文件均可選,配置ACL為prefer表示服務端不強制校驗客戶端。
| |
配置ACL為verify-ca |
|
ACL配置設置為prefer時,不會強制校驗客戶端內容。
如果SSL認證時不配置任何文件,走普通鏈路。
如果SSL認證時添加了認證文件,可參考以上表格相對應描述。
ACL配置設置為verify-ca時,保證Keystore證書文件、私鑰文件以及私鑰密碼三個配置項配置,即可創(chuàng)建數據源。
獲取PostgreSQL SSL認證文件
本文將以RDS PostgreSQL實例為例生成SSL認證證書。
Truststore證書文件獲取方式。
Truststore 證書文件獲取的具體信息可以參考使用云端證書快速開啟SSL加密。
進入RDS實例列表,單擊查看對應區(qū)域的RDS實例,并點擊目標實例ID,進入實例信息頁面。
選擇需要保護的連接串,具體操作如下圖所示:
說明如果已開啟外網地址,系統(tǒng)將同時顯示內網和外網兩個連接地址。云端證書只能對一個連接地址進行保護,而內網連接地址相對更安全,推薦您對外網連接地址進行保護。查看內網和外網地址的具體方法。請參考查看內外網地址。
如果您需要同時對內網和外網連接地址進行保護,可以參考使用自定義證書開啟SSL加密。
配置云端證書后,實例的運行狀態(tài)將會變成修改SSL中,該狀態(tài)持續(xù)三分鐘左右,請耐心等待運行狀態(tài)變更為運行中后再進行后續(xù)操作。
c. 單擊下載CA證書,即可獲取到Truststore證書文件。
下載的CA證書包含3個文件,在DataWorks配置PostgreSQL數據源時,將后綴為
.pem
的文件或后綴為.p7b
文件上傳到Truststore 證書文件配置項中。Keystore證書文件、私鑰文件、私鑰密碼的獲取與配置。
前提條件:已完成使用云端證書快速開啟SSL加密或使用自定義證書開啟SSL加密以及擁有OpenSSL工具。
說明如果您使用的是Linux系統(tǒng),則系統(tǒng)已自帶OpenSSL工具,無需進行安裝。如果您使用Windows系統(tǒng),請獲取OpenSSL軟件包并安裝。
Keystore證書文件、私鑰文件、私鑰密碼獲取與配置的具體信息可以參考配置客戶端CA證書。
在Linux系統(tǒng)上的OpenSSL工具或在Windows系統(tǒng)上安裝OpenSSL軟件,生成自簽名證書(ca1.crt)和自簽名證書密鑰(ca1.key)。
openssl req -new -x509 -days 3650 -nodes -out ca1.crt -keyout ca1.key -subj "/CN=root-ca1"
生成客戶端證書請求文件(client.csr)和客戶端證書私鑰(client.key)。
openssl req -new -nodes -text -out client.csr -keyout client.key -subj "/CN=<客戶端用戶名>"
該命令中
-subj
參數后的CN取值請配置為客戶端訪問數據庫的用戶名。生成客戶端證書(client.crt)。
openssl x509 -req -in client.csr -text -days 365 -CA ca1.crt -CAkey ca1.key -CAcreateserial -out client.crt
如果您的RDS PostgreSQL服務器需要驗證客戶端CA證書,那么您需要打開生成的客戶端自簽名證書ca1.crt文件,復制證書內容粘貼在請?zhí)顚懣蛻舳俗C書授權機構公鑰內容對話框內,作為客戶端CA證書。
在RDS側配置好客戶端CA證書后,在DataWorks上配置PostgreSQL數據源時,需要將客戶端證書私鑰client.key轉換為client.pk8文件,并將client.pk8上傳至DataWorks的PostgreSQL數據源配置的私鑰文件配置項中。
cp client.key client.pk8
配置私鑰密碼。
openssl pkcs8 -topk8 -inform PEM -in client.key -outform der -out client.pk8 -v1 PBE-MD5-DES
說明在執(zhí)行配置私鑰密碼命令時,必須輸入密碼。如果您設置了密碼,則在DataWorks的PostgreSQL數據源配置中的私鑰密碼也需要使用相同的密碼。
配置 PostgreSQL SSL 認證文件
在將獲取到的證書文件上傳到DataWorks的PostgreSQL配置項時,其對應操作如下:
Truststore 證書文件:上傳Truststore證書文件獲取步驟獲取到的后綴為
.pem
的文件或后綴為.p7b
文件。Keystore 證書文件:上傳生成客戶端證書步驟獲取到的客戶端證書文件client.crt。
私鑰文件:上傳轉換私鑰文件步驟獲取到的客戶端證書私鑰文件轉換成的client.pk8文件。
私鑰密碼:指的是配置私鑰密碼步驟配置的密碼。
配置ACL:進入RDS實例列表,單擊查看對應區(qū)域的RDS實例,并點擊目標實例ID,進入實例信息頁面后,點擊 單擊修改后,可以選擇不同SSL認證方法,可參考強制客戶端開啟SSL連接。
若ACL認證方法為prefer,則PostgreSQL服務器不會對客戶端證書進行強制校驗。
若在RDS PostgreSQL中配置了ACL認證方法為verify-ca,則在配置DataWorks的PostgreSQL數據源時,需要上傳正確的客戶端證書,保證服務器能夠檢查客戶端認證真?zhèn)巍?/p>