postgresql 一主多從故障轉移
我的問題與以下主題中的問題相同
目前我正在使用 Postgresql 9.5,我有一台主伺服器和兩台從伺服器,在主伺服器崩潰並且其中一個從伺服器被分配為新主伺服器後,我想在沒有完整基礎備份的情況下更改另一個從伺服器的主伺服器。
我嘗試了答案中寫的步驟,但它似乎不起作用,有人可以指導我解決這個問題嗎?
我正在寫我的配置的一些細節,以防萬一。
standby_mode = on primary_conninfo = 'host=10.10.10.160 port=5432 user=repuser password=*****' restore_command = 'cp /archivedir/%f %p' trigger_file = '/tmp/postgresql.trigger.5432'
10.10.10.160 是新主伺服器的 IP 地址。
主伺服器和從伺服器中的文件夾似乎也是
/archivedir
空的,這正常嗎?以下設置存在於postgresql.conf
:wal_level = hot_standby archive_mode = on archive_command = 'test ! -f /archivedir/%f && cp %p /archivedir/%f' max_wal_senders = 3 hot_standby = on
我設法在 dezso 的幫助下解決了這個問題。
我為此使用了級聯複製。目前的架構就像 M -> S1 -> S2。
主:10.10.10.146,S1:10.10.10.130,s2:10:10:10:160,
首先,我使用以下命令在所有三個系統中創建了 repuser。
sudo -u postgres createuser -U postgres repuser -P -c 5 --replication
它會要求您分配密碼,輸入您喜歡的任何內容,然後將創建 reuser。我們將使用此使用者進行複制相關操作。
在主伺服器上,目前配置為:
postgresql.conf
listen_addresses = 'localhost, 10,10,10,146' wal_level = hot_standby archive_mode = on archive_command = 'test ! -f /here i wrote full directory starting from root/%f && cp %p /here i wrote full directory starting from root/%f' max_wal_senders = 3
pg_hba.conf
# Allow replication connections host replication repuser 10.10.10.130/32 md5 host replication repuser 10.10.10.160/32 md5 # IPv4 local connections: host all all 127.0.0.1/32 md5 host all all 0.0.0.0/0 md5 # IPv6 local connections: host all all ::1/128 md5
完成此配置後,重新啟動主伺服器。
現在我們需要從 master 到 S1 的完整備份。首先停止 S1 上的 postgresql 服務。然後刪除數據目錄(我的系統的目錄是 var/lib/pgsql/9.5/data)。刪除執行完整備份命令後:
sudo -u postgres pg_basebackup -h 10.10.10.146 -D /var/lib/pgsql/9.5/data -U repuser -v -P --xlog-method=stream
這會將數據文件夾複製到 S1 伺服器。現在在 S1 中打開 postgresql.conf,並進行以下更改
listen_addresses = 'localhost, 10,10,10,130' wal_level = hot_standby archive_mode = on archive_command = 'test ! -f /full directory starting from root/%f && cp %p /full directory starting from root/%f' max_wal_senders = 3 hot standby=on
打開 pg_hba.conf 並進行以下更改:
# Allow replication connections host replication repuser 10.10.10.160/32 md5 # IPv4 local connections: host all all 127.0.0.1/32 md5 host all all 0.0.0.0/0 md5 # IPv6 local connections: host all all ::1/128 md5
最後在 data 文件夾下創建一個 recovery.conf 文件。recovery.conf 應該是這樣的:
standby_mode=on primary_conninfo='host=10.10.10.146 port=5432 user=repuser password=password_of_repuser' trigger_file='/full directory starting from root/any_folder_name'
例如,如果您寫入
trigger_file = '/tmp/trigger_failover'
recovery.conf 文件,然後在 /tmp 目錄下創建一個名為 trigger_failover 的文件夾,S1 將啟動故障轉移過程並開始充當主伺服器。完成上述配置後,啟動 S1 伺服器,現在 M 和 S1 應該作為主從工作。接下來我們需要配置 S2 伺服器。步驟與配置 S1 幾乎相同。
首先停止 S2 上的 postgresql 服務。然後像我們在 S1 中所做的那樣刪除數據目錄。在我的情況下,S2 與 S1 具有相同的文件夾架構,因此數據文件夾也存在於 /var/lib/pgsql/9.5/data 目錄中。現在執行下面的命令,這次我們將從 S1 伺服器獲得完整備份。
sudo -u postgres pg_basebackup -h 10.10.10.30 -D /var/lib/pgsql/9.5/data -U repuser -v -P --xlog-method=stream
不,我們將更改 S2 中的配置文件。在 postgresql.conf 中進行以下更改:
listen_addresses = 'localhost, 10,10,10,160' wal_level = hot_standby archive_mode = on archive_command = 'test ! -f /full directory starting from root/%f && cp %p /full directory starting from root/%f' max_wal_senders = 3 hot standby=on
並在 recovery.conf 中進行以下更改:
standby_mode=on primary_conninfo='host=10.10.10.160 port=5432 user=repuser password=password_of_repuser' recovery_target_timeline='latest'
你已經完成了。現在在 S2 中啟動 postgresql 服務並查看複製機制在 M、S1 和 S2 中的工作情況。
通過這種架構:
- 如果 M 出現故障,您可以觸發 S1 並使其作為新的主伺服器工作,並且 S1 將與 S2 進行複制。
- 如果 S1 出現故障,您可以輕鬆地將 S2 指向 M,只需更改 S2
中 recovery.conf 文件中的 primary_conninfo 命令,您將
使用 M 和 S2 進行複制。
- 最後,如果 S2 出現故障,M 仍將與 S1 進行複制。