Polardb資料庫掛庫後,如何恢復主備關係

jaymarco發表於2020-11-11

一、前言

Polardb-O 主從高可用模式會出現主庫節點主機或是網路卡故障等問題,只要主從發生切換,備庫節點切換成新主庫,而老主庫主機重啟恢復後,無法自動切換成新備庫,甚至影響較大出現主備這間流複製關係失效。因此出現備庫恢復失敗問題,需要全量重建備庫和流複製建立。

二、環境資訊

2.1 主機資訊

Polardb-O 資料庫

實際地址IP

資料庫架構

異常節點

Polardb-O 叢集

192.168.58.130

原主庫

down機

192.168.58.131

原備庫

變成新主庫


192.168.58.129

VIP

/

叢集管理軟體

192.168.58.132

/

/

2.2 架構圖

三、備庫恢復過程

當主庫因主機或是網路卡其中某中原因要對主庫進行重啟恢復,此時CM 會自動觸發主從切換,自然備庫被切換成新主庫,而老主庫重啟後需要恢復成新備庫,但測試驗證後,發現老主庫主機重啟恢復後,無法恢復成備庫。只能通過手工重建方式來恢復備庫。

3.1、新備庫恢復過程

1、   清除新備庫檔案系統環境

# 刪除本地配置目錄

sudo rm -rf $PGDATA

# 清理 PFS 檔案系統中資料

sudo pfs -C disk rm   -r /sdb/pgdata

# 建立資料目錄

pfs -C disk mkdir   /sdb/polar_data

2、   主庫同步資料到備庫

使用主庫資料目錄和PFS 初始化備庫資料目錄(在新備庫使用polardb 登入)

polar_basebackup -h   192.168.58.131  -p5432 -U replicator -D   $PGDATA --polardata=$PFSDIR --polar_storage_cluster_name=disk   --polar_disk_name=$PFSDISK --polar_host_id=2 -X stream --progress   --write-recovery-conf -v


ls -lrt $PGDATA

-rw------- 1 polardb polardb  216 Oct 11 10:16 backup_label.old

drwx------ 8 polardb polardb   74 Oct 11 10:16 base

drwx------ 2 polardb polardb    6 Oct 11 10:16 pg_snapshots

drwx------ 2 polardb polardb    6 Oct 11 10:16 pg_serial

drwx------ 4 polardb polardb   34 Oct 11 10:16 pg_multixact

-rw------- 1 polardb polardb 1636 Oct 11 10:16 pg_ident.conf

-rw------- 1 polardb polardb 4513 Oct 11 10:16 pg_hba.conf

drwx------ 2 polardb polardb    6 Oct 11 10:16 pg_dynshmem

-rw------- 1 polardb polardb   88 Oct 11 10:16 postgresql.auto.conf

drwx------ 2 polardb polardb    6 Oct 11 10:16 polar_rel_size_cache

drwx------ 2 polardb polardb   27 Oct 11 10:16 polar_fullpage

-rw------- 1 polardb polardb    3 Oct 11 10:16 PG_VERSION

drwx------ 2 polardb polardb    6 Oct 11 10:16 pg_tblspc

drwx------ 2 polardb polardb    6 Oct 11 10:16 pg_stat

-rw------- 1 polardb polardb 7478 Oct 11 10:16 postgresql.conf

drwx------ 2 polardb polardb    6 Oct 11 10:16 dbms_pipe

-rw------- 1 polardb polardb  168 Oct 11 10:16 polar_node_static.conf

drwx------ 2 polardb polardb    6 Oct 11 10:16 pg_commit_ts

drwx------ 2 polardb polardb    6 Oct 11 10:16 pg_csnlog

drwx------ 2 polardb polardb   17 Oct 11 10:16 pg_notify

-rw------- 1 polardb polardb   49 Oct 11 10:16 postmaster.opts

drwx------ 2 polardb polardb  142 Oct 11 10:16 polardb_log

-rw------- 1 polardb polardb  178 Oct 11 10:16 current_logfiles

drwx------ 2 polardb polardb   17 Oct 11 10:16 pg_xact

drwx------ 2 polardb polardb    6 Oct 11 10:16 polar_cache_trash

-rw------- 1 polardb polardb   82 Oct 11 10:16 postmaster.pid

drwx------ 2 polardb polardb 4096 Oct 11 10:16 global

drwx------ 2 polardb polardb   17 Oct 11 10:16 pg_subtrans

drwx------ 2 polardb polardb    6 Oct 11 10:16 pg_replslot

drwx------ 4 polardb polardb   65 Oct 11 10:16 pg_logical

drwx------ 2 polardb polardb  135 Oct 11 10:16 pg_stat_tmp


可以看到備庫上面的檔案已經從主庫同步過來。

注意:主備庫的host_id 不能一致,否則會影響備庫資料同步。

 3、   啟動和檢查備庫節點

啟動與檢查備節點可驗證資料庫是否連線成功。具體操作如下:

pg_ctl -c start -D $PGDATA

waiting for server to start....

        38650                           2020-10-11 02:26:59 UTC 00000                                           LOG:  polar_vfs loaded in postmaster 38650


        38650                           2020-10-11 02:26:59 UTC 00000                                           LOG:  listening on IPv4 address "0.0.0.0", port 5432


        38650                           2020-10-11 02:26:59 UTC 00000                                           LOG:  listening on IPv6 address "::", port 5432

.........................

>>>>>>>>>>>>>>>>>>>>>>>中間省略部分日誌資訊<<<<<<<<<<<<<<<<<<<<<<<<< 

