PolarDB for PostgreSQL文檔翻譯之第一版功能特性

本篇共翻譯了PolarDB for PostgreSQL V1.0(開源第一階段)的4個(gè)功能特性的說(shuō)明:

  1. Paxos復(fù)制(Paxos replication) - ha_paxos.md
  2. 基于時(shí)間戳的MVCC(Timestamp based MVCC) - cts.md
  3. 并行WAL日志重做(Parallel Redo) - parallel_redo.md
  4. no-full-page-write遠(yuǎn)程恢復(fù)(Remote Recovery) - no_fpw.md

Paxos復(fù)制(Paxos replication) - ha_paxos.md

github原文地址: https://github.com/alibaba/PolarDB-for-PostgreSQL/blob/master/doc/polardb/ha_paxos.md
gitee原文地址: https://gitee.com/mirrors_alibaba/PolarDB-for-PostgreSQL/blob/master/doc/polardb/ha_paxos.md
中文翻譯地址: http://m.itdecent.cn/p/d1e8eec774b2

PolarDB for PostgreSQL通過(guò)使用基于X-Paxos的復(fù)制,確保任何節(jié)點(diǎn)故障后的數(shù)據(jù)零丟失。X-Paxos共識(shí)協(xié)議由阿里巴巴開發(fā)實(shí)現(xiàn)并部署在支持阿里巴巴主要應(yīng)用和平臺(tái)的產(chǎn)品系統(tǒng)中。 X-Paxos實(shí)現(xiàn)了跨副本的強(qiáng)一致性和副本故障時(shí)的高可用性。它允許跨AZ和跨DC的網(wǎng)絡(luò)延遲,同時(shí)保持高吞吐量和正確性。

PolarDB for PostgreSQL將X-Paxos與PostgreSQL的流式復(fù)制功能相結(jié)合。X-Paxos負(fù)責(zé)維護(hù)一致的復(fù)制狀態(tài),例如它們的接收和應(yīng)用的重做日志位置、復(fù)制的角色和領(lǐng)導(dǎo)者選舉等。PostgreSQL的流式復(fù)制提供了WAL的傳輸和接收以及持久化的功能。

在領(lǐng)導(dǎo)者節(jié)點(diǎn)上,部署了一個(gè)共識(shí)服務(wù)來(lái)與跟隨者節(jié)點(diǎn)協(xié)商日志同步的位置。 這些位置被用來(lái)確定要發(fā)送給跟隨者的起始WAL記錄。只有在大多數(shù)節(jié)點(diǎn)都收到了WAL記錄,并且它們被持久化到磁盤上之后,事務(wù)才能提交,這被稱為達(dá)成共識(shí)。同時(shí),任何與數(shù)據(jù)相關(guān)的持久化操作(寫IO)都需要等待相應(yīng)的WAL記錄在副本中達(dá)成共識(shí)。對(duì)于跟隨者節(jié)點(diǎn),他們的恢復(fù)過(guò)程只有在達(dá)成共識(shí)時(shí)才會(huì)應(yīng)用WAL記錄。這可以防止任何未提交的數(shù)據(jù)通過(guò)跟隨者節(jié)點(diǎn)對(duì)用戶可見。

共識(shí)服務(wù)(The consensus service)維護(hù)一個(gè)共識(shí)日志(consensus log)。它的記錄存儲(chǔ)了WAL條目的位置。一個(gè)領(lǐng)導(dǎo)者節(jié)點(diǎn)根據(jù)當(dāng)前本地WAL位置生成一個(gè)共識(shí)日志條目,并將其發(fā)送給跟隨者節(jié)點(diǎn)。跟隨者收到共識(shí)日志條目。在確保與共識(shí)日志條目相對(duì)應(yīng)的WAL記錄被成功持久化后,他們將其寫入本地磁盤。共識(shí)日志條目在多數(shù)節(jié)點(diǎn)中成為持久性的之后,該日志條目就達(dá)成了共識(shí)。領(lǐng)導(dǎo)節(jié)點(diǎn)使用已經(jīng)達(dá)成共識(shí)的日志條目中記錄的WAL位置,來(lái)確定達(dá)成共識(shí)的WAL位置。

跟隨者節(jié)點(diǎn)使用X-Paxos狀態(tài)機(jī)來(lái)管理流復(fù)制和日志應(yīng)用。WAL被從領(lǐng)導(dǎo)節(jié)點(diǎn)拉到跟隨者節(jié)點(diǎn)。當(dāng)領(lǐng)導(dǎo)者發(fā)生改變時(shí),跟隨者節(jié)點(diǎn)使用本地收到的WAL位置,并向新的領(lǐng)導(dǎo)節(jié)點(diǎn)發(fā)送WAL請(qǐng)求,以獲得該位置之后的任何WAL。當(dāng)一個(gè)跟隨者被選為領(lǐng)導(dǎo)時(shí),它自動(dòng)退出恢復(fù),并將自己提升為主PostgreSQL實(shí)例,為客戶提供讀寫服務(wù)。

