Postgresql

postgresql 一主多從故障轉移

  • July 20, 2018

我的問題與以下主題中的問題相同

流複製故障轉移 - 如何將第二個從站指向新的主站?

目前我正在使用 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 進行複制。

引用自:https://dba.stackexchange.com/questions/146382