閱讀941 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Greenplum5.0 最佳實踐》 遷移數據使用Gptransfer

使用 Gptransfer 命令遷移一個 Greenplum 數據庫集群中的數據到另一台集群(metradata, data)

gptransfer 可以遷移數據庫中的全部數據或者部分選擇的表到另外一台 Greenplum 中。 源數據庫和目的數據庫可以在同一個集群中,也可以在不同的集群中。 gptransfer 所有的段數據庫是並行的移動數據的,使用 gpfdist 可以獲得更高的數據移動效率。

gptransfer 處理這數據的啟動和執行。 參與的集群必須存在。同時確保集群間的訪問時可以用過 SSH 訪問實現的。網絡互通。

gptranfer 參數包括處理一個數據庫和多個數據庫參數, 處理一張表和多張表參數。 全部的數據集遷移包括 schema, table date, indexes, views, roles, user-defined fuctions , resource queues. 參數配置文件 postgres.conf, ph_hba.conf, 必須使用超級用戶在源與目的數據庫之間執行操作。使用外部命令 gppkg 安裝 gptransfer. 就像安裝 MADLIB 一樣。

gptransfer 是如何工作的

gptransfer 是通過使用對外部表的讀寫操作試下你的,底層使用的工具是greenplum提供的 gpfdist 實現並行加載數據, 管道用來從源數據到目的數據端傳輸數據。 從源數據中選擇需要向目的數據段可寫外部表的數據,執行插入操作。在目的段數據庫中選擇表和數據庫,從外部表將數據導入到本地。這可讀可寫的外部表是用過命名管道去訪問源數據庫的, 每一個命名管道都有一個 gpfdist 進程存在,實現從源數據到目的數據庫。
gptransfer 通過批處理的方式編排數據, 每移動一張表, 他都要經曆如下的任務:

  1. 在源數據庫中創建可寫的外部表
  2. 在目的數據庫中創建可讀的外部表
  3. 在源數據集群中的每一個段數據庫上,創建一個命名管道和 gptranfer 進程。
  4. 在源數據庫段執行 SELECT INTO 語句,將源數據庫中的數據加載到可寫的外部表中
  5. 在目的數據庫中執行 SELECT INTO 語句, 從可讀的外部表中加載數據到數據庫中的表中
  6. 選擇有效的 MD5 參數,用來確定導入的數據在源數據庫與目的數據庫之間沒有任何問題
  7. 清空外部表, 命名管道, gpfdist 進程

前提準備

  1. gptranfer 隻適合Greenplum數據庫集群, HAWQ 並不支持
  2. Greenplum 的版本必須是在 4.2 或 以上
  3. 源與目的的數據庫集群必須要有 gptransfer
  4. 目的數據庫集群中的段數據庫數量必須大於等於源數據庫中段的數量。如果滿足這個條件,數據遷移會非常的慢
  5. 集群間的節點必須是可以連通的
  6. 可以使用 ssh 連接各個及誒到哪。 我們可以使用 gpssh_exkeys 命令來交換秘鑰,在集群之間

快模式和慢模式

同時運行多個 gptransfer , 可以更快的完成數據遷移。原理就是啟動更多的 gpfdist 進程,這種模式叫做快模式
當目的數據庫集群中的段數據庫數量大於源數據庫集群段數據庫很多時,可以這個幹。

當目的數據庫集群中的段數庫數量小於源數據庫集群段數據庫時, 啟動的 gptransfer 數量就會很少, 同時代表著 gpfdist 進程數量的減少。這就意味著將會花費著更多的時間。就是慢模式

批量處理的大小和子批量處理的大小

gpftransfer 的參數用來控製執行並行的讀,這裏有兩個執行參數, --batch-size, --sub-batch-size; 其中 --batch-size 參數用來確定在一個批處理中處理多少表。 默認值是2, 這就意味著在任何進程中一次處理兩張表。最小的批處理的值是1, 最大的值是10.
--sub-batch-size 用來確定在轉移數據時,子進程的最大並行數量。默認值是25, 最大值是50.批處理的值和子進程的值的乘積就是數據遷移的並行值。如果都按著默認的值設置, 那麼 gpftranser 就是50個任務並行。 每一個線程都是 Python 和 內存,所以,如果值設置的很大就會導致內存溢出的問題。所以這個值,我們要根據自己的實際環境來處理。

節點的準備工作

Greenplum 集群中的各個節點間實現無密通信, 實現 ssh 通信。gpftranser 要求源與目的數據庫集群間都要裝有該工具。
首先,確保網絡環境正常。然後確定有一個 host file 用來存儲全部需要使用到無密碼傳輸的節點名,最後使用 gpssh-exkeys 交換秘鑰。

這個映射文件 host file 裏麵包含了源集群中的全部節點名,它用來實現集群間的節點通信。 在Gptransfer 中使用的參數是
--source-map-file=host_map_file 參數。 這個參數是使用 gptransfer 在集群間copy數據使用的


host_name,host1_ip_addr
host_name,host2_ip_addr

該文件使用IP地址而不是主機名來避免集群之間名稱解析的問題。

缺點

gptransfer 僅僅可以移動用戶數據庫。對於數據庫 poostgresql, template0, template1 數據庫不能被移動。超級用戶手動移動配置文件和使用 gppkg 安裝外部應用,在目的數據中。

目的數據庫集群最好有比源數據庫集群更多的段數據庫,不然移動數據會非常慢。
對於移動小表或者空表時, gptransfer 也會很慢, 這是為什麼呢?主要是因為,時間都花費在建議讀寫外部表,進程間的連接等上麵。

