AnalyticDB PostgreSQL 教你實(shí)現(xiàn)分布式一致性備份恢復(fù)
一、背景
AnalyticDB PostgreSQL版(簡稱ADB PG)是阿里云數(shù)據(jù)庫團(tuán)隊(duì)基于PostgreSQL內(nèi)核(簡稱PG)打造的一款云原生數(shù)據(jù)倉庫產(chǎn)品。在數(shù)據(jù)實(shí)時(shí)交互式分析、HTAP、ETL、BI報(bào)表生成等業(yè)務(wù)場景,ADB PG都有著獨(dú)特的技術(shù)優(yōu)勢。
作為一款企業(yè)級數(shù)據(jù)倉庫產(chǎn)品,數(shù)據(jù)安全的重要性不言而喻。備份恢復(fù)功能是保障數(shù)據(jù)安全的基本手段,也是ADB PG應(yīng)對突發(fā)狀況進(jìn)行數(shù)據(jù)庫恢復(fù)的重要保障。備份恢復(fù),顧名思義,是對數(shù)據(jù)庫進(jìn)行數(shù)據(jù)備份,以便在必要時(shí)進(jìn)行數(shù)據(jù)的恢復(fù),防范于未然。當(dāng)前,ADB PG的備份恢復(fù)功能已經(jīng)應(yīng)用在以下各個用戶場景中:
由于系統(tǒng)故障、人為誤操作造成數(shù)據(jù)被破壞或?qū)嵗豢捎脮r(shí),基于備份數(shù)據(jù)對實(shí)例進(jìn)行恢復(fù)。
用戶需要基于已有實(shí)例,快速克隆出一個完全相同的實(shí)例。
在節(jié)點(diǎn)數(shù)不變的前提下,用戶需要更改源實(shí)例的規(guī)格。
本文將介紹ADB PG備份恢復(fù)的原理與使用方法。
二、簡介
ADB PG 是采用MPP水平擴(kuò)展架構(gòu)的分布式數(shù)據(jù)庫。ADB PG實(shí)例由一個或多個協(xié)調(diào)節(jié)點(diǎn)(Master)和多個計(jì)算節(jié)點(diǎn)(Compute Node)組成,協(xié)調(diào)節(jié)點(diǎn)負(fù)責(zé)接收用戶請求,制定分布式執(zhí)行計(jì)劃并下發(fā)至計(jì)算節(jié)點(diǎn),收集執(zhí)行結(jié)果并返回給客戶端;計(jì)算節(jié)點(diǎn)負(fù)責(zé)并行計(jì)算分析與數(shù)據(jù)存儲。數(shù)據(jù)在計(jì)算節(jié)點(diǎn)之間可以隨機(jī)、哈希、復(fù)制分布。下圖ADB PG的架構(gòu)圖:
ADB PG的物理備份恢復(fù)功能,基于集群的基礎(chǔ)備份和日志備份,可以在分布式數(shù)據(jù)庫繼續(xù)提供服務(wù)的同時(shí)備份各個節(jié)點(diǎn)的數(shù)據(jù),并保證數(shù)據(jù)的一致性。在需要時(shí),可以將分布式數(shù)據(jù)庫恢復(fù)至備份的時(shí)刻。
基礎(chǔ)備份是指對數(shù)據(jù)庫所有數(shù)據(jù)進(jìn)行的一個完全拷貝?;A(chǔ)備份會將集群全量數(shù)據(jù)快照壓縮后存儲在其它離線存儲介質(zhì),集群在基礎(chǔ)備份期間不會阻塞用戶的讀寫,因此,備份期間產(chǎn)生的日志也會被備份來保證基礎(chǔ)備份的完整性。
日志備份(也稱為增量備份),是指將集群產(chǎn)生的日志文件備份至其他離線存儲介質(zhì)。日志文件記錄了用戶對數(shù)據(jù)庫的DML與DDL操作。通過一個完整的基礎(chǔ)備份以及連續(xù)的日志備份,可以將新集群恢復(fù)到某一歷史事件點(diǎn),保證了這段時(shí)間的數(shù)據(jù)安全性。
ADB PG可保障最小RPO為10分鐘的備份恢復(fù)。
三、原理
在完整地介紹ADB PG的備份恢復(fù)原理之前,先簡要地介紹單機(jī)PG的PITR(Point in Time Recovery)備份恢復(fù)機(jī)制。ADB PG的備份恢復(fù)機(jī)制基于單機(jī)PG的PITR原理,并加入了分布式數(shù)據(jù)一致性的保障機(jī)制。
(一)單機(jī)PG的PITR機(jī)制
WAL日志:
PostgreSQL數(shù)據(jù)庫會將事務(wù)對數(shù)據(jù)的所有更改(包括DDL、DML等操作)記錄在WAL(Write Ahead Log)日志文件中。WAL日志文件可以看作是一個無限增長的只追加文件,PG會將日志數(shù)據(jù)按固定大小切分成多個文件存儲。事務(wù)的每次修改數(shù)據(jù)的操作都會被追加記錄至WAL文件中,并賦予一個唯一的LSN序號(Log Sequence Number),在事務(wù)提交時(shí),會保證WAL日志已持久化。
這些日志文件的作用是為了讓數(shù)據(jù)庫在需要恢復(fù)時(shí),可以通過“重放”WAL日志來恢復(fù)數(shù)據(jù)庫崩潰時(shí)還未持久化,但對應(yīng)事務(wù)已提交的數(shù)據(jù)。
恢復(fù)點(diǎn):
有了WAL日志可以進(jìn)行“重放”操作,那么還有一個問題:需要重放到什么時(shí)候呢?這就需要恢復(fù)點(diǎn)(restore point)來解決。
恢復(fù)點(diǎn)相當(dāng)于WAL日志中寫入的一個標(biāo)記,它標(biāo)記了一個日志的位置。當(dāng)PG對日志進(jìn)行重放時(shí),通過檢查是否已經(jīng)到達(dá)這個標(biāo)記點(diǎn),來決定是否需要停止"重放"的操作。
以下SQL可以在WAL日志文件中創(chuàng)建一個名為t1的標(biāo)志點(diǎn):
- postgres=# select pg_create_restore_point('t1');LOG: restore point "t1" created at 0/2205780STATEMENT: select pg_create_restore_point('t1'); pg_create_restore_point------------------------- 0/2205780(1 row)
當(dāng)數(shù)據(jù)庫順序回放WAL日志時(shí),會檢查當(dāng)前日志包含此恢復(fù)點(diǎn)名稱,若已包含,則停止重放。另外,PG還支持恢復(fù)至指定的任意時(shí)間點(diǎn),事務(wù)號,LSN序號等操作。
基礎(chǔ)備份與增量備份:
基礎(chǔ)備份是對數(shù)據(jù)庫數(shù)據(jù)的一份完整拷貝??梢允褂胮g_basebackup工具對單機(jī)PG進(jìn)行一次基礎(chǔ)備份,備份數(shù)據(jù)可保存至本地,也可存儲在其他離線存儲介質(zhì)(OSS)中。
- $ pg_basebackup -D pg_data_dir/ -p 6000NOTICE: pg_stop_backup complete, all required WAL segments have been a
增量備份是指對產(chǎn)生的WAL日志文件進(jìn)行備份。在PG中,可通過數(shù)據(jù)庫參數(shù)archive_command來指定如何備份WAL日志數(shù)據(jù)。當(dāng)PG生成一個WAL日志文件時(shí),會通過執(zhí)行archive_command的命令來嘗試備份歸檔該日志文件。比如,如下命令會將日志文件發(fā)送至指定的OSS。
archive_command="ossutil cp %p oss://bucket/path/%f"
單機(jī)PG的全量備份與增量備份
需要注意的是,基礎(chǔ)備份期間并不會阻塞數(shù)據(jù)庫的讀寫,因此備份期間的數(shù)據(jù)更新對應(yīng)的WAL日志也需要備份,以備恢復(fù)時(shí)保證數(shù)據(jù)的一致性。
PITR恢復(fù):
當(dāng)需要恢復(fù)數(shù)據(jù)庫時(shí),首先下載基礎(chǔ)備份數(shù)據(jù),然后使用基礎(chǔ)備份開啟集群,再下載日志文件備份,“重放”至指定的恢復(fù)點(diǎn)即可進(jìn)行數(shù)據(jù)庫的恢復(fù)。在單機(jī)PG中, 指定的恢復(fù)點(diǎn)的目標(biāo)可以是事務(wù)號、時(shí)間戳、WAL序號(LSN)以及某個恢復(fù)點(diǎn)名稱。
(二)ADB PG的分布式一致性備份恢復(fù)機(jī)制
ADB PG 作為分布式數(shù)據(jù)庫,使用兩階段事務(wù)提交來管理分布式事務(wù)。如果照搬單機(jī)PG的PITR機(jī)制,會造成數(shù)據(jù)的不一致。比如如下場景:分布式事務(wù)按照A、B、C時(shí)間順序分配,但由于種種原因(如網(wǎng)絡(luò)延時(shí)、節(jié)點(diǎn)負(fù)載、顯式提交等),分布式模式下事務(wù)的提交的順序在各個節(jié)點(diǎn)可能各不相同,如下圖所示:
Master 按照 A、B、C順序提交
Compute Node 1 按照 A、C、B順序提交
Compute Node 2 按照 B、C、A順序提交
如果在此過程中,創(chuàng)建了恢復(fù)點(diǎn),當(dāng)恢復(fù)時(shí)如果指定恢復(fù)至該恢復(fù)點(diǎn),顯而易見,恢復(fù)后集群中各個節(jié)點(diǎn)所處的狀態(tài)是不一致的。
兩階段事務(wù)提交鎖與一致性恢復(fù)點(diǎn):
為了解決上述的問題,我們引入了兩階段事務(wù)提交鎖。分布式事務(wù)提交會以SHARED模式獲得該鎖,而創(chuàng)建恢復(fù)點(diǎn)都需要以EXCLUSIVE模式獲得該鎖。于是在集群中如果有分布式事務(wù)正在等待各個節(jié)點(diǎn)上提交,那么集群創(chuàng)建恢復(fù)點(diǎn)的動作必須等待所有節(jié)點(diǎn)上的分布式事務(wù)提交完后,才能進(jìn)行。
這從根本上解決了上述這就解決了在分布式事務(wù)還在提交的同時(shí)創(chuàng)建恢復(fù)點(diǎn)而造成恢復(fù)時(shí)數(shù)據(jù)不一致的問題。引入了兩階段提交鎖機(jī)制之后,我們可以保證創(chuàng)建的恢復(fù)點(diǎn)所對應(yīng)的各節(jié)點(diǎn)狀態(tài)是一致的,因此我們將ADB PG中創(chuàng)建的恢復(fù)點(diǎn)稱為一致性恢復(fù)點(diǎn)。
分布式備份與恢復(fù)過程:
有了事務(wù)提交鎖與一致性恢復(fù)點(diǎn)之后,我們就可以放心地對ADB PG各個節(jié)點(diǎn)進(jìn)行備份和創(chuàng)建一致性恢復(fù)點(diǎn),而無需擔(dān)心節(jié)點(diǎn)狀態(tài)不一致的問題。
ADB PG的備份也分為基礎(chǔ)備份和日志備份(也稱為增量備份)?;A(chǔ)備份是對集群每個節(jié)點(diǎn)進(jìn)行的一次完整拷貝,ADB PG會對計(jì)算節(jié)點(diǎn)和協(xié)調(diào)節(jié)點(diǎn)并發(fā)地進(jìn)行備份,將備份數(shù)據(jù)流式保存至離線存儲(如OSS)。在進(jìn)行基礎(chǔ)備份的期間,不會阻塞集群的讀寫服務(wù)。因此,如果在基礎(chǔ)備份期間,用戶有寫入和更新的數(shù)據(jù),也需要將數(shù)據(jù)更改對應(yīng)的WAL日志進(jìn)行備份。如下圖所示, ADB PG會對每個節(jié)點(diǎn)并行地進(jìn)行一次數(shù)據(jù)拷貝,將數(shù)據(jù)流式上傳至OSS。
ADB PG基礎(chǔ)備份過程
ADB PG的日志備份是對集群中的計(jì)算節(jié)點(diǎn)和協(xié)調(diào)節(jié)點(diǎn)產(chǎn)生的WAL日志的備份。各個節(jié)點(diǎn)會將自己生成的WAL日志轉(zhuǎn)儲至離線存儲(如OSS)。同時(shí),集群會定時(shí)地創(chuàng)建一致性恢復(fù)點(diǎn),并將包含一致性恢復(fù)點(diǎn)的WAL日志進(jìn)行備份。
當(dāng)需要恢復(fù)新的集群時(shí),需要同時(shí)使用基礎(chǔ)備份與日志備份,并首先創(chuàng)建一個節(jié)點(diǎn)數(shù)和原實(shí)例相同的恢復(fù)實(shí)例。各個節(jié)點(diǎn)并行拉取指定的基礎(chǔ)備份至本地。之后,每個節(jié)點(diǎn)自己拉取自己所需的WAL日志備份文件,在本地重放,直到重放至指定的一致性恢復(fù)點(diǎn)而停止。最終,我們就能得到一個新的集群,并保證數(shù)據(jù)和狀態(tài)與源實(shí)例在一致性恢復(fù)點(diǎn)對應(yīng)的數(shù)據(jù)與狀態(tài)一致?;謴?fù)的過程如下圖所示:
四、使用
(1)控制臺備份相關(guān)信息
查看基礎(chǔ)備份集
用戶在實(shí)例控制臺的“備份恢復(fù)”頁面,可以查看數(shù)據(jù)庫的基礎(chǔ)備份數(shù)據(jù)。目前基礎(chǔ)備份數(shù)據(jù)保存在OSS上,默認(rèn)保留天數(shù)為7天。
表格中每一行表示一份基礎(chǔ)備份數(shù)據(jù),并記錄了備份的開始時(shí)間,結(jié)束時(shí)間,備份狀態(tài)(成功/失敗),備份數(shù)據(jù)大小以及一致性時(shí)間點(diǎn)。一致性時(shí)間點(diǎn)表示此基礎(chǔ)備份數(shù)據(jù)可以將集群恢復(fù)至該歷史時(shí)間點(diǎn),并使數(shù)據(jù)庫處于一致性狀態(tài)。
查看一致性恢復(fù)點(diǎn)
一致性恢復(fù)點(diǎn)是指集群可以恢復(fù)到的某個歷史時(shí)間點(diǎn)。用戶在備份恢復(fù)頁面的“恢復(fù)點(diǎn)”頁可以查看當(dāng)前實(shí)例的所有恢復(fù)點(diǎn)。
表格中每一行表示一個一致性恢復(fù)點(diǎn),并記錄了恢復(fù)點(diǎn)的時(shí)間戳,表示該恢復(fù)點(diǎn)可以讓集群恢復(fù)至此歷史時(shí)間點(diǎn)。
查看日志文件列表
日志文件記錄了數(shù)據(jù)庫的所有更改,在集群恢復(fù)時(shí)會使用相應(yīng)的日志文件將集群恢復(fù)至一致性狀態(tài),當(dāng)前用戶集群恢復(fù)的日志文件都保存在OSS上。用戶在備份恢復(fù)頁面的"日志備份"中可查看日志文件列表。
查看備份策略
備份策略是指實(shí)例進(jìn)行備份的周期與時(shí)間段,創(chuàng)建一致性恢復(fù)點(diǎn)的頻率,以及數(shù)據(jù)備份的保留天數(shù)等等。
用戶可在備份恢復(fù)的“備份設(shè)置”中查看和修改備份策略。
修改備份策略
點(diǎn)擊“修改備份配置”按鈕,可以對備份策略進(jìn)行修改。
(2)實(shí)例恢復(fù)步驟
首先查看源實(shí)例上的數(shù)據(jù)
進(jìn)入恢復(fù)頁面
用戶可以在控制臺的實(shí)例列表,數(shù)據(jù)備份列表或恢復(fù)點(diǎn)列表點(diǎn)擊恢復(fù)進(jìn)入實(shí)例恢復(fù)頁面;
恢復(fù)頁面如下:
恢復(fù)實(shí)例的售賣頁面與購買實(shí)例的頁面大體一致,但多了如下限制:
1.當(dāng)前恢復(fù)實(shí)例是master數(shù)量必須選擇1個
2.選擇的實(shí)例segment(computer node)數(shù)量必須與源實(shí)例保持一致
3.選擇的實(shí)例存儲空間必須大于或等于源實(shí)例
選擇恢復(fù)時(shí)間點(diǎn)
在恢復(fù)頁面的"克隆源備份集"的下拉框中選擇需要恢復(fù)實(shí)例到哪一個歷史時(shí)間點(diǎn),即指定一個一致性恢復(fù)點(diǎn)。
點(diǎn)擊購買
用戶點(diǎn)擊購買后,與購買新實(shí)例的流程一樣,需要等待實(shí)例創(chuàng)建完成后,可在控制臺看到新恢復(fù)出的實(shí)例。
恢復(fù)的新實(shí)例
查看恢復(fù)的新實(shí)例上的數(shù)據(jù),可以看到數(shù)據(jù)與源實(shí)例完全一致。
五、總結(jié)
備份恢復(fù)對ADB PG保障數(shù)據(jù)安全的具有很重要的價(jià)值。當(dāng)前備份恢復(fù)功能已經(jīng)應(yīng)用多個用戶場景,并保障了最少為10分鐘的RPO。未來ADB PG備份恢復(fù)功能會繼續(xù)優(yōu)化備份恢復(fù)性能,支持差異化備份,支持更多的存儲介質(zhì),提高用戶使用體驗(yàn),為用戶提供更多的功能、性能和成本優(yōu)化。