日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

只讀節點Online Promote

只讀節點Online Promote機制是PolarDB PostgreSQL版將只讀備庫節點提升為主庫節點的一種Promote能力。

前提條件

支持的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 14(內核小版本14.5.1.0及以上)

  • PostgreSQL 11(內核小版本1.1.1及以上)

說明

您可通過如下語句查看PolarDB PostgreSQL版的內核小版本的版本號:

  • PostgreSQL 14

    select version();
  • PostgreSQL 11

    show polar_version;

背景信息

PolarDB PostgreSQL版是基于共享存儲的一寫多讀架構,與傳統數據庫的主備架構有以下不同:

  • Standby節點:是傳統數據庫的備庫節點,有獨立的存儲,與主庫節點之間通過傳輸完整的WAL日志來同步數據。

  • 只讀節點:Replica節點,是PolarDB PostgreSQL版的只讀備庫節點,與主節點共享同一份存儲,與主庫節點之間通過傳輸WAL Meta日志信息來同步數據。

傳統數據庫支持Standby節點升級為主庫節點的Promote操作,在不重啟的情況下,提升備庫節點為主庫節點,可以繼續提供讀寫服務,保證了集群高可用的同時,也有效降低了實例的恢復時間RTO。

PolarDB PostgreSQL版同樣需要只讀備庫節點提升為主庫節點的Promote能力,鑒于只讀節點與傳統數據庫Standby節點的不同,PolarDB PostgreSQL版推出了一寫多讀架構下只讀節點的OnlinePromote機制。

使用指南

使用pg_ctl工具對Replica節點執行Promote操作:

pg_ctl promote -D [datadir]

原理介紹