全模式 和 表模式

當使用參數 --full 時, gptransfer 會拷貝全部的 tables, views, indexes, roles, user-defined function, resource queneue 從源數據庫到目的數據庫。將要從源數據庫移動的數據庫必須不存在在目的數據庫集群中。如果 gptransfer 報出如下錯誤時


[ERROR]: -- gptransfer: error : --full option specified but tables exists on destination system

去獨立的拷貝某一個表,需要強調使用的參數是 -t, 如果隻想拷貝一個表的一部分數據使用的是 -f 參數。 當拷貝表時, 目的數據庫必須存在。拷貝表使用如下格式 database.schema.table; 這個表的 索引 ,表結構, 表中的數據都會被拷貝。

如果目的數據庫已經存在該表, 在嚐試遷移源數據庫的表將會遇到如下錯誤


[INFO]: - Validating transfer table set ...
[CRITICAL]: -gptransfer failed. (Reason = 'Table databse.schema table exists in databse database.')

想要跳過這個錯誤使用如下參數
--skip-existing, --truncate 或者 --drop
接下來的表格用來顯示全拷貝模式與表拷貝模式
object Full Mode Table Mode
Data Yes Yes
Indexes Yes Yes
Roles Yes No
Functions Yes No
Resource Queues Yes No
postgres.conf No No
pg_hba.conf No No
gppkg No No

使用如下參數在全拷貝模式下,隻會拷貝表結構,不會拷貝數據
gptransfer --full --schema-only -d
在接下來使用表模式的時候,需要注意可能要用到表模式的參數 --truncate OR --drop 參數

使用參數 -x 可以給表加鎖。直到驗證和數據拷貝完成,才會釋放排他鎖。

驗證

默認情況下, gptransfer 並不會去驗證遷移完成的數據。 我們可以使用參數 --validate=type 選項來設置驗證。
type 的類型可以是
count - 用來比較源數據與目的數據的記錄數量是否一致
md5 - 對源數據的表和目的數據的表排序, 然後一行一行比較。檢查不同

在使用 gptransfer 遷移數據的時候,要確保加上參數 -x 來確保所有的對源表有排他鎖。因為在遷移數據時,表中的記錄發生該表將會驗證失敗。

遷移失敗

遷移失敗並不會一起 gptransfer 任務中止。 當一個遷移任務失敗的時候。 gptransfer 就會將錯誤信息加載到失敗的gptransfer文件中。 在 gptransfer 會話中, 它會提供到底哪裏出錯了, 如下例子


[WARNING] : - Some tables failed to transfer. A list of these tables
[WARNING]: - has been writen to the file failed transfer_tables_2014_08_08_101813.txt
[WARNING]: - this file can be used with the -f option to continue

正如上麵提示的警告信息, 我們可以使用 -f 參數去重新的請求文件格式

最佳實踐

對於大數據量的表的遷移使用 gptransfer 是非常好的選擇, 對於空表和小數據量的表而言, 遷移的準備工作和後期的清理公共,會顯示的數據遷移的非常的慢。那麼最好的做法就是使用 gptransfer 去遷移大數據量的表,對於小數據量的表使用其他的方法。

  1. 在開始遷移數據時, 在目的數據庫集群備份源數據的schema. 不要去使用 gptransfer 中的參數 --full -schema-only , 可以使用如下命令來完成上述工作
    1.1 使用 gpsd (Greenplum Statistics Dump) 支持工具。所以要在目的數據庫集群上運行完 ANALYZE 命令後, 在使用 gpsd 命令
    1.2 使用 PostgreSQL 的 pg_dump OR pg_dumpall 工具, 使用參數是 -shcma-only
    1.3 使用 DDL 腳本手動重新創建也可以

  2. 將要遷移的大表分割為大類和小類, 使用自己製定的標準。舉個例子, 我們可以將大表劃分為多個小表, 每一個表含有的記錄熟練是 1千萬條記錄或者是每個表有1GB大小

  3. 對於遷移小表數據, 建議使用 COPY 命令。
    這樣可以循環使用之前寫的腳本文件。

  4. 使用 gptransfer 用來批量遷移數據文件
    4.1 最好使用 fast 模式。 即目的數據庫有更多的段數據庫
    4.2 在遷移數據之前,先把索引給刪除了
    4.3 使用 -t OR -f 參數,遷移數據, 不要使用全模式遷移數據。
    4.4 在生產環境中,先測試一下數據遷移,在實際去執行。可以試驗如下參數 --batch-size--sub-batch-size 參數
    4.5 如果在目的段數據庫中已經存了模式信息, 記得使用 --skip-existing 參數
    4.6 使用完全限定的表名。注意 (.) (') (") 引起的問題
    4.7 如果決定使用了校驗參數 --validation 參數, 注意要加上排他鎖在源數據庫的表上 -x 參數

  5. 在所有的表都遷移完成後, 執行如下的操作
    5.1 檢查和更改錯誤的 gptransfer 任務
    5.2 重新為表創建索引
    5.3 明確 roles , functions , resource queues 等, 在目的數據庫中。
    5.4 複製 postgresql.confpg_hba.conf 參數文件從源數據庫到目的數據庫
    5.5 使用 gppkg 重新安裝擴展文件

參考文獻

<!https://gpdb.docs.pivotal.io/500/best_practices/gptransfer.html>

最後更新:2017-11-19 11:34:15

  上一篇:go  ExtJS 的布局
  下一篇:go  安裝memcacehd