greenplum是分布式資料庫,這為備份帶來了一些困難。其本身提供了一個工具是gpcrondump,對其二進制備份工具gp_dump做了一些封裝,而gp_dump則是對pg_dump做了封裝,在每個節點上執行pg_dump完成資料的備份。在其每個節點的行為上,與pg類似,但其分布式的架構,則有值得了解的地方。
gp備份的工具gpcrondump是一個python腳本,是對gp_dump的一個封裝。而gp_dump則負責整個備份過程的控制與結果處理,包括擷取中繼資料資訊、啟動segment節點備份、狀态維護等動作。
gpcrondump的詳細參數:
gpcrondump以db為機關進行備份,當一次收到多個db的備份請求時,則每個db順序依次進行備份。針對每個db,gpcrondump會做一些預處理後,組織一個完整的gp_dump執行指令後執行。最基本的gp_dump指令如下:
gpcrondump不同的參數帶來不同的gp_dump指令,比如“–table-file”等。
gp_dump是真正進行資料備份的主體。其操作的主要步驟如下:
參數、資料對象的處理
除了對參數處理以外,這裡的行為與pg_dump相似,會對需要導出的資料對象、依賴關系等進行處理。
連接配接master,擷取中繼資料資訊
從這裡,擷取每個segment的資訊,包括主機、端口、角色等。
根據中繼資料連接配接到各個segment和master
根據第一步擷取的segment資訊,擷取角色為’p’的segment和master,保證連到的是活躍的節點。針對每個segment或master,會單獨啟動一個線程進行連接配接。
在連接配接到節點後,會建立消息通知機制。通過不同的消息通知,對該節點的備份情況進行及時響應,并對整體的備份及時做出調整,如取消等。
之後,将gpcrondump組織的參數,組織成gp_backup_launch函數的入參,調用執行。
之後調用gp_backup_launch函數,在segment端啟動一個agent程序
根據參數的不同,gp_backup_launch函數會啟動不同的獨立agent程序。預設的是gp_dump_agent,這個agent會封裝pg_dump。gp也支援備份到data domain boost等外部存儲,即在獨立的agent程序中調用不同的agent工具。
gp_backup_launch函數會等待gp_dump_agent執行結束後傳回結果。
每個segment端啟動的agent程序會再次連接配接到自身
agent的實作與pg的pg_dump基本類似。不同的是,在參數處理之後,會将這個節點的隔離級别設定為串行。是以,多少會對備份期間的事務性能産生一定影響。而如果隻是查詢的話則影響不大。
pg_dump和gp_dump_agent的實作都是用copy或者fetch語句将表的資料導出。
結果傳回
在gp_dump_agent執行結束後,結果傳回作為每個節點上gp_backup_launch函數的執行結果。
節點連接配接線程維護狀态機
gp_dump連接配接到每個節點的線程啟動運作狀态機,檢查其他并行線程的狀态、監聽目前線程的通知,當任何一個出現失敗,即取消備份
gp備份的機制充分利用了每個節點的并行,可以極大的提高備份速度。一方面單個節點的資料量可以控制在一定範圍,另一方面不同節點之間并行互不影響。
而在分布式中,比較麻煩的是保持多節點事務一緻性和異常情況的處理。其中事務一緻性是通過在每個節點上開啟事務并設定隔離級為串行做到;異常情況則是通過多線程之間通信和pg的消息通知來實作。
hope you have fun.