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