.........................

        38650                           2020-10-11 02:27:02 UTC 00000                                           LOG:  removing file "pg_notify/0000"

        38650                           2020-10-11 02:27:02 UTC 00000                                           LOG:  vfs_unlink pg_notify/0000

        38650                           2020-10-11 02:27:02 UTC 00000                                           LOG:  forked new process, pid is 38665, true pid is 38665

        38650                           2020-10-11 02:27:02 UTC 00000                                           LOG:  redirecting log output to logging collector process

        38650                           2020-10-11 02:27:02 UTC 00000                                           HINT:  Future log output will appear in directory "polardb_log".

... done

server started

psql -h$PGDATA   -p$PGPORT

polardb=# select sysdate from dual;

      sysdate       

--------------------

 11-OCT-20 02:27:57

(1 row)

如果能連通,則證明資料庫安裝成功,並且啟動成功。

 3.2、 CM 管理軟體

為了保障主從能正常切換,需要在CM 中將異常備庫清除掉,以免後面加入新備庫時出現衝突。

curl -H "Content-Type:application/json" -X POST --data   "{\"user\":\"polardb\",\"dataPath\":\"/app/polardb_ data\",\"ip\":\" 192.168.58.130 \",\"port\":\"5432\",\"type\":\"Standby\",\"storage_type\":\"local_ssd\",\"sync\":\"SYNC\"}"   http://127.0.0.1:5000/v1/remove_ins


curl -H ""Content-Type:application/json""   http://127.0.0.1:5000/v1/status?type=visual                       

[polardb@polardb04 ~]$ curl -H "Content-Type:application/json" http://127.0.0.1:5000/v1/status?type=visual                                                   

{

        "phase": "RunningPhase",

        "master": {

                "endpoint": " 192.168.58.131:5432",

                "data_path": "/app/polardb_data",

                "user": "polardb",

                "phase": "RUNNING",

                "start_at": "2020-10-11 10:15:16",

                "sync_status": "SYNC"

        },

        "vip": [

                {

                        "vip": "192.168.58.129",

                        "interface": "team0",

                        "mask": "255.255.255.0",

                        "endpoint": "192.168.58.131:5432"

                }

 

將原來當機主庫恢復成備庫並將備節點使用CM 管理軟體加入polardb叢集。

curl -H " Content-Type:application/json"   -X POST --data   "{\"user\":\"polardb\",\"dataPath\":\"/app/polardb_data\",\"ip\":\" 192.168.58.130 \",\"port\":\"5432\",\"type\":\"Standby\",\"storage_type\":\"local_ssd\",\"sync\":\"SYNC\"}"   http://127.0.0.1:5000/v1/add_ins

3.3、   主備庫流複製狀態

1 、叢集環境檢查

curl -H ""Content-Type:application/json""   http://127.0.0.1:5000/v1/status?type=visual                                                        

{

        "phase": "RunningPhase",

        "master": {

                "endpoint": " 192.168.58.131:5432",

                "data_path": "/app/polardb_data",

                "user": "polardb",

                "phase": "RUNNING",

                "start_at": "2020-10-11 10:15:16",

                "sync_status": "SYNC"

        },

        "standby": [

                {

                        "endpoint": " 192.168.58.130:5432",

                        "data_path": "/app/polardb_data",

                        "user": "polardb",

                        "phase": "RUNNING",

                        "start_at": "2020-10-11 10:27:17",

                        "sync_status": "SYNC"

                }

        ],

        "vip": [

                {

                        "vip": " 192.168.58.129",

                        "interface": "team0",

                        "mask": "255.255.255.0",

                        "endpoint": " 192.168.58.131:5432"

                }

                   

 2 、檢查主庫流複製程式

ps -ef   |grep wal # 主庫 – walwriter

ps -ef |grep wal # 備庫 – walreceiver

 3 、檢查主備庫讀寫模式

[polardb@polardb02 app]$ psql -h$PGDATA -p$PGPORT -c "show transaction_read_only";

 transaction_read_only 

-----------------------

 off


 [polardb@polardb01 local]$  psql -h$PGDATA -p$PGPORT -c "show transaction_read_only";

 transaction_read_only 

-----------------------

 on

注意:主庫狀態: off, 備庫: on

  4 、主庫檢視複製狀態

polardb=# select * from pg_stat_replication ;

-[ RECORD 1 ]----+---------------------------------

pid              | 41023

usesysid         | 356380346

usename          | repuser

application_name | standby_184492244_5432

client_addr      | 192.168.58.130

client_hostname  | 

client_port      | 60751

backend_start    | 11-OCT-20 10:52:43.643961 +08:00

backend_xmin     | 

state            | streaming

sent_lsn         | 7E/80001518

write_lsn        | 7E/80001518

flush_lsn        | 7E/80001518

replay_lsn       | 7E/80001518

write_lag        | 00:00:00.000503

flush_lag        | 00:00:00.000515

replay_lag       | 00:00:00.000724

sync_priority    | 2

sync_state       | sync


以上主從同步複製狀態正常。

5、   測試資料同步是否正常

在主庫建立一個表,看備庫是否存在 , 如果存在說明資料同步正常。

# 主庫

ztdb=#

ztdb=# create table zttab_sync_test01(id int ,name char(20));

CREATE TABLE

ztdb=#

ztdb=# insert into zttab_sync_test01 values(1,'alan'),(2,'jinxu');

INSERT 0 2

ztdb=#

ztdb=# select * from zttab_sync_test01;

 id |         name        

----+----------------------

  1 | alan               

  2 | jinxu              

 

# 備庫

ztdb=#

ztdb=# select * from  zttab_sync_test01;

 id |         name        

----+----------------------

  1 | alan               

  2 | jinxu   


測試主庫建立一張表並插入幾條資料,備庫也正常同步過來。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28833846/viewspace-2733515/,如需轉載,請註明出處,否則將追究法律責任。

相關文章