新聞中心
PostgreSQL在shutdown時(shí)會(huì)進(jìn)行checkpoint。其流程如下。
1、在主進(jìn)程中,會(huì)首先注冊(cè)一個(gè)信號(hào)處理函數(shù)reaper,用于向checkpoint等子進(jìn)程發(fā)送信號(hào)。向checkpoint進(jìn)程發(fā)送SIGUSR2信號(hào)
PostmasterMain(int argc, char argv[])
pqsignal_no_restart(SIGCHLD, reaper); / handle child termination */
reaper:
while ((pid = waitpid(-1, &exitstatus, WNOHANG)) > 0){
...
if (pid == CheckpointerPID){
...
SignalChildren(SIGUSR2);
}
...
}
...
PostmasterStateMachine();//向checkpoint進(jìn)程發(fā)送SIGUSR2信號(hào)
|-----------------------
| if (pmState == PM_WAIT_BACKENDS){
| if (CountChildren(BACKEND_TYPE_NORMAL | BACKEND_TYPE_WORKER) == 0 &&
| StartupPID == 0 &&
| WalReceiverPID == 0 &&
| BgWriterPID == 0 &&
| (CheckpointerPID == 0 ||(!FatalError && Shutdown < ImmediateShutdown)) &&
| WalWriterPID == 0 &&
| AutoVacPID == 0){
| //pg_ctl stop -m immediate不會(huì)向checkpoint進(jìn)程發(fā)送信號(hào),即不會(huì)做checkpoint
| if (Shutdown >= ImmediateShutdown || FatalError){
| pmState = PM_WAIT_DEAD_END;
| }else{
| if (CheckpointerPID != 0){
| signal_child(CheckpointerPID, SIGUSR2);
| pmState = PM_SHUTDOWN;
| }
}
| }
|-------}
2、checkpoint進(jìn)程,也會(huì)注冊(cè)一個(gè)信號(hào)處理函數(shù)ReqShutdownHandler,用于處理主進(jìn)程發(fā)送過來的SIGUSR2信號(hào)。接收到該信號(hào)后將shutdown_requested置為TRUE。在checkpoint進(jìn)程的for循環(huán)中,如果shutdown_requested為TRUE,則進(jìn)入shutdown流程:stop每個(gè)sender進(jìn)程,所有sender進(jìn)程stop后,根據(jù)條件進(jìn)行checkpoint:CreateRestartPoint后者CreateCheckPoint
CheckpointerMain(void)->
//為信號(hào)SIGUSR2安裝信號(hào)處理函數(shù)ReqShutdownHandler
pqsignal(SIGUSR2, ReqShutdownHandler); / request shutdown/
...
for (;;){
if (shutdown_requested){
/ Close down the database/
ShutdownXLOG(0, 0);
|-- WalSndInitStopping();//向每個(gè)sender進(jìn)程發(fā)送信號(hào)修改到stopping狀態(tài)
| WalSndWaitStopping();
| if (RecoveryInProgress())
| CreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
| else{
| if (XLogArchivingActive() && XLogArchiveCommandSet())
| RequestXLogSwitch(false);
| CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
| }
|-- ...
proc_exit(0);
}
...
checkpoint
}
3、ReqShutdownHandler函數(shù)將shutdown_requested置為TRUE
ReqShutdownHandler(SIGNAL_ARGS)
{
shutdown_requested = true;
SetLatch(MyLatch);
}
?
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享題目:PostgreSQLcheckpoint--shutdown-創(chuàng)新互聯(lián)
當(dāng)前URL:http://fisionsoft.com.cn/article/dpodcs.html