PolarDB for PostgreSQL支持許多X-Paxos角色,如領(lǐng)導(dǎo)者、跟隨者和記錄者。記錄者節(jié)點(diǎn)與跟隨者節(jié)點(diǎn)的區(qū)別在于是否存儲(chǔ)數(shù)據(jù)和是否應(yīng)用WAL來(lái)恢復(fù)數(shù)據(jù)。記錄者節(jié)點(diǎn)只保留實(shí)時(shí)WAL日志。它像跟隨者一樣進(jìn)行流式復(fù)制,但收到的WAL日志不會(huì)被回放。這意味著記錄者節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù)或運(yùn)行恢復(fù)。 使用記錄器節(jié)點(diǎn)可以使X-Paxos在各節(jié)點(diǎn)之間實(shí)現(xiàn)類似的共識(shí),而支付的存儲(chǔ)成本更少。


Copyright ? 阿里巴巴集團(tuán)有限公司版權(quán)所有

基于時(shí)間戳的MVCC(Timestamp based MVCC) - cts.md

github原文地址: https://github.com/alibaba/PolarDB-for-PostgreSQL/blob/master/doc/polardb/cts.md
gitee原文地址: https://gitee.com/mirrors_alibaba/PolarDB-for-PostgreSQL/blob/master/doc/polardb/cts.md
中文翻譯地址: http://m.itdecent.cn/p/d1e8eec774b2

HLC, CTS 和 (分布式的) 快照隔離

PolarDB for PG(簡(jiǎn)稱PolarDB)實(shí)現(xiàn)了一個(gè)多核擴(kuò)展的事務(wù)處理系統(tǒng),并通過(guò)使用基于提交時(shí)間戳的MVCC來(lái)支持分布式事務(wù)(即將發(fā)布)。傳統(tǒng)的PostgreSQL使用基于xid的快照來(lái)提供MVCC之上的事務(wù)隔離,這在多核機(jī)器上會(huì)引入擴(kuò)展瓶頸。具體來(lái)說(shuō)就是,每個(gè)事務(wù)在開始時(shí)需要通過(guò)持有Proc-Array鎖來(lái)獲得Proc-Array中當(dāng)前運(yùn)行的事務(wù)得快照。同時(shí),Proc-Array鎖的獲取是為了在事務(wù)結(jié)束時(shí)清除事務(wù)。在關(guān)鍵路徑中頻繁使用全局Proc-Array鎖會(huì)導(dǎo)致嚴(yán)重的爭(zhēng)用。對(duì)于讀已提交(RC)級(jí)別的隔離,每個(gè)快照都是在語(yǔ)句級(jí)別產(chǎn)生的,這可能會(huì)進(jìn)一步加劇性能瓶頸。

為了解決這個(gè)問(wèn)題,PolarDB采用了基于提交時(shí)間戳的MVCC以獲得更好的可擴(kuò)展性。具體來(lái)說(shuō)就是,每個(gè)事務(wù)在開始和提交時(shí)都會(huì)為其分配一個(gè)開始時(shí)間戳和提交時(shí)間戳。這些時(shí)間戳是單調(diào)遞增的,以保持事務(wù)的隔離順序。

PolarDB實(shí)現(xiàn)了一個(gè)CTS(Commit Timestamp Store),它是為可擴(kuò)展性而精心設(shè)計(jì)的,用于存儲(chǔ)提交時(shí)間戳和事務(wù)狀態(tài)。由于處于關(guān)鍵路徑,PolarDB采用了著名的并發(fā)數(shù)據(jù)結(jié)構(gòu)和無(wú)鎖算法來(lái)實(shí)現(xiàn)CTS,以避免在多核機(jī)器上出現(xiàn)擴(kuò)展瓶頸。具體來(lái)說(shuō)就是,PolarDB在訪問(wèn)內(nèi)存中的CTS緩沖區(qū)時(shí),盡可能避免獲取獨(dú)占鎖。只有在發(fā)生LRU替換時(shí)才需要獨(dú)占鎖。為了并行化LRU緩沖區(qū)的替換和刷新,CTS針對(duì)多核架構(gòu)采用了多LRU分區(qū)結(jié)構(gòu)。

