標籤:
執行完您的第一個即時恢複(PITR,Point-In-Time-Recovery),我們準備在一個真正的複製設定上工作。在本章,您將學會如何設定非同步複製和流。我們的目標是確保您可以實現更高的高可用和更高的資料安全性。
在本章,我們將討論以下主題:
• 配置非同步複製
• 理解流
• 合并流和歸檔
• 行政時間線
在本章的最後,您將很容易地在幾分鐘內設定流複製。
4.1 設定流複製
在前面章節中,我們已經從簡單的16MB XLOG檔案做了恢複。從邏輯上講,重放進程一次只能重放16MB。這在您的複製設定中會導致延遲,因為您必須等到master資料庫執行個體建立完16MB。在許多情況下,這種延遲是不能被接受的。
[丟掉了最後的XLOG檔案,該檔案尚未最後確定(並因此不發送歸檔,由於崩潰丟失),往往是為什麼人們報告在即時恢複(PITR,Point-In-Time-Recovery) 情況下資料丟失的核心原因。]
在這種情況下,流複製將解決您的問題。使用流複製,複製的延遲將是最小的,您可以享受保護您的資料的一些額外的水平。
讓我們來談談PostgreSQL流基礎設施的總體架構。顯示了基本的系統設計:
您已經看到了這種類型的架構。我們在這裡添加了流串連。它基本上是一個正常的資料庫連接,和您使用任何其它應用的串連一樣。唯一的區別是,在流串連的情況下,該串連處於一種能夠攜帶XLOG的特殊模式。
4.1.1 調整master伺服器上的設定檔
現在的問題是:如何才能使一個流串連存在?在前面的例子中已經做了大部分基礎設施。在master上,以下設定必須設定:
• wal_level 必須設定為 hot_standby
• max_wal_senders 必須設定為一個合理的較高的值來支援足夠多的slaves
[archive_mode和archive_command怎麼設定?很多人使用流複製儘可能地使他們的系統複製更多的資料到slave。除此之外,基於檔案的複製經常被使用來確保有一個額外的安全層。基本上,兩種機制使用相同的技術;在基於流和基于歸檔的恢複中只是XLOG源不同。]
既然master知道它應該產生足夠的XLOG,處理XLOG發送等,我們可以繼續下一個步驟。
出於安全的原因,您必須配置master能夠流複製串連。這需要改變pg_hba.conf正如前面章節所示。其次,這需要運行pg_basebackup和隨後的流串連。如果您正在使用傳統的方式做基礎備份,您還需要允許複製串連到串流XLOG,因此,這一步是必須的。
一旦您的master已經成功地配置了,您可以重新啟動資料庫(以使wal_level和max_wal_senders工作)並繼續在slave上工作。
4.1.2 處理pg_basebackup和recovery.conf
到現在,您已經看到那個進程絕對一致地執行正常的即時恢複(PITR,Point-In-Time-Recovery)。目前唯一不同的是wal_level,為了正常的即時恢複(PITR,Point-In-Time-Recovery)它必須配置不同的參數。這是相同的技術,沒有差別。
為了取得基礎備份庫我們使用pg_basebackup正如前面章節所示。下面是一個例子:
iMac:dbhs$ pg_basebackup -D /target_directory \
-h sample.postgresql-support.de\
--xlog-method=stream
既然我們已經做了一個基礎備份,我們現在可以去配置流了。要做到這一點,我們必須寫一個叫recovery.conf(就像之前)的檔案。下面是一個簡單的例子:
standby_mode = on
primary_conninfo= ‘ host=sample.postgresql-support.de port=5432 ‘
我們有兩個新的設定:
• standby_mode: 此設定將確保PostgreSQL一旦耗盡XLOG不會停止。相反,它會等待新的XLOG到達。要確保第二個伺服器作為standby此設定是必須的,standby持續重放XLOG。
• primary_conninfo: 此設定會告訴我們的slave哪裡可以找到master。您必須放置一個標準的 PostgreSQL串連串, (就像在 libpq中) primary_conninfo 作為核心告訴 PostgreSQL 來流傳送XLOG。
對於基本的設定,這兩個設定完全足夠了。現在我們所要做的啟動slave,就像您開始啟動一個正常的資料庫執行個體。
iMac:slavehs$ pg_ctl -D . start
server starting
LOG: database system was interrupted; last known up
at 2013-03-17 21:08:39 CET
LOG: creating missing WAL directory
"pg_XLOG/archive_status"
LOG: entering standby mode
LOG: streaming replication successfully connected
to primary
LOG: redo starts at 0/2000020
LOG: consistent recovery state reached at 0/3000000
資料庫執行個體已經成功啟動了。它檢測到正常的操作已經中斷。然後它進入standby模式,並開始從primary流傳輸XLOG。PostgreSQL然後到達一致狀態,並且該系統 準備行動。
4.1.3 使slave可讀
到目前為止,我們只設定了流傳輸。slave已經開始消耗來自master的交易記錄,但是它還不是可讀的。如果您嘗試串連到該執行個體,您將面臨如下情境:
iMac:slavehs$ psql -l
FATAL: the database system is starting up
psql: FATAL: the database system is starting up
這是預設配置。slave執行個體一直是備份模式並保持重放XLOG。
如果您想讓slave可讀,您必須在slave系統上適配postgresql.conf;hot_standby必須設定為on。您可以直接設定這個,但是您也可以在以後更改,當您需要這個特徵的時候,簡單地重啟slave執行個體。
iMac:slavehs$ pg_ctl -D . restart
waiting for server to shut down....
LOG: received smart shutdown request
FATAL: terminating walreceiver process due to administrator command
LOG: shutting down
LOG: database system is shut down
done
server stopped
server starting
LOG: database system was shut down in recovery at 2013-03-17 21:56:12
CET
LOG: entering standby mode
LOG: consistent recovery state reached at 0/3000578
LOG: redo starts at 0/30004E0
LOG: record with zero length at 0/3000578
LOG: database system is ready to accept read only connections
LOG: streaming replication successfully connected to primary
重啟將關閉伺服器,並啟動它再次備份。這不是太多的驚喜;然而,這值得看看日誌。您可以看到,一個叫walreceiver的進程被終止。
一旦我們做了備份並且運行,我們就可以串連到伺服器。從邏輯上講,我們只允許執行唯讀操作:
test=# CREATE TABLE x (id int4);
ERROR: cannot execute CREATE TABLE in a read-only transaction
正如預期的結果,伺服器將不接受寫入。記住,slave是唯讀。
4.1.4 底層協議
當使用流複製時,您應該注意兩個進程:
• wal_sender
• wal_receiver
wal_sender執行個體是提供XLOG給他們的slave上稱為wal_receiver進程的master執行個體上的進程。每個slave都有一個wal_receiver進程,並且這個進程恰好串連到資料來源的一個wal_sender進程。
整件事情內部是如何工作的呢?正如我們以前所說的,從slave到master的串連基本上是一個 正常的資料庫連接。交易記錄採用和COPY命令一樣的方法。COPY模式內部,PostgreSQL使用微語言來回地傳送資訊。主要的優勢是這種微語言有它自己的解析器,因此快速並且以相當容易,非侵入性的方式增加功能是可能的。到了PostgreSQL9.2,一下命令是支援的:
• IDENTIFY_SYSTEM
• START_REPLICATION <position>
• BASE_BACKUP
°° [LABEL ‘label‘]
°° [PROGRESS]
°° [FAST]
°° [WAL]
°° [NOWAIT]
您所看到的是和pg_basebackup提供的作為命令列標誌的協議等級。
PostgreSQL Replication之第四章 設定非同步複製(1)