閱讀266 返回首頁    go 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。
      
      ![RDS instanceName圖解](https://img.alibaba.com/kf/HTB1wAz9GpXXXXc9XXXXq6xXFXXXl.jpg)
      
    • 必選:是

    • 默認值:無

  • 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

說明:

  1. 這裏的單表,主鍵類型為 serial,數據分布均勻。
  2. 對單表如果沒有按照主鍵切分,那麼配置通道個數不會提升速度,效果與1個通道一樣。

請注意:

  • 除上述羅列字段類型外,其他類型均不支持。

5 約束限製

5.1 主備同步數據恢複問題

主備同步問題指PostgreSQL使用主從災備,備庫從主庫不間斷通過binlog恢複數據。由於主備數據同步存在一定的時間差,特別在於某些特定情況,例如網絡延遲等問題,導致備庫同步恢複的數據與主庫有較大差別,導致從備庫同步的數據不是一份當前時間的完整鏡像。

CDP如果同步的是阿裏雲提供RDS,是直接從主庫讀取數據,不存在數據恢複問題。但是會引入主庫負載問題,請注意流控配置。

5.2 一致性約束

PostgreSQL在數據存儲劃分中屬於RDBMS係統,對外可以提供強一致性數據查詢接口。例如當一次同步任務啟動運行過程中,當該庫存在其他數據寫入方寫入數據時,PostgreSQLReader完全不會獲取到寫入更新數據,這是由於數據庫本身的快照特性決定的。關於數據庫快照特性,請參看MVCC Wikipedia

上述是在PostgreSQLReader單線程模型下數據同步一致性的特性,由於PostgreSQLReader可以根據用戶配置信息使用了並發數據抽取,因此不能嚴格保證數據一致性:當PostgreSQLReader根據splitPk進行數據切分後,會先後啟動多個並發任務完成數據同步。由於多個並發任務相互之間不屬於同一個讀事務,同時多個並發任務存在時間間隔。因此這份數據並不是完整的一致的數據快照信息。

針對多線程的一致性快照需求,在技術上目前無法實現,隻能從工程角度解決,工程化的方式存在取舍,我們提供幾個解決思路給用戶,用戶可以自行選擇:

  1. 使用單線程同步,即不再進行數據切片。缺點是速度比較慢,但是能夠很好保證一致性。
  2. 關閉其他數據寫入方,保證當前數據為靜態數據,例如,鎖表、關閉備庫同步等等。缺點是可能影響在線業務。
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

  上一篇:go SQLServerReader__Reader插件_使用手冊_數據集成-阿裏雲
  下一篇:go ODPSReader__Reader插件_使用手冊_數據集成-阿裏雲