266
windows
PostgreSQLReader__Reader插件_使用手冊_數據集成-阿裏雲
1 快速介紹
PostgreSQLReader插件實現了從PostgreSQL讀取數據。在底層實現上,PostgreSQLReader通過JDBC連接遠程PostgreSQL數據庫,並執行相應的sql語句將數據從PostgreSQL庫中SELECT出來。
公有雲上RDS提供PostgreSQL存儲引擎。
2 實現原理
簡而言之,PostgreSQLReader通過JDBC連接器連接到遠程的PostgreSQL數據庫,並根據用戶配置的信息生成查詢SELECT SQL語句並發送到遠程PostgreSQL數據庫,並將該SQL執行返回結果使用CDP自定義的數據類型拚裝為抽象的數據集,並傳遞給下遊Writer處理。
對於用戶配置Table、Column、Where的信息,PostgreSQLReader將其拚接為SQL語句發送到PostgreSQL數據庫;對於用戶配置querySql信息,PostgreSQL直接將其發送到PostgreSQL數據庫。
3 功能說明
3.1 配置樣例
- 使用Instance方式配置一個從PostgreSQL數據庫同步到抽取數據作業
{
"type": "job",
"traceId": "您可以在這裏填寫您作業的追蹤ID,建議使用業務名+您的作業ID",
"version": "1.0",
"configuration": {
"reader": {
"plugin": "postgresql",
"parameter": {
"instanceName": "datasync001",
"table": "table",
"username": "xxx",
"password": "xxxxxx",
"column": ["*"],
"fetchSize": 512,
"splitPk": "pk",
"where": "1 = 1"
}
},
"writer": {
"plugin": "odps",
"parameter": {
"accessId": "bazhen.csy",
"accessKey": "xxxxxxx",
"project": "project",
"table": "table",
"column": ["*"],
"partition": "pt=2014",
"truncate": true
}
}
}
}
- 使用JDBC方式配置一個從PostgreSQL數據庫同步抽取數據作業:
{
"type": "job",
"traceId": "您可以在這裏填寫您作業的追蹤ID,建議使用業務名+您的作業ID",
"version": "1.0",
"configuration": {
"reader": {
"plugin": "postgresql",
"parameter": {
"jdbcUrl": "jdbc:postgresql://HOST_NAME:PORT/DATABASE_NAME",
"table": "table",
"username": "xxx",
"password": "xxxxxx",
"column": ["*"],
"fetchSize": 512,
"splitPk": "pk",
"where": "1 = 1"
}
},
"writer": {
"plugin": "odps",
"parameter": {
"accessId": "bazhen.csy",
"accessKey": "xxxxxxx",
"project": "project",
"table": "table",
"column": ["*"],
"partition": "pt=2014",
"truncate": true
}
}
}
}
- 配置一個自定義SQL的數據庫同步任務到ODPS的作業:
{
"type": "job",
"traceId": "您可以在這裏填寫您作業的追蹤ID,建議使用業務名+您的作業ID",
"version": "1.0",
"configuration": {
"reader": {
"plugin": "postgresql",
"parameter": {
"jdbcUrl": "jdbc:postgresql://HOST_NAME:PORT/DATABASE_NAME",
"username": "xxx",
"password": "xxxxxx",
"querySql": "SELECT * from dual",
"fetchSize": 512
}
},
"writer": {
"plugin": "odps",
"parameter": {
"accessId": "bazhen.csy",
"accessKey": "xxxxxxx",
"project": "project",
"table": "table",
"column": [
"*"
],
"partition": "pt=2014",
"truncate": true
}
}
}
}
3.2 參數說明
instanceName
描述: 阿裏雲RDS實例名稱(Instance名稱)。用戶使用該配置指定RDS的Instance名稱,CDP將翻譯為底層執行的jdbcUrl連接串連接。
instanceName指定的是RDS實例。發給類似Mysql實例,指定了數據源的IP+Port,需要和database配合使用。例如,在RDS WebConsole頁麵中點擊【基本信息】,其右側詳情的名稱即是用戶擁有RDS的instanceName。 
必選:是
默認值:無
jdbcUrl
- 描述:描述的是到對端數據庫的JDBC連接信息,jdbcUrl按照PostgreSQL官方規範,並可以填寫連接附件控製信息。
- 必選:是
- 默認值:無
username
- 描述:數據源的用戶名。
- 必選:是
- 默認值:無
password
- 描述:數據源指定用戶名的密碼。
- 必選:是
- 默認值:無
table
- 描述:所選取的需要同步的表名。
- 必選:是
- 默認值:無
column
描述:所配置的表中需要同步的列名集合,使用JSON的數組描述字段信息。用戶使用代表默認使用所有列配置,例如['']。
支持列裁剪,即列可以挑選部分列進行導出。
支持列換序,即列可以不按照表schema信息進行導出。
支持常量配置,用戶需要按照JSON格式:
["id", "1", "'bazhen.csy'", "null", "to_char(a + 1)", "2.3" , "true"]
id為普通列名,1為整形數字常量,'bazhen.csy'為字符串常量,null為空指針,to_char(a + 1)為表達式,2.3為浮點數,true為布爾值。
Column必須顯示填寫,不允許為空!
必選:是
默認值:無
splitPk
描述:PostgreSQLReader進行數據抽取時,如果指定splitPk,表示用戶希望使用splitPk代表的字段進行數據分片,CDP因此會啟動並發任務進行數據同步,這樣可以大大提供數據同步的效能。
推薦splitPk用戶使用表主鍵,因為表主鍵通常情況下比較均勻,因此切分出來的分片也不容易出現數據熱點。
目前splitPk僅支持整形、字符串型數據切分,不支持浮點、日期等其他類型。如果用戶指定其他非支持類型,PostgreSQLReader將報錯!
splitPk如果不填寫,將視作用戶不對單表進行切分,PostgreSQLReader使用單通道同步全量數據。
必選:否
默認值:空
where
描述:篩選條件,PostgreSQLReader根據指定的column、table、where條件拚接SQL,並根據這個SQL進行數據抽取。例如在做測試時,可以將where條件指定為limit 10;在實際業務場景中,往往會選擇當天的數據進行同步,可以將where條件指定為gmt_create > $bizdate ;
where條件可以有效地進行業務增量同步。where條件不配置或者為空,視作全表同步數據。
必選:否
默認值:無
querySql
描述:在有些業務場景下,where這一配置項不足以描述所篩選的條件,用戶可以通過該配置型來自定義篩選SQL。當用戶配置了這一項之後,CDP係統就會忽略table,column這些配置型,直接使用這個配置項的內容對數據進行篩選,例如需要進行多表join後同步數據,使用select a,b from table_a join table_b on table_a.id = table_b.id
當用戶配置querySql時,PostgreSQLReader直接忽略table、column、where條件的配置。
必選:否
默認值:無
fetchSize
- 描述:該配置項定義了插件和數據庫服務器端每次批量數據獲取條數,該值決定了CDP和服務器端的網絡交互次數,能夠較大的提升數據抽取性能。注意,該值過大(>2048)可能造成CDP進程OOM。
- 必選:否
- 默認值:512
3.3 類型轉換
目前PostgreSQLReader支持大部分PostgreSQL類型,但也存在部分個別類型沒有支持的情況,請注意檢查你的類型。
下麵列出PostgreSQLReader針對PostgreSQL類型轉換列表:
CDP 內部類型 | PostgreSQL 數據類型 |
---|---|
Long | bigint, bigserial, integer, smallint, serial |
Double | double precision, money, numeric, real |
String | varchar, char, text, bit, inet |
Date | date, time, timestamp |
Boolean | bool |
Bytes | bytea |
請注意:
- 除上述羅列字段類型外,其他類型均不支持; money,inet,bit需用戶使用a_inet::varchar類似的語法轉換。
4 性能報告
4.1 環境準備
4.1.1 數據特征
建表語句:
create table pref_test(
id serial,
a_bigint bigint,
a_bit bit(10),
a_boolean boolean,
a_char character(5),
a_date date,
a_double double precision,
a_integer integer,
a_money money,
a_num numeric(10,2),
a_real real,
a_smallint smallint,
a_text text,
a_time time,
a_timestamp timestamp
)
4.1.2 機器參數
執行CDP的機器參數為:
1. cpu: 16核 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz 2. mem: MemTotal: 24676836kB MemFree: 6365080kB 3. net: 百兆雙網卡
PostgreSQL數據庫機器參數為:
D12 24邏輯核 192G內存 12*480G SSD 陣列
4.2 測試報告
4.2.1 單表測試報告
通道數 | 是否按照主鍵切分 | CDP速度(Rec/s) | CDP流量(MB/s) | CDP機器運行負載 |
---|---|---|---|---|
1 | 否 | 10211 | 0.63 | 0.2 |
1 | 是 | 10211 | 0.63 | 0.2 |
4 | 否 | 10211 | 0.63 | 0.2 |
4 | 是 | 40000 | 2.48 | 0.5 |
8 | 否 | 10211 | 0.63 | 0.2 |
8 | 是 | 78048 | 4.84 | 0.8 |
說明:
- 這裏的單表,主鍵類型為 serial,數據分布均勻。
- 對單表如果沒有按照主鍵切分,那麼配置通道個數不會提升速度,效果與1個通道一樣。
請注意:
- 除上述羅列字段類型外,其他類型均不支持。
5 約束限製
5.1 主備同步數據恢複問題
主備同步問題指PostgreSQL使用主從災備,備庫從主庫不間斷通過binlog恢複數據。由於主備數據同步存在一定的時間差,特別在於某些特定情況,例如網絡延遲等問題,導致備庫同步恢複的數據與主庫有較大差別,導致從備庫同步的數據不是一份當前時間的完整鏡像。
CDP如果同步的是阿裏雲提供RDS,是直接從主庫讀取數據,不存在數據恢複問題。但是會引入主庫負載問題,請注意流控配置。
5.2 一致性約束
PostgreSQL在數據存儲劃分中屬於RDBMS係統,對外可以提供強一致性數據查詢接口。例如當一次同步任務啟動運行過程中,當該庫存在其他數據寫入方寫入數據時,PostgreSQLReader完全不會獲取到寫入更新數據,這是由於數據庫本身的快照特性決定的。關於數據庫快照特性,請參看MVCC Wikipedia
上述是在PostgreSQLReader單線程模型下數據同步一致性的特性,由於PostgreSQLReader可以根據用戶配置信息使用了並發數據抽取,因此不能嚴格保證數據一致性:當PostgreSQLReader根據splitPk進行數據切分後,會先後啟動多個並發任務完成數據同步。由於多個並發任務相互之間不屬於同一個讀事務,同時多個並發任務存在時間間隔。因此這份數據並不是完整的
、一致的
數據快照信息。
針對多線程的一致性快照需求,在技術上目前無法實現,隻能從工程角度解決,工程化的方式存在取舍,我們提供幾個解決思路給用戶,用戶可以自行選擇:
- 使用單線程同步,即不再進行數據切片。缺點是速度比較慢,但是能夠很好保證一致性。
- 關閉其他數據寫入方,保證當前數據為靜態數據,例如,鎖表、關閉備庫同步等等。缺點是可能影響在線業務。
5.3 數據庫編碼問題
PostgreSQL在服務器端隻支持兩種簡體中文編碼: EUC_CN和UTF-8,PostgreSQLReader底層使用JDBC進行數據抽取,JDBC天然適配各類編碼,並在底層進行了編碼轉換。因此PostgreSQLReader不需用戶指定編碼,可以自動獲取編碼並轉碼。
對於PostgreSQL底層寫入編碼和其設定的編碼不一致的混亂情況,PostgreSQLReader對此無法識別,對此也無法提供解決方案,對於這類情況,導出有可能為亂碼
。
5.4 增量數據同步
PostgreSQLReader使用JDBC SELECT語句完成數據抽取工作,因此可以使用SELECT...WHERE...進行增量數據抽取,方式有多種:
- 數據庫在線應用寫入數據庫時,填充modify字段為更改時間戳,包括新增、更新、刪除(邏輯刪)。對於這類應用,PostgreSQLReader隻需要WHERE條件跟上一同步階段時間戳即可。
- 對於新增流水型數據,PostgreSQLReader可以WHERE條件後跟上一階段最大自增ID即可。
對於業務上無字段區分新增、修改數據情況,PostgreSQLReader也無法進行增量數據同步,隻能同步全量數據。
5.5 Sql安全性
PostgreSQLReader提供querySql語句交給用戶自己實現SELECT抽取語句,PostgreSQLReader本身對querySql不做任何安全性校驗。這塊交由CDP用戶方自己保證。
FAQ
Q: PostgreSQLReader同步報錯,報錯信息為XXX
A: 網絡或者權限問題,請使用PostgreSQL命令行測試:
psql -h ${pgHost} -p${pgPort} dbname=${pgDb} user=${pgUser} password=${pgPwd} --command='select * from yourtable'
"
如果上述命令也報錯,那可以證實是環境問題,請聯係你的DBA。
Q: 我想同步PostgreSQL增量數據,怎麼配置?
A: PostgreSQLReader必須業務支持增量字段CDP才能同步增量,例如在淘寶大部分業務表中,通過gmt_modified字段表征這條記錄的最新修改時間,那麼CDP PostgreSQLReader隻需要配置where條件為
"where": "add_time = '2014-06-01'"
Q: 上述bizdate代表什麼意思? 我每天需要同步的gmt_modified值肯定不一樣的,如何做到每天使用不同變量值
A: CDP支持自定義變量,請參考CDP Console 中有關自定義變量章節說明。
Q: 我有1億條數據需要同步,大概需要同步多長時間
A: 和數據庫配置、CDP機器負載相關,請參考上述性能章節
Q: 為什麼不推薦使用默認列*
, 會有問題嗎
A: 如果你限定了CDP同步a,b,c三列,那麼數據庫在添加列,修改列,刪除列情況,CDP可以做到要麼立即報錯,要麼兼容老情況。如果直接配置星號,上遊的數據庫變量會立刻影響下遊數據!而且可能會在下遊任務運行到一段時間才報錯,可能已經引入了大量髒數據。
Q: PostgreSQLReader同步出現亂碼,怎麼處理
A: 通常情況下是你同步的數據庫沒有按照規範配置編碼,比如數據庫配置的編碼是UTF8,但是底層物理文件實際存放的編碼是GBK,CDP按照UTF-8讀取數據就會出現亂碼。此時你應該尋求你的DBA修改庫的編碼格式。
最後更新:2016-11-23 16:03:59
上一篇:
SQLServerReader__Reader插件_使用手冊_數據集成-阿裏雲
下一篇:
ODPSReader__Reader插件_使用手冊_數據集成-阿裏雲
RDS到DataHub數據實時同步__實時同步_用戶指南_數據傳輸-阿裏雲
ALIYUN::ECS::NatGateway__資源列表_資源編排-阿裏雲
升級 Docker Daemon__集群管理_用戶指南_容器服務-阿裏雲
負載均衡支持 HTTPS/HTTP 協議常見問題__常見問題_負載均衡-阿裏雲
名詞解釋__產品簡介_彈性伸縮-阿裏雲
雲虛擬主機使用 360 網站安全檢測不成功的原因___安全問題_技術分享_雲虛機主機-阿裏雲
多實例協同消費__loghub-消費_用戶指南_日誌服務-阿裏雲
OSS轉儲授權__快速入門_歸檔存儲-阿裏雲
輪詢作業__SDK接口說明_Python版SDK_批量計算-阿裏雲
RENAME TABLE__數據定義語言_SQL語法參考_雲數據庫 OceanBase-阿裏雲
相關內容
常見錯誤說明__附錄_大數據計算服務-阿裏雲
發送短信接口__API使用手冊_短信服務-阿裏雲
接口文檔__Android_安全組件教程_移動安全-阿裏雲
運營商錯誤碼(聯通)__常見問題_短信服務-阿裏雲
設置短信模板__使用手冊_短信服務-阿裏雲
OSS 權限問題及排查__常見錯誤及排除_最佳實踐_對象存儲 OSS-阿裏雲
消息通知__操作指南_批量計算-阿裏雲
設備端快速接入(MQTT)__快速開始_阿裏雲物聯網套件-阿裏雲
查詢API調用流量數據__API管理相關接口_API_API 網關-阿裏雲
使用STS訪問__JavaScript-SDK_SDK 參考_對象存儲 OSS-阿裏雲