1. 程式人生 > 其它 >阿里雲資料庫開源重磅釋出:PolarDB三節點高可用的功能特性和關鍵技術

阿里雲資料庫開源重磅釋出:PolarDB三節點高可用的功能特性和關鍵技術

簡介:在3月2日的阿里雲開源 PolarDB 企業級架構釋出會上,阿里雲資料庫技術專家孟勃榮 帶來了主題為《PolarDB 三節點高可用》的精彩演講。三節點高可用功能主要為 PolarDB 提供金融級強一致性、高可靠性的跨機房複製能力,基於分散式共識演算法同步資料庫物理日誌,自動failover,任意節點故障後資料零丟失。本議題主要介紹PolarDB三節點高可用的功能特性和關鍵技術。

在3月2日的阿里雲開源 PolarDB 企業級架構釋出會上,阿里雲資料庫技術專家孟勃榮
帶來了主題為《PolarDB 三節點高可用》的精彩演講。三節點高可用功能主要為 PolarDB 提供金融級強一致性、高可靠性的跨機房複製能力,基於分散式共識演算法同步資料庫物理日誌,自動failover,任意節點故障後資料零丟失。本議題主要介紹PolarDB三節點高可用的功能特性和關鍵技術。

直播回顧視訊:開源PolarDB企業級架構重磅釋出-阿里雲
PDF下載: 檔案下載-阿里雲開發者社群

以下根據釋出會演講視訊內容整理:

PolarDB for PostgreSQL三節點高可用功能主要是將物理複製與一致性協議相結合,為PolarDB 提供金融級強一致性以及高可靠的跨機房複製能力。

PG 原生的流複製支援非同步/同步/Quorum三種同步方式。

同步複製的主要目標是保證資料不丟失,但它同時也會帶來三個問題:

① 無法滿足可用性的要求,備庫出現故障或網路鏈路抖動的時候,會影響主庫的可用性,這對生產環境是不可接受的。其次它不能完全保證資料不丟失,同步複製保證資料不丟失的方案是當備機沒有完全持久化RW日誌前,主庫的事務不能提交。在某種極端情況下,比如主庫已經寫入了WAL日誌,等待備庫同步WAL日誌的過程中主庫發生了重啟,那麼在重啟的過程中,日誌回放的過程是不等待備庫持久化的。所以回放完成後,有可能備庫沒有持久化,而日誌在主庫上回放完之後已經對外可見了。

② 不具備故障自動切換的能力。自動切換、可用性探測等能力都依賴於外部的元件。

③ 舊的主庫在故障恢復之後,可能無法直接加入到叢集。比如當事務在主庫上的WAL日誌已經持久化,而備庫還未收到日誌或者還未持久化。此時如果主庫出現了故障,備庫切換成主庫後,舊的主庫重新執行後,因為在重啟之前有多餘的 WAL 日誌,所以無法直接從主庫上拉取日誌,必須依賴於其他工具對其一致性進行處理後才能加入到叢集裡。

非同步複製相比於同步複製,效能比較好,可用性也更高,因為備機的故障或網路鏈路的抖動不會影響主庫,但它最大的問題是丟資料。比如原來在主庫上能看到的資料,發生切換之後在備庫上不存在。其次,它也不具備自動故障切換和自動探測的能力,切換後的主庫無法自動加入到叢集裡。

Quorum複製使用了多數派的方案之後,可能也能保證不丟資料,但它並沒有涉及到當主機發生故障時如何選取新的主機;其次,每個節點的日誌不一致時,如何確保日誌的一致性;第三,叢集發生變更的時候,如何保證叢集狀態最終的一致性。針對以上問題,Quorum複製沒有提供完整的解決方案。所以本質上來說, PG 的 Quorum 複製並不是一個完整的、不丟資料的高可用方案。

我們的方案是將阿里內部的一致性協議 X-Paxos 引入進來協調物理複製。X-Paxos 在阿里內部和阿里雲的多個產品上已經穩定運行了很長時間,因此它的穩定性得以保障。它的的一致性協議的演算法和其他的協議是類似的。

整個高可用方案是一個單點寫入、多點可讀的集群系統。 Leader 節點作為單點寫入節點對外提供讀寫服務,產生了WAL日誌後向其他節點同步。Follower 主要是接受來自於 Leader 節點的 WAL 日誌,並進行回放,對外提供只讀服務。

那麼它的主要能力是包括以下三個方面:

保證叢集內資料的強一致性,即 RPO=0。當多數派節點的WAL日誌寫入成功後,才認為此日誌在叢集層面已經提交成功。發生故障時,其他Follower 節點會自動與 Leader 節點對齊日誌。