由于基于xid的快照被移除,PolarDB得以實(shí)現(xiàn)了基于CTS的vaccum、hot-chain裁剪和邏輯復(fù)制等特性, 從而獲得更好的性能。更有趣的是,通過(guò)使用CTS,PolarDB簡(jiǎn)化了邏輯復(fù)制的快照建立過(guò)程。在PostgreSQL中,原始的邏輯復(fù)制包括四個(gè)步驟,這很復(fù)雜,很難理解和推理其正確性。相比之下,基于CTS的快照建立只需要兩個(gè)步驟,而且比原來(lái)的快照更容易理解。

PolarDB設(shè)計(jì)了一個(gè)混合邏輯時(shí)鐘(HLC)來(lái)生成事務(wù)的開始和提交時(shí)間戳,以維持快照隔離(支持RR和RC隔離)。采用HLC是為了在我們即將推出的分布式無(wú)共享的PolarDB-PG中支持去中心化的分布式事務(wù)管理。HLC由一個(gè)邏輯部分(嚴(yán)格遞增計(jì)數(shù)器)和一個(gè)物理部分組成。邏輯部分用于跟蹤事務(wù)順序以確??煺崭綦x,而物理部分用于在不同的機(jī)器上生成新鮮的(freshness)快照。每個(gè)節(jié)點(diǎn)上的物理時(shí)鐘可以通過(guò)使用NTP(網(wǎng)絡(luò)時(shí)間協(xié)議)或PTP(精確時(shí)間協(xié)議)進(jìn)行同步。局域網(wǎng)內(nèi)的PTP可以使任何兩臺(tái)機(jī)器之間的最大時(shí)鐘偏差小到幾微秒。
在單個(gè)數(shù)據(jù)中心采用先進(jìn)的PTP可以使PolarDB-PGGoogle Spanner一樣在不同的節(jié)點(diǎn)之間提供強(qiáng)大的外部一致性。然而,我們即將推出的開源分布式版本假設(shè)機(jī)器由NTP同步,只旨在保證快照隔離和跨節(jié)點(diǎn)的內(nèi)部一致性。一個(gè)64位的HLC時(shí)間戳由16個(gè)最低位的邏輯計(jì)數(shù)器、48個(gè)較高位的物理時(shí)間和2個(gè)保留位組成。

為了保持分布式快照隔離,PolarDB采用HLC為每個(gè)事務(wù)生成開始時(shí)間戳快照。任何一個(gè)節(jié)點(diǎn)在接受到一個(gè)事務(wù)時(shí)自動(dòng)成為它的協(xié)調(diào)者節(jié)點(diǎn),負(fù)責(zé)為其分配開始和提交時(shí)間戳。為了提交一個(gè)分布式事務(wù),其協(xié)調(diào)者使用兩階段提交協(xié)議(2PC),在準(zhǔn)備階段從所有參與節(jié)點(diǎn)收集準(zhǔn)備好的HLC時(shí)間戳,并從所有準(zhǔn)備好的時(shí)間戳中選擇最大的時(shí)間戳來(lái)確定其提交時(shí)間戳。最后,提交時(shí)間戳被傳遞給所有參與節(jié)點(diǎn)以提交事務(wù)。當(dāng)一個(gè)事務(wù)訪問(wèn)某個(gè)節(jié)點(diǎn)時(shí),例如事務(wù)開始和提交, 這個(gè)節(jié)點(diǎn)上的混合邏輯時(shí)鐘會(huì)使用到達(dá)的開始時(shí)間戳或者提交時(shí)間戳進(jìn)行更新。PolarDB使用2PC的準(zhǔn)備等待機(jī)制(prepared wait mechanism)來(lái)解決像Google Percolator那樣的事務(wù)之間的因果關(guān)系排序,即: 一個(gè)MVCC掃描在驗(yàn)證其寫入的可見性時(shí)必須等待一個(gè)準(zhǔn)備好(兩階段提交中的第一階段已完成)的事務(wù)完成。準(zhǔn)備好的狀態(tài)被保存在CTS中以便快速訪問(wèn),并在準(zhǔn)備好的事務(wù)提交時(shí)被替換成提交時(shí)間戳?;贖LC的分布式事務(wù)將很快出現(xiàn)在我們的PolarDB-PG的分布式無(wú)共享版本中。PolarDB的主要設(shè)計(jì)目標(biāo)是在每臺(tái)多核機(jī)器和許多機(jī)器之間提供可擴(kuò)展的OLTP性能。


Copyright ? 阿里巴巴集團(tuán)有限公司版權(quán)所有

并行WAL日志重做(Parallel Redo) - parallel_redo.md

github原文地址: https://github.com/alibaba/PolarDB-for-PostgreSQL/blob/master/doc/polardb/parallel_redo.md
gitee原文地址: https://gitee.com/mirrors_alibaba/PolarDB-for-PostgreSQL/blob/master/doc/polardb/parallel_redo.md
中文翻譯地址: http://m.itdecent.cn/p/d1e8eec774b2

