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...