自動 failover 。在高可用叢集中,只要半數以上的節點存活,就能保證叢集正常對外提供服務。因此當少數 failover 故障或少數節點網路不通的時候,並不會影響叢集的服務能力。

當 Leader 節點故障或與多數派節點網路不通的時候,會自動觸發叢集重新選主流程,由新主對外提供讀寫服務。另外 Follower 節點也會自動從新的 Leader 節點上同步WAL日誌,並且自動與新的 Leader 日誌對齊。此時如果Follower 上的日誌比新 Leader 上多,則會自動從新 Leader 上對齊WAL日誌。

線上叢集變更可以支援線上增刪節點、手動切換、角色變換,比如從 Leader 切到 follower角色。此外還能支援所有節點設定選舉權重,選舉權重高的節點會優先被選為主。同時,叢集變更操作不影響業務的正常執行,此能力的實現由一致性協議來保證。最終叢集內配置達成一致,不會因為叢集配置過程中的異常情況導致狀態不一致的問題。

三節點高可用功能中增加了一個新的角色: Learner 節點。它沒有多數派的決策權,但能夠提供只讀服務。

Learner 節點的日誌同步狀態與 Leader 無關,也不會影響 Leader ,它的主要作用有兩點:

① 作為加節點的中間狀態。比如新加的 Leader 節點延遲比較大,如果直接將其加入到多數派裡,會影響多數派的提交。因此,先以 learner 的角色加入到叢集來同步資料,當它的資料基本追上 Leader 之後,再升為 follower節點。

② 作為異地災備節點。它不會影響主庫的可用性,發生 Leader 切換之後,它能自動從新的賬號同步日誌,不需要外部的介入。

在叢集部署方面,能夠支援跨機房和跨域的部署,包括同機房三副本、同城三機房三副本,以及兩地三機房五副本、三地三機房五副本等。另外跨域也可以利用 Learner 節點進行災備,不會影響 Leader 節點的可用性。
此外,它相容了 PG 原生的流複製和邏輯複製,能夠保證下游的消費不受影響,保證下游不會出現未提交的資料。

從前文的介紹中可以看到,在 PolarDB 的高可用方案中,至少要儲存三份資料,儲存成本會有所增加。針對這個問題,我們提供了兩個方面的解決方案:

首先,提高資源的利用率。 Follower 節點可以作為只讀節點來提供讀服務,從而增加整個叢集的讀擴充套件能力;此外,支援跨節點的並行查詢能力,可以充分利用各個基節點的資源。

其次,引入了日誌節點,減少資源的佔用。日誌節點本身不儲存資料,它只儲存實時的WAL 日誌,僅作為日誌持久化的多數派節點之一。此日誌節點本身也具備完整的日誌複製能力,可以相容原生的流複製和邏輯複製,可以將其作為下游日誌消費的源,從而減少 Leader 節點的日誌傳輸壓力。可以根據下游日誌消費的需求,來定製日誌節點的網路規格或者其他資源。

一致性協議複製的基本原理主要包含三個方面:

① 通過原生的非同步流複製來傳輸或同步WAL日誌。

② 由一致性協議來推動叢集的提交位點。

③ 針對自動 failover 的問題,根據一致性協議層面自身狀態的變化,來驅動資料庫層面的狀態變化。比如心跳超時之後,可能會自動降級。

具體實現上,以 Consensus Log 為載體來推進提交位點。針對每一段WAL日誌生成相應的 Consensus Log Entry ,裡面記錄了WAL日誌的結束 LSN。 而後引入一個持久化依賴,保證每個 Log Entry持久化的時候,本節點上相應位點的WAL日誌已經持久化成功。

引入上述兩個機制後,如果一致性協議層面認為 Consensus Log 已經提交成功,則意味著 Consensus Log 已經在多數派上持久化成功,相應位點的WAL日誌肯定也已經持久化成功。

以上圖為例, Leader 上已經持久化了三段 WAL 日誌,在 Follower 1 節點上,雖然 log entry 的 WAL 日誌已經持久化成功,但它對應的 Consensus Log還未持久化成功,所以一致性協議就認為此 Consensus Log也沒有持久化成功。Follower 2 上 Log Entry和Consensus Log 沒有持久化,它的WAL日誌只持續化了一段,它的 WAL 日誌段也沒有持久化成功。因此,根據一致性協議,當前 LogIndex 2 的日誌在多數派節點上已經寫入成功,當前 Consensus Log的 CommitIndex 就是 2 ,對應的那 Commit LSN 就是300。

上圖為tpmC 測試過程中 RTO 的情況。tpmC 達到 30 萬左右的時候,進行kill 主庫的操作。可以看到,不到 30 秒,新的主庫已經恢復了寫的能力,並且恢復到切換之前的水平。

原文連結

本文為阿里雲原創內容,未經允許不得轉載。