并行WAL日志重做

為了加快恢復(fù)和復(fù)制的WAL重做速度,PolarDB for PG實(shí)現(xiàn)了一個(gè)并行的WAL重做機(jī)制。PolarDB for PG支持兩種形式的并行。表級(jí)和頁(yè)級(jí),但它們都是使用同一個(gè)并行框架。具體來(lái)說(shuō),PolarDB for PG為并行重放創(chuàng)建了指定數(shù)量的工作者。主進(jìn)程從WAL中連續(xù)讀取WAL記錄,并將其分發(fā)給并行工作者進(jìn)行重放。主進(jìn)程通過(guò)共享內(nèi)存隊(duì)列(shm)與工作者進(jìn)行通信,并使用批處理來(lái)減少通信開銷。由于采用了批處理,我們目前的并行重放并不支持熱備復(fù)制。

如何使用

  1. 你應(yīng)該將GUC參數(shù)max_parallel_replay_workers的值設(shè)置為大于 0 來(lái)啟用并行WAL重做。
  2. 你可以把enable_parallel_recovery_bypage設(shè)置為true,以啟用頁(yè)級(jí)并行重做。
  3. 如果參數(shù)allow_hot_standby_inconsistency被設(shè)置,你甚至可以在熱備復(fù)制的情況下使用并行重做。

Copyright ? 阿里巴巴集團(tuán)有限公司版權(quán)所有

no-full-page-write遠(yuǎn)程恢復(fù)(Remote Recovery) - no_fpw.md

github原文地址: https://github.com/alibaba/PolarDB-for-PostgreSQL/blob/master/doc/polardb/no_fpw.md
gitee原文地址: https://gitee.com/mirrors_alibaba/PolarDB-for-PostgreSQL/blob/master/doc/polardb/no_fpw.md
中文翻譯地址: http://m.itdecent.cn/p/d1e8eec774b2

數(shù)據(jù)保護(hù)的遠(yuǎn)程恢復(fù)(Remote Recovery for data guarding)

PostgreSQL引入了全頁(yè)寫入機(jī)制(full page write mechanism),以避免在系統(tǒng)崩潰時(shí)出現(xiàn)不一致的情況。然而,全頁(yè)寫入會(huì)放大寫入量并降低性能。遠(yuǎn)程恢復(fù)(Remote Recovery)被設(shè)計(jì)為在恢復(fù)期間從鏡像節(jié)點(diǎn)(備節(jié)點(diǎn)或主節(jié)點(diǎn))獲取全頁(yè),以防止在沒有全頁(yè)寫入的情況下撕裂頁(yè)面。因此,可以關(guān)閉全頁(yè)寫入,以減少IO和提高性能。

具體來(lái)說(shuō),PolarDB PG在上次檢查點(diǎn)后首次修改頁(yè)面時(shí)在WAL中寫入一個(gè)特殊位(而不是一個(gè)完整的頁(yè))。在恢復(fù)過(guò)程中,當(dāng)遇到表明需要遠(yuǎn)程獲取的特殊位時(shí),PolarDB PG數(shù)據(jù)庫(kù)實(shí)例將從其鏡像實(shí)例中獲取該頁(yè),并在重放后續(xù)修改之前將其恢復(fù)到本地。

遠(yuǎn)程恢復(fù)還可以利用我們的并行WAL重做框架來(lái)獲取頁(yè)面,然后并行地轉(zhuǎn)發(fā)WAL記錄。

如何使用

  1. 你可以在remote_recovery.conf配置文件中設(shè)置一個(gè)數(shù)據(jù)目錄來(lái)支持遠(yuǎn)程恢復(fù)。
    remote_recovery.conf的格式與recovery.conf相同。
    你應(yīng)該指定用于建立連接的鏡像節(jié)點(diǎn)地址。例如,你可以把standby_conninfo = 'host=xx port=xx user=xx password=xx application_name=standby'寫入remote_recovery.conf。
  2. 鏡像節(jié)點(diǎn)的max_wal_senders參數(shù)應(yīng)配置為大于恢復(fù)節(jié)點(diǎn)的max_parallel_replay_workers參數(shù)。
  3. 如果鏡像節(jié)點(diǎn)是一個(gè)備份節(jié)點(diǎn),它應(yīng)該打開hot_standby以接受來(lái)自恢復(fù)節(jié)點(diǎn)的連接。
    checkpoint_sync_standby應(yīng)該被打開,以保證在檢查點(diǎn)完成后,鏡像節(jié)點(diǎn)有完整的WAL修改。

Copyright ? 阿里巴巴集團(tuán)有限公司版權(quán)所有

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容