?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
連續(xù)歸檔可以配合隨時(shí)準(zhǔn)備取代失效主服務(wù)器的一個(gè)或多個(gè)備份服務(wù)器,用于創(chuàng)建一個(gè)高可用性(HA)集群。 這個(gè)能力通常被稱為熱備份或日志傳送(LogShipping)。
雖然主服務(wù)器和備份服務(wù)器只是松散的耦合在一起,但它們必須同時(shí)運(yùn)行。 主服務(wù)器以連續(xù)歸檔模式運(yùn)行,備份服務(wù)器以連續(xù)恢復(fù)模式運(yùn)行并從主服務(wù)器不停的讀取WAL文件。 因?yàn)閿?shù)據(jù)庫的表無需為此進(jìn)行任何改變,所以與其它復(fù)制方法相比,額外的管理開銷很小。 并且這種方法對主服務(wù)器的性能影響也很小。
直接移動WAL或在數(shù)據(jù)庫服務(wù)器之間"傳送"日志記錄通常被稱為日志傳送(LogShipping)。 PostgreSQL實(shí)現(xiàn)了基于文件的日志傳送,意思是WAL記錄每次移動一個(gè)完整的文件(WAL段)。 WAL文件可以被輕易的在任意兩個(gè)地點(diǎn)之間傳送,不管是與鄰近的系統(tǒng)還是地球另一面的系統(tǒng)。 所需帶寬取決于主服務(wù)器的事務(wù)發(fā)生速度。 基于記錄的日志傳送也可以通過Section 25.2.5中討論的自定義過程實(shí)現(xiàn)。
日志傳送是異步的,也就是WAL記錄在事務(wù)提交之后才被傳送。 也就是說主服務(wù)器遭遇致命故障后尚未傳送的事務(wù)數(shù)據(jù)將會丟失。 數(shù)據(jù)丟失的長度可以使用archive_timeout加以限制,比如限制為幾秒鐘。 當(dāng)然這么小的設(shè)置也導(dǎo)致了傳送帶寬的大幅增長。 如果你期望將丟失的數(shù)據(jù)限制在一分鐘之內(nèi),可能更好的辦法是使用基于記錄的日志傳送。 參考Section 25.2.5。
因?yàn)椴煌5膱?zhí)行恢復(fù)過程,備份服務(wù)器在通常情況下是不能被訪問的。 由于恢復(fù)速度非??欤瑐浞莘?wù)器通常在啟用后只有很短的時(shí)間不能使用。 因此,我們認(rèn)為這個(gè)方案可以作為熱備份來提供高可用性。 將服務(wù)器從一個(gè)已歸檔的基礎(chǔ)備份中恢復(fù)將可能耗費(fèi)大量時(shí)間,所以這個(gè)方案只能用于災(zāi)難恢復(fù)而不能用于提供高可用性。
至少從數(shù)據(jù)庫服務(wù)器的角度看,創(chuàng)建主服務(wù)器和備份服務(wù)器并令兩者盡可能完全相同是非常明智的。 特別是表空間的路徑名必須保持完全一致,這樣主服務(wù)器和備份服務(wù)器就必須擁有同樣的表空間掛載路徑(如果使用了表空間的話)。 需要記住的是如果在主服務(wù)器上執(zhí)行了CREATE TABLESPACE命令, 那么該命令需要的任何新掛載點(diǎn)必須在執(zhí)行該命令之前同時(shí)在主服務(wù)器和備份服務(wù)器上創(chuàng)建。 硬件不必完全相同,但是經(jīng)驗(yàn)顯示維護(hù)兩個(gè)完全相同的系統(tǒng)比維護(hù)兩個(gè)不同的系統(tǒng)要少許多麻煩。 無論如何,應(yīng)盡量保持體系結(jié)構(gòu)相同,比如一個(gè)是32-bit系統(tǒng)另一個(gè)是64-bit系統(tǒng)將不能正常工作。
通常,在主版本不同的服務(wù)器之間傳送日志是不可能的,但是次版本不同是可以的,因?yàn)樗鼈兊拇疟P格式相同, 不過我們鼓勵你盡可能使用完全相同的版本。 在進(jìn)行版本升級的時(shí)候,正確的做法是首先升級備份服務(wù)器, 因?yàn)樾掳姹镜姆?wù)器通??梢宰x取老版本的WAL文件,但反之則不然
在備用模式,該服務(wù)器連續(xù)應(yīng)用從主服務(wù)器收取的WAL。備服務(wù)器可以從一個(gè)WAL歸檔(參閱restore_command)或 直接通過一個(gè)TCP連接(流復(fù)制)從主服務(wù)器上讀取WAL。備服務(wù)器也可以在備用集群pg_xlog嘗試查找恢復(fù)任何WAL。 這通常發(fā)生在服務(wù)器重啟后,當(dāng)備服務(wù)器重播,在備服務(wù)器重啟前,從主服務(wù)器流復(fù)制的WAL,但是你也可以手工復(fù)制文件到pg_xlog, 在任何時(shí)候可以重播它們。
在啟動,備服務(wù)器恢復(fù)可用在所有的WAL開始存檔位置,調(diào)用restore_command。 一旦它到達(dá)可用WAL的結(jié)束,restore_command失敗,將嘗試恢復(fù)pg_xlog目錄下任何可用的WAL。 如果那也失敗了,并且已經(jīng)配置了流復(fù)制,則嘗試連接到主服務(wù)器,從在歸檔或pg_xlog找到最后一條有效的記錄開始WAL流。 如果那也失敗了,或沒有配置流復(fù)制,或連接斷開,備服務(wù)器再次回到步驟1,循環(huán)嘗試從歸檔里恢復(fù)文件。從歸檔,pg_xlog, 通過連續(xù)流復(fù)制直到服務(wù)器停止或有觸發(fā)器文件觸發(fā)的失效切換時(shí)。
當(dāng)找到一個(gè)觸發(fā)文件(trigger_file)時(shí),退出備用模式并且服務(wù)器切換到正常運(yùn)行。在失效切換前,將立即恢復(fù)歸檔或pg_xlog 任何可用的WAL,但不做嘗試連接主服務(wù)器。
在主服務(wù)器上設(shè)置連續(xù)歸檔到一個(gè)備服務(wù)器可訪問的存檔目錄,像描述在Section 24.3。 即使主服務(wù)器關(guān)掉,從備服務(wù)器應(yīng)該可以訪問這個(gè)歸檔位置。即它應(yīng)該駐留在被服務(wù)器自身或其它可信賴的服務(wù)器,而不是主服務(wù)器。
如果你想使用流復(fù)制,在主服務(wù)器上設(shè)置認(rèn)證,允許從備用服務(wù)器復(fù)制連接; 在pg_hba.conf提供一個(gè)或多個(gè)合適項(xiàng)使用數(shù)據(jù)庫字段設(shè)置replication。 還要在主服務(wù)器的配置文件確保設(shè)置max_wal_senders足夠大。
啟動備用服務(wù)器做一個(gè)基準(zhǔn)備份,描述在Section 24.3.2.
要建立備用服務(wù)器,從主服務(wù)器恢復(fù)基準(zhǔn)備份(參閱Section 24.3.3)。 在備用服務(wù)器的集群數(shù)據(jù)目錄,創(chuàng)建一個(gè)恢復(fù)命令文件recovery.conf,開啟standby_mode。 設(shè)置restore_command為一條從WAL歸檔復(fù)制文件的簡單命令。
Note: 不要使用內(nèi)置在這里描述的備用模式pg_standby或類似的工具。如果該文件不存在,restore_command應(yīng)該立即返回。 如果必要服務(wù)器將再次嘗試這個(gè)命令。參閱Section 25.4關(guān)于使用工具像pg_standby。
如果你想使用流復(fù)制,在primary_conninfo填寫一個(gè)libpq連接串,其包括主機(jī)名(或IP地址)和連接到主服務(wù)器需要的其它詳細(xì)信息。 如果主服務(wù)器需要個(gè)密碼驗(yàn)證,也要在primary_conninfo指定所需要的密碼。
如果你要建立高可用目的備服務(wù)器,設(shè)置WAL歸檔,像主服務(wù)器的連接和身份驗(yàn)證,因?yàn)樵谑袚Q后,備服務(wù)器要作為主服務(wù)器運(yùn)行。 你還需要設(shè)置trigger_file它可能失效切換。如果你建立報(bào)告目的備服務(wù)器,沒有規(guī)劃失效切換到它,不必須要trigger_file。
如果你使用WAL歸檔,其大小可以使用archive_cleanup_command 這個(gè)參數(shù)設(shè)置最小,用來刪除那些備服務(wù)器不再需要的文件。專門設(shè)計(jì)的pg_archivecleanup 這個(gè)實(shí)用程序就是在通常的單備配置里,使用archive_cleanup_command的。 請注意不過,如果你使用備份目的歸檔,你仍要保留需要恢復(fù)的至少最新的基準(zhǔn)備份文件,即使備服務(wù)器不再需要。
recovery.conf一個(gè)簡單例子是:
standby_mode='on' primary_conninfo='host=192.168.1.50port=5432user=foopassword=foopass' restore_command='cp/path/to/archive/%f%p' trigger_file='/path/to/trigger_file' archive_cleanup_command='pg_archivecleanup/path/to/archive%r'
你可能有任何數(shù)目的備服務(wù)器,但是如果你用流復(fù)制,確保你在主服務(wù)器上設(shè)置的max_wal_senders足夠大允許它們同時(shí)連接。
與基于文件日志傳送相比,流復(fù)制允許保持備服務(wù)器更新。 備服務(wù)器連接主服務(wù)器,其產(chǎn)生的流WAL記錄到備服務(wù)器,而不需要等待填寫WAL文件。
流復(fù)制是異步的,所以在主事務(wù)提交和變化成為在備服務(wù)器可見之間,還有一個(gè)小的延遲。 這個(gè)延遲遠(yuǎn)小于基于文件日志傳送,通常1秒內(nèi)足夠與負(fù)載保持。使用流復(fù)制,為減少數(shù)據(jù)丟失窗口 archive_timeout不是必要的。
如果使用流復(fù)制而不是基于文件連續(xù)歸檔,你要在主服務(wù)器設(shè)置wal_keep_segments為 一個(gè)足夠大的值以使不太早的回收舊WAL段,當(dāng)備服務(wù)器可能仍需要它們趕上。如果備服務(wù)器落后太多, 需要用一個(gè)新基準(zhǔn)備份重新初始化。如果你設(shè)置一個(gè)備服務(wù)器可訪問的WAL歸檔,wal_keep_segments是不必要的, 作為備服務(wù)器總是使用歸檔來趕上。
要使用流復(fù)制,建立一個(gè)基于文件的日志傳送備服務(wù)器描述在Section 25.2。 該步將一個(gè)基于文件的日志傳送備服務(wù)器轉(zhuǎn)為流復(fù)制備服務(wù)器,在recovery.conf文件中設(shè)置primary_conninfo 指向主服務(wù)器。在主服務(wù)器上設(shè)置listen_addresses和身份驗(yàn)證選項(xiàng)(見pg_hba.conf),因此備用服務(wù)器 可以連接到在主服務(wù)器的replication偽數(shù)據(jù)庫(參閱Section 25.2.5.1)。
在系統(tǒng)上支持保持活動的的套接字選項(xiàng),設(shè)置tcp_keepalives_ idle, tcp_keepalives_interval和tcp_keepalives_count幫助主機(jī)及時(shí)發(fā)現(xiàn)斷開的連接。
設(shè)置備用服務(wù)器的最大并發(fā)連接數(shù)。(參閱max_wal_senders關(guān)于詳細(xì)信息)。
當(dāng)啟動了備服務(wù)器并且正確設(shè)置了primary_conninfo,該備服務(wù)器在回放所有可用的WAL文件后,將連接到主服務(wù)器。 如果成功建立了該連接,你將在備服務(wù)器中看到WAL接收進(jìn)程,并且在主服務(wù)器相應(yīng)的一個(gè)WAL發(fā)送進(jìn)程。
復(fù)制的訪問權(quán)限設(shè)置是很重要的,所以只有受信任的用戶可以讀取WAL流,因?yàn)楹苋菀讖闹刑崛?quán)限信息。 備服務(wù)器必須驗(yàn)證作為主服務(wù)器的超級用戶。所以需要在主服務(wù)器上創(chuàng)建一個(gè)有SUPERUSER和LOGIN權(quán)限的角色。
由一條pg_hba.conf記錄指定replication在database字段,控制客戶端的復(fù)制驗(yàn)證。 例如,如果備服務(wù)器是運(yùn)行在主機(jī)IP192.168.1.100和復(fù)制時(shí)超級用戶名為foo,管理員可以在主服務(wù)器 pg_hba.conf文件里添加下面行:
#Allowtheuser"foo"fromhost192.168.1.100toconnecttotheprimary #asareplicationstandbyiftheuser'spasswordiscorrectlysupplied. # #TYPEDATABASEUSERCIDR-ADDRESSMETHOD hostreplicationfoo192.168.1.100/32md5
主服務(wù)器的主機(jī)名和端口號,連接用戶名,和在recovery.conf文件指定的密碼。 該密碼也可以在備服務(wù)器的~/.pgpass文件里設(shè)置。 (在database字段指定replication)。 例如,如果主服務(wù)器是運(yùn)行的主機(jī)IP192.168.1.50,端口號5432, 復(fù)制時(shí)超管用戶名為foo,和密碼為foopass,管理員可以在備服務(wù)的recovery.conf文件里 添加下面行:
#Thestandbyconnectstotheprimarythatisrunningonhost192.168.1.50 #andport5432astheuser"foo"whosepasswordis"foopass". primary_conninfo='host=192.168.1.50port=5432user=foopassword=foopass'
流復(fù)制的一個(gè)重要的健康指標(biāo)是在主服務(wù)器生成的WAL記錄數(shù),而不是在備服務(wù)器應(yīng)用的數(shù)量。
通過比較在主服務(wù)器當(dāng)前WAL寫的位置和備服務(wù)器收到的最后一個(gè)WAL位置,就可以計(jì)算出這種滯后。
在主服務(wù)器上使用pg_current_xlog_location
和在備服務(wù)器上使用pg_last_xlog_receive_location
可以分別檢索到它們(參閱Table 9-56和Table 9-57關(guān)于詳細(xì)信息)。
在備服務(wù)器收到最后的WAL位置也會進(jìn)程狀態(tài)的WAL接收進(jìn)程顯示,使用ps命令顯示(參閱Section 27.1關(guān)于詳細(xì)信息)。