OnlinePromote原理觸發機制。

  • 觸發機制。

    PolarDB PostgreSQL版使用和傳統數據庫一樣的備庫節點Promote方法,觸發條件如下:

    • 調用pg_ctl工具的Promote命令,pg_ctl工具會向Postmaster進程發送信號,接收到信號的Postmaster進程再通知其他進程執行相應的操作,完成整個Promote操作。

    • recovery.conf中定義trigger file的路徑,其他組件通過生成trigger file來觸發。

    說明

    相比于傳統數據庫Standby節點的Promote操作,PolarDB PostgreSQL版Replica節點的OnlinePromote操作需要考慮以下幾個問題:

    • Replica節點OnlinePromote為主庫節點后,需要以讀寫模式重新掛載共享存儲。

    • Replica節點會在內存中維護一些重要的控制信息,這些控制信息在主庫節點上會被持久化到共享存儲中。Promote過程中,這部分信息也需要持久化到共享存儲。

    • Replica節點在內存中通過日志回放得到的數據信息,在OnlinePromote的過程中需要確認哪些數據可以寫入共享存儲。

    • Replica節點在內存中回放WAL日志時,緩沖區淘汰方法和不刷臟的特性與主庫節點截然不同,OnlinePromote過程中應該如何處理。

    • Replica節點OnlinePromote過程中,各個子進程的處理過程。

  • Postmaster進程處理過程。

    1. Postmaster進程發現trigger file文件或者接收到OnlinePromote命令后,進入OnlinePromote處理流程。

    2. 發送SIGTERM信號給當前所有Backend進程。

      說明

      只讀節點在OnlinePromote過程中可以繼續提供只讀服務,但是只讀的數據不能保證是最新的。為了避免切換過程中從新的主庫節點讀到舊的數據,這里需要先將所有的Backend會話斷開,等Startup進程退出后再開始對外提供讀寫服務。

    3. 重新以讀寫模式掛載共享存儲。

      說明

      需要底層存儲提供相應的功能支持。

    4. 發送SIGUSR2信號給Startup進程,通知其結束回放并處理OnlinePromote操作。

    5. 發送SIGUSR2信號給Polar Worker輔助進程,通知其停止對于部分LogIndex數據的解析,因為這部分LogIndex數據只對于正常運行期間的Replica節點有用處。

    6. 發送SIGUSR2信號給LogIndex BGW(Background Ground Worker)后臺回放進程,通知其處理OnlinePromote操作。

    具體過程如下圖:Postmaster進程處理過程

  • Startup進程處理過程。

    1. Startup進程回放完所有舊主庫節點產生的WAL日志,生成相應的LogIndex數據。

    2. 確認舊主庫節點最后一次的checkpoint在Replica節點也完成,目的是確保對應的checkpoint應該在Replica節點本地寫入的數據落盤完畢。

    3. 等待確認LogIndex BGW進程進入POLAR_BG_WAITING_RESET狀態。

    4. 將Replica節點本地的數據(如clog等)拷貝到共享存儲中。

    5. 重置WAL Meta Queue內存空間,從共享存儲中重新加載slot信息,并重新設置LogIndex BGW進程的回放位點為其與當前一致性位點兩者的最小值,用來表示接下來LogIndex BGW進程從該位點開始新的回放。

    6. 將節點角色設置為主庫節點,并設置LogIndex BGW進程的狀態為POLAR_BG_ONLINE_PROMOTE,至此集群可以對外提供讀寫服務。

    具體過程如下圖所示:Startup進程處理過程

  • LogIndex BGW進程處理過程。

    LogIndex BGW進程有自己的狀態機,在其生命周期內,一直按照該狀態機運行,具體每個狀態機的操作內容如下:

    參數

    說明

    POLAR_BG_WAITING_RESET

    LogIndex BGW進程狀態重置,通知其他進程狀態機發生變化。

    POLAR_BG_ONLINE_PROMOTE

    讀取LogIndex數據,組織并分發回放任務,利用并行回放進程組回放WAL日志,該狀態的進程需要回放完所有的LogIndex數據才會進行狀態切換,最后推進后臺回放進程的回放位點。

    POLAR_BG_REDO_NOT_START

    表示回放任務結束。

    POLAR_BG_RO_BUF_REPLAYING

    Replica節點正常運行時,進程處于該狀態,讀取LogIndex數據,按照WAL日志的順序回放一定量的 WAL日志,每回放一輪,便會推進后臺回放進程的回放位點。

    POLAR_BG_PARALLEL_REPLAYING

    LogIndex BGW進程每次讀取一定量的LogIndex數據,組織并分發回放任務,利用并行回放進程組回放WAL日志,每回放一輪,便會推進后臺回放進程的回放位點。

    具體過程如下圖所示:

    LogIndex BGW進程處理過程

    LogIndex BGW進程接收到Postmaster的SIGUSR2信號后,執行OnlinePromote操作的流程如下:

    1. 將所有的LogIndex數據落盤,并切換狀態為POLAR_BG_WAITING_RESET。

    2. 等待Startup進程將其切換為POLAR_BG_ONLINE_PROMOTE狀態。

      • Replica節點在執行OnlinePromote操作前,后臺回放進程只回放在buffer pool中的頁面。

      • Replica節點處于OnlinePromote過程中時,鑒于之前主庫節點可能有部分頁面在內存中,未來得及落盤,所以后臺回放進程按照日志順序回放所有的WAL日志,并在回放后調用MarkBufferDirty,標記該頁面為臟頁,等待刷臟。

      • 回放結束后,推進后臺回放進程的回放位點,然后切換狀態為POLAR_BG_REDO_NOT_START

  • 刷臟控制。

    每個臟頁都帶有一個Oldest LSN,該LSN在FlushList里是有序的,目的是通過這個LSN來確定一致性位點。

    Replica節點在OnlinePromote過程后,由于同時存在著回放和新的頁面寫入,如果像主庫節點一樣,直接將當前的WAL日志插入位點設為Buffer的Oldest LSN,可能會導致:比它小的 Buffer 還未落盤,但新的一致性位點已經被設置。

    所以Replica節點在OnlinePromote過程中需要面對兩個問題:

    • 舊主庫節點的WAL日志回放時,如何給臟頁設置Oldest LSN。

    • 新主庫節點產生的臟頁如何設置Oldest LSN。

    說明

    PolarDB PostgreSQL版在Replica節點OnlinePromote的過程中,將上述兩類情況產生的臟頁的Oldest LSN都設置為LogIndex BGW進程推進的回放位點。只有當標記為相同Oldest LSN的Buffer都落盤了,才將一致性位點向前推進。