?
本文檔使用
php中文網(wǎng)手冊 發(fā)布
一種替代在前節(jié)描述的內(nèi)建備用模式的方法是使用restore_command輪詢歸檔位置。 這是只能在8.4及以下版本選擇使用。在此設(shè)置standby_mode關(guān)閉,因為你要實現(xiàn)備服務(wù)器運行你自己所需的輪詢。 請參考contrib/pg_standby(Section F.28)關(guān)于這類的實現(xiàn)。
請注意在這種模式,服務(wù)器將一次應(yīng)用一個WAL文件,所以如果你使用備服務(wù)器對于查詢(見熱備), 在主服務(wù)器中的動作和當(dāng)這個動作在備服務(wù)器中可見之間有個延遲,相應(yīng)的時間用在填寫WAL文件。 還要注意你不能用這種方法結(jié)合流復(fù)制。
主備用服務(wù)器上發(fā)生的操作是正常的連續(xù)歸檔和恢復(fù)任務(wù)。兩個數(shù)據(jù)庫服務(wù)器相聯(lián)系的僅有點是兩者共享的WAL歸檔文件: 主寫入歸檔,備從歸檔讀取。必須小心,以確保從單獨的主服務(wù)器,不會混在一起或混淆WAL歸檔。歸檔需要并不大, 如果只是備服務(wù)器操作要求。
使松散耦合的兩個服務(wù)器一起工作簡直是奇跡,在備服務(wù)器上簡單使用restore_command, 當(dāng)詢問下一個WAL文件,等待其為主服務(wù)器可用的。在備服務(wù)器的recovery.conf文件指定restore_command。 通常恢復(fù)進(jìn)程將從一個WAL歸檔中請求文件,如果該文件不可用,則報告失敗。 對備服務(wù)器進(jìn)程來說下一個WAL文件不可用是正常的,因此備服務(wù)器進(jìn)程需要等待它出現(xiàn)。 對于在.backup或.history文件結(jié)束不需要等待,并且返回一個非零值。 等待restore_command可以寫為一個自定義腳本,即循環(huán)輪詢下一個WAL文件的存在。 還必須有一些方法來觸發(fā)失效切換,應(yīng)該中斷的restore_command,跳出循環(huán),并返回備用服務(wù)器一個文件未找到錯誤。 這兩端的恢復(fù)和備用服務(wù)器,然后將作為一個正常的服務(wù)器。
一個合適restore_command的偽碼是:
triggered=false; while(!NextWALFileReady()&&!triggered) { sleep(100000L);/*waitfor~0.1sec*/ if(CheckForExternalTrigger()) triggered=true; } if(!triggered) CopyWALFileForRecovery();
一個等待restore_command的工作例子由contrib模塊名為pg_standby提供。 應(yīng)該用來作為參考如何正確地貫徹執(zhí)行上述邏輯。它也可以擴(kuò)展需要,以支持特定的配置和環(huán)境。
觸發(fā)失效切換的方法是規(guī)劃和設(shè)計的一個重要組成部分。一個潛在的選項是restore_command命令。 每個WAL文件執(zhí)行一次,但是運行restore_command的進(jìn)程對于每個文件創(chuàng)建和消亡的, 所以沒有守護(hù)進(jìn)程或服務(wù)器進(jìn)程和信號或不能使用的信號處理。 因此,restore_command不適合觸發(fā)失效切換。使用簡單超時機(jī)制可能的,尤其如果與已知的archive_timeout 在主服務(wù)器上配合設(shè)置使用。盡管,這有點容易出錯,因為網(wǎng)絡(luò)問題或繁忙的主服務(wù)器可能有足夠的啟動失效切換。 通報機(jī)制,如顯式創(chuàng)建一個觸發(fā)器文件是理想的,如果可以安排。
配置備用服務(wù)器,使用這種替代方法簡短步驟如下。 對于每一步的細(xì)節(jié),請參閱前面的章節(jié)。
建立主備系統(tǒng)盡可能接近相同,包括兩個PostgreSQL副本在相同版本級別。
設(shè)置從主服務(wù)器上連續(xù)歸檔到備服務(wù)器WAL歸檔目錄。確保在主服務(wù)器上相應(yīng)的設(shè)置archive_mode, archive_command和archive_timeout。
做一個主服務(wù)器的基準(zhǔn)備份,到備服務(wù)器上加載這個數(shù)據(jù)。(請參閱Section 24.3.2)。
在備服務(wù)器上從一個本地的WAL歸檔開始恢復(fù),如前所述等待使用recovery.conf所指定的restore_command。 (請參閱Section 24.3.3)。
恢復(fù)對WAL歸檔做只讀處理,所以一旦在Wal的文件已被復(fù)制到備用系統(tǒng),就可以在同一時間復(fù)制到磁帶,因為正通過備用數(shù)據(jù)庫服務(wù)器讀取到。 因此,運行高可用性的備用服務(wù)器可以同時作為文件存儲長遠(yuǎn)的災(zāi)難恢復(fù)目的做處理。
出于測試目的,它是可以在同一系統(tǒng)上運行的主備服務(wù)器。 沒提供任何值得改進(jìn)服務(wù)器的健壯性,也不會描述為HA。
也有可能實現(xiàn)基于記錄的日志傳送使用這種替代方法,盡管這需要定制開發(fā),變化仍然只能為熱備查詢后一個完整的WAL文件傳到成為可見的。
一個外部程序可以調(diào)用pg_xlogfile_name_offset()
這個函數(shù)用來找出文件名和當(dāng)前WAL結(jié)尾的準(zhǔn)確字節(jié)偏移。
然后,可以直接訪問WAL文件,并從WAL的上次已知的結(jié)尾到當(dāng)前結(jié)束數(shù)據(jù)復(fù)制數(shù)據(jù)到備用服務(wù)器。用這種方法,數(shù)據(jù)丟失窗口是復(fù)制程序的輪詢周期時間,
其可以非常小,并沒有迫使部分使用的段文件要歸檔的帶寬浪費。請注意備服務(wù)器上的restore_command腳本只能處理完整的WAL文件,
所以通常的增量備份數(shù)據(jù)到備服務(wù)器不可用。只有在主服務(wù)器死掉,在允許它到來前,最后一部分WAL文件送到備服務(wù)器。
在這個進(jìn)程中的正確實現(xiàn),需要restore_command腳本與數(shù)據(jù)復(fù)制程序協(xié)作。
PostgreSQLversion9.0開始,你可以使用流復(fù)制達(dá)到事半功倍的效果。 (請參閱Section 25.2.5)。