PgSQL 特性分析 備庫啟用過程分析

2021-09-23 19:21:32 字數 3820 閱讀 4313

postgresql standby 可以通過兩種方法來啟用成為主庫:

trigger file,配置在recovery.conf中。

pg_ctl promote傳送sigusr1訊號給postmaster程序。

同時,postgresql支援快速啟用(fast promote)和非快速啟用(fallback promote):

fast promote 開啟資料庫讀寫前,不需要做檢查點。而是推到開啟讀寫之後執行乙個checkpoint_force檢查點。

fallback_promote 在開啟資料庫讀寫前,需要先做乙個檢查點,現在這個模式已經不對使用者開放,需要修改**,只是用作除錯。

啟用資料庫的**分析如下:

啟用過程,根據fast_promote變數判斷是否需要先做檢查點,再啟用。

src/backend/access/transam/xlog.c

if (inrecovery)

}if (!fast_promoted) // 如果是fallback_promote模式,須先建立乙個檢查點,再開啟讀寫模式。

requestcheckpoint(checkpoint_end_of_recovery |

checkpoint_immediate |

checkpoint_wait);

}... inrecovery = false; // 開啟讀寫模式,允許接收使用者寫請求.

lwlockacquire(controlfilelock, lw_exclusive);

controlfile->state = db_in_production; // 改寫控制檔案的資料庫狀態

controlfile->time = (pg_time_t) time(null);

updatecontrolfile(); // 更新控制檔案

lwlockrelease(controlfilelock);

... if (fast_promoted) // 如果是快速promote,在允許使用者寫請求後,在這裡執行乙個檢查點。所以提高了資料庫的可用時間。

requestcheckpoint(checkpoint_force);

......

通過pg_ctl命令列工具,向postmaster發sigusr1訊號,通知它啟用資料庫。

首先會寫乙個promote檔案,告訴postmaster,是fast_promote。

src/bin/pg_ctl/pg_ctl.c

/* * promote

*/static

void

do_promote

(void)

print_msg(_("server promoting\n"));

}

資料恢復時,檢查standby是否收到promote請求或是否存在trigger檔案。

如果是promote請求,則檢查有沒有promote檔案,或者fallback_promote檔案,如果有promote檔案,則是fast_promote請求。如果有fallback_promote檔案,則不是fast_promote請求(實際上根本不可能檢測到fallback_promote檔案,因為沒有寫這個檔案的操作)。所以通過pg_ctl promote來啟用,一定是fast promote的,即不需要先做檢查點再啟用。

如果檢查到trigger檔案,同樣也是fast promote啟用模式。

src/backend/access/transam/xlog.c

#define promote_signal_file "promote"

#define fallback_promote_signal_file "fallback_promote"

/* * check to see whether the user-specified trigger file exists and whether a

* promote request has arrived. if either condition holds, return true.

*/static

bool

checkforstandbytrigger

(void)

else

if (stat(fallback_promote_signal_file, &stat_buf) == 0) // 否則再檢查fallback_promote檔案是否存在

ereport(log, (errmsg("received promote request")));

resetpromotetriggered();

triggered = true;

return

true;

}if (triggerfile == null) // 檢查recovery.conf是否配置了trigger_file

return

false;

if (stat(triggerfile, &stat_buf) == 0)

else

if (errno != enoent)

ereport(error,

(errcode_for_file_access(),

errmsg("could not stat trigger file \"%s\": %m",

triggerfile)));

return

false;

}src/backend/postmaster/startup.c

pqsignal

(sigusr2, startupproctriggerhandler)

; // 註冊sigusr2訊號處理函式

/* sigusr2: set flag to finish recovery */

static

void

startupproctriggerhandler

(signal_args)

bool

ispromotetriggered

(void)

postmaster收到siguser1訊號後,檢查是否收到promote訊號,判斷當前的狀態是否處於恢復中的任意狀態,然後向startup程序發乙個sigusr2的訊號,觸發promote。

src/backend/postmaster/postmaster.c

pqsignal

(sigusr1, sigusr1_handler)

; /* message from child process */

// 註冊sigusr1訊號處理函式

/* * sigusr1_handler - handle signal conditions from child processes

*/static

void

sigusr1_handler

(signal_args)

......

src/backend/access/transam/xlog.c

/* * check to see if a promote request has arrived. should be

* called by postmaster after receiving sigusr1.

*/bool

checkpromotesignal

(void)

最後提一點, 9.3以前,曾經出現過pg_ctl promote -m 來指定是否需要fast promote或者fallback promote。

MapX特性分析

mapx是mapinfo公司向使用者提供的具有強大地圖分析功能的activex控制項產品。由於它是一種基於windows作業系統的標準控制項,因而能支 持絕大多數標準的視覺化開發環境如visual c visual basic delphi powerbuilder等。利用mapx,程式設計人員可以...

C 語言特性效能分析

c 語言特性效能分析 c 語言特性引起效能方面的問題主要有 1 缺頁 涉及記憶體分配 2 從堆中動態申請和釋放記憶體 3 複雜物件的建立和銷毀 4 函式呼叫開銷 動態例子 object obj new object delete obj 繼續使用 指標obj是乙個區域性變數,在棧中分配。delete...

MySQL 特性分析 MyRocks簡介

rocksdb是facebook基於leveldb實現的,目前為facebook內部大量業務提供服務。經過facebook大量工作,將rocksdb作為mysql的乙個儲存引擎移植到mysql,稱之為myrocks。經過兩年的發展,myrocks已經比較成熟 rc階段 現已進入了facebook m...