讓掛掉節點重新上線
承2.1,若想讓原先掛掉的master(node1)重新加回cluster並回復Streaming Replication,由於master角色早已轉移到node2,此時要做的是讓node1以slave身份加進cluster之中。
但在node1離線已久的情況下,node2以master身份接手所寫入的資料,Streaming Replication因為WAL被複寫,早已無法銜接,此時node1需要重新自master clone整個DB資料過來後再設定replication,假如環境是有大量資料的集中式資料庫,整個作業過程將曠日費時,沒事建議不要隨便把standby promote成master。
Postgresql9.5後提供之pgrewind可幫忙比對角色轉移後、節點之間的WAL差異,僅處理角色轉移後的資料差異並重寫transation log的Timeline,如此便不用重新複製整個master資料後再接上replication。repmgr在switchover上的操作也是透過pg_rewind來進行,但使用pg_rewind過程非常複雜,強烈建議使用repmgr幫忙達成該工作。
若有維護需求,需要將master, slave身份互換,請透過2.3所介紹的switchover來進行。以下將介紹如何在master在轉移走的情況下,將原本掛掉的節點加回cluster中。
[目前master-node2]
查看repmgr狀態,node1仍是inactive狀態
repmgr=# SELECT * FROM repmgr_dbc.repl_nodes ORDER BY id;
id | type | upstream_node_id | cluster | name | conninfo | slot_name | priority | active
----+--------+------------------+---------+-------+-----------------------------------------------+---------------+----------+--------
1 | master | | dbc | node1 | host=192.168.252.50 user=repmgr dbname=repmgr | repmgr_slot_1 | 100 | f
2 | master | | dbc | node2 | host=192.168.252.51 user=repmgr dbname=repmgr | repmgr_slot_2 | 100 | t
(2 rows)
因為master早已轉移到node2上,儘管node1恢復連線,也早已無法接回Streaming Replication,實際上和盲腸無異,這邊需要手動將其自repl_nodes中移除:
repmgr=# DELETE FROM repmgr_dbc.repl_nodes WHERE name = 'node1';
[原master-node1]
該節點早已變成盲腸,需要將postgresql服務停止、手動移除整個DB資料後再重新自現任master重新clone資料
user@node1 ~$ sudo service postgresql stop
postgres@node1:~$ rm -rf /var/lib/postgresql/10/main
postgres@node1:~$ repmgr -h node2-IP -U repmgr -d repmgr -D /var/lib/postgresql/10/main standby clone
NOTICE: destination directory '/var/lib/postgresql/10/main' provided
NOTICE: starting backup (using pg_basebackup)...
HINT: this may take some time; consider using the -c/--fast-checkpoint option
NOTICE: standby clone (using pg_basebackup) complete
NOTICE: you can now start your PostgreSQL server
HINT: for example : pg_ctl -D /var/lib/postgresql/10/main start
HINT: After starting the server, you need to register this standby with "repmgr standby register"
user@node1 ~$ sudo service postgresql start
clone完後,將node1註冊為standby
postgres@node1 ~$ repmgr standby register
查看cluster狀態,確認node1是否以stnadby身份加回cluster
postgres@node1:/home/tw_it$ repmgr cluster show
Role | Name | Upstream | Connection String
----------+-------|----------|----------------------------------------------
* master | node2 | | host=192.168.252.51 user=repmgr dbname=repmgr
standby | node1 | node2 | host=192.168.252.50 user=repmgr dbname=repmgr