讓掛掉節點重新上線

承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

results matching ""

    No results matching ""