RDS PostgreSQL一鍵大版本升級(jí)技術(shù)解密
一、PostgreSQL行業(yè)位置
(一)行業(yè)位置
在討論P(yáng)ostgreSQL(下面簡稱為PG)在整個(gè)數(shù)據(jù)庫行業(yè)的位置之前,我們先看一下阿里云數(shù)據(jù)庫在全球的數(shù)據(jù)庫行業(yè)里的位置。
魔力象限領(lǐng)導(dǎo)者
Gartner 2020,阿里云數(shù)據(jù)庫挺進(jìn) 全球數(shù)據(jù)庫魔力象限領(lǐng)導(dǎo)者
PG年度最佳產(chǎn)品獎(jiǎng)
2020 PG亞洲大會(huì)上,阿里云數(shù)據(jù)庫專屬集群MyBase榮膺“PG年度最佳產(chǎn)品獎(jiǎng)”
接下來,我們看一下PG數(shù)據(jù)庫在行業(yè)中的位置。
全球數(shù)據(jù)庫排行
PostgreSQL連續(xù)3年獲得的最佳數(shù)據(jù)庫在開源數(shù)據(jù)庫排名TOP2位置,全球流行度趨勢排名TOP4
廣泛應(yīng)用
P廣泛運(yùn)用于各行各業(yè),包含:計(jì)算機(jī)軟件、信息技術(shù)及服務(wù)、醫(yī)療及健康、金融服務(wù)、高等教育、通訊服務(wù)等領(lǐng)域
(二)RDS PG VS 自建PG
在大致了解PG在行業(yè)的位置后,接下來再看看阿里云RDS PG和自建PG相比有哪些方面的優(yōu)點(diǎn)。
如上圖所示,相對(duì)于自建PG,RDS PG的優(yōu)勢主要體現(xiàn)在:可靠性、安全性、智能化和豐富插件四個(gè)方面
1.可靠性
RDS PG提供了Logical Slot Failover能力,在主備模式下,當(dāng)實(shí)例發(fā)生HA切換以后,Logical Slot可以繼續(xù)為用戶提供數(shù)據(jù)同步,這解決了自建PG在HA切換時(shí)無法做到數(shù)據(jù)增量同步的問題。
RDS PG的Standby支持多上游結(jié)點(diǎn),當(dāng)HA切換以后,依然可以保持只讀實(shí)例讀寫分離功能, 不影響只讀節(jié)點(diǎn)的數(shù)據(jù)同步。
一鍵大版本升級(jí)使得我們的用戶可以產(chǎn)品化地一鍵升級(jí)到更高版本的PG,享受PG更新版本的特性與穩(wěn)定性。
2.安全性
安全性主要分為三個(gè)方面。
首先,RDS PG提供云盤加密功能,用戶只需要提供一個(gè)Key,RDS PG就可以使用這個(gè)用戶自定義的Key對(duì)數(shù)據(jù)進(jìn)行落盤加密。
其次,我們發(fā)布了SSL自定義證書功能,提供客戶端以及服務(wù)端的自定義證書,提供客戶端和服務(wù)端防偽裝,提升數(shù)據(jù)庫安全性。
最后,RDS PG提供SGX全加密,這個(gè)功能是基于硬件的加密技術(shù),使數(shù)據(jù)在全鏈路上進(jìn)行加密。
3.智能化
阿里云RDS的整個(gè)產(chǎn)品系列都提供了DAS服務(wù)。幫助用戶在使用數(shù)據(jù)庫的過程提供診斷優(yōu)化能力,DAS可以幫助用戶自發(fā)現(xiàn)、自診斷、自優(yōu)化、自決策地解決用戶數(shù)據(jù)庫的問題。
4.豐富插件
RDS PG的Ganos時(shí)空引擎插件提供了時(shí)空數(shù)據(jù)的存儲(chǔ)、檢索、查詢以及分析能力。
第二個(gè)插件是PASE高效向量檢索插件。
第三個(gè)插件是oss_fdw,實(shí)現(xiàn)數(shù)據(jù)冷熱分離的場景,將冷數(shù)據(jù)存儲(chǔ)在更為低價(jià)的OSS上,在RDS PG上可以對(duì)OSS上的數(shù)據(jù)進(jìn)行查詢分析。
通過以上可以發(fā)現(xiàn),相較自建PG,RDS PG在可靠性、安全性、智能化、插件豐富度方面優(yōu)勢明顯。
二、PostgreSQL版本升級(jí)背景
PostgreSQL的升級(jí)功能源于用戶使用中遇到的一些問題,在升級(jí)中我們也面臨許多挑戰(zhàn)。
1.遇到的問題
老版本:過時(shí)不維護(hù)
過低的數(shù)據(jù)庫版本,穩(wěn)定性挑戰(zhàn), 比如:
1)PG 9.4,版本過老2)低版本,供應(yīng)鏈問題3)社區(qū)不維護(hù),無人兜底
高版本:新特性
用戶對(duì)于高版本、新特性的強(qiáng)力需求, 比如:
1)增量排序2)并行索引垃圾回收3)索引deduplicate能力4)分區(qū)表、聚合性能提升
2.面臨的挑戰(zhàn)
彈性能力:極致彈性
PG 9.4和PG 10.0本地盤版本是跑在物理機(jī)形態(tài)上的,導(dǎo)致彈性能力相對(duì)較弱,比如:
1)秒級(jí)快照2)彈性伸縮能力3)更大存儲(chǔ)空間支持4)備份操作無性能損耗
平滑割接: 應(yīng)用感知小
在一鍵大版本升級(jí)過程中,如何使得用戶應(yīng)用盡可能的感知小,平滑的割接是另外一個(gè)巨大的挑戰(zhàn), 比如:
1)保證插件兼容性
2)割接、非割接模式3)可回滾、可驗(yàn)證能力4)應(yīng)用零改動(dòng)、感知小5)一鍵大版本升級(jí)產(chǎn)品化能力
總結(jié)而言,我們期望RDS PG能夠產(chǎn)品化一鍵大版本升級(jí)、平滑割接、提供可驗(yàn)證、可回滾能力。
三、PostgreSQL版本升級(jí)解密
(一)設(shè)計(jì)原則
基于以上對(duì)產(chǎn)品的思考,我們?cè)谠O(shè)計(jì)RDS PG的過程中主要遵循以下四大原則。
1.驗(yàn)證回滾:可驗(yàn)證、可回滾-版本回滾:大版本回滾-DNS地址:連接字符串回滾-可驗(yàn)證: 高版本可驗(yàn)證能力
2.限制要少:場景全覆蓋-DDL限制-表結(jié)構(gòu)限制-數(shù)據(jù)類型限制-版本全系覆蓋
3.一鍵升級(jí):一鍵升級(jí)產(chǎn)品化-拒絕升級(jí)手冊(cè)-一鍵產(chǎn)品化能力-插件兼容性適配
4.平滑割接:應(yīng)用不停服零宕機(jī)-升級(jí)過程應(yīng)用不停服-升級(jí)過程速度快-連接地址平滑割接
這四大設(shè)計(jì)原則的出發(fā)點(diǎn)在于,我們希望將復(fù)雜留給自己,把簡單留給用戶,為用戶帶去極致的產(chǎn)品使用體驗(yàn)。
(二)方案選擇
基于上方的設(shè)計(jì)原則,我們就要對(duì)升級(jí)方案進(jìn)行選擇。對(duì)于PG大版本升級(jí),行業(yè)內(nèi)主要有如下存在三種方案。
方案一:邏輯復(fù)制
優(yōu)點(diǎn):
兼容性好、平滑割接
缺點(diǎn):
1)庫級(jí)別的發(fā)布、訂閱
2)表必須有PK / UK3)不支持DDL、大對(duì)象4)外鍵和觸發(fā)器禁用5)可能導(dǎo)致到WAL日志堆積
方案二:pg_upgrade
優(yōu)點(diǎn):
1)不拷貝數(shù)據(jù), 僅元數(shù)據(jù)升級(jí)
2)效率高, 2TB數(shù)據(jù),升級(jí) < 10s
缺點(diǎn):
1)升級(jí)預(yù)檢查
2)回滾驗(yàn)證策略3)參數(shù)、插件兼容性4)復(fù)雜度高、工作量大、挑戰(zhàn)大
方案三:pg_dump
優(yōu)點(diǎn):
1)兼容性好
2)實(shí)現(xiàn)簡單、工作量小
缺點(diǎn):
1)僅適用全量遷移
2)效率低下3)應(yīng)用停服時(shí)間長
RDS PG最終選擇限制少、兼容性好、效率高、平滑割接的pg_upgrade方案。
(三)升級(jí)預(yù)檢查
用戶升級(jí)之前需要先對(duì)實(shí)例進(jìn)行升級(jí)預(yù)檢查,檢查流程可以讓用戶知道實(shí)例是否可以升級(jí),升級(jí)會(huì)存在什么問題,然后用戶再根據(jù)錯(cuò)誤的信息做相應(yīng)的修改或適配,使得升級(jí)可以順利完成。升級(jí)預(yù)檢查流程如下:
升級(jí)預(yù)檢查流程圖
首先,用戶到前端控制臺(tái),根據(jù)源端實(shí)例的版本選擇目標(biāo)實(shí)例的版本,然后提交升級(jí)預(yù)檢查流程,我們的后臺(tái)會(huì)創(chuàng)建一個(gè)升級(jí)檢查報(bào)告。接著初始化用戶選擇的高版本數(shù)據(jù)目錄,然后生成高版本參數(shù)模板。
然后執(zhí)行pg_upgrade--check,最終上傳檢查報(bào)告到控制臺(tái)上,用戶在RDS控制臺(tái)就可以查看報(bào)告,如下是一個(gè)典型的升級(jí)預(yù)檢查報(bào)告。
升級(jí)預(yù)檢查結(jié)果
可以看到,報(bào)告包括非常多的檢查項(xiàng),是否可以升級(jí)結(jié)果一目了然,幫助用戶升級(jí)前屏蔽升級(jí)風(fēng)險(xiǎn)。
(四)正式升級(jí)
升級(jí)預(yù)檢查完成且無誤后,就進(jìn)入了正式升級(jí)流程,流程圖如下所示。
如上圖所示,流程圖的每個(gè)步驟都包含兩個(gè)角色,分別是用戶升級(jí)前的源實(shí)例和升級(jí)后的目標(biāo)實(shí)例。
升級(jí)之前,用戶通過DNS連接到源實(shí)例。當(dāng)用戶在控制臺(tái)發(fā)起一個(gè)大版本升級(jí)以后,我們會(huì)在后臺(tái)幫用戶創(chuàng)建一個(gè)和源實(shí)例同版本的目標(biāo)實(shí)例的master節(jié)點(diǎn),并且搭建復(fù)制鏈路。等待復(fù)制鏈路搭建好了,所有的數(shù)據(jù)同步完畢以后,待用戶的切換時(shí)間。時(shí)間點(diǎn)到了以后,我們就會(huì)對(duì)源實(shí)例做Readonly。
第4步是把源實(shí)例和目標(biāo)實(shí)例進(jìn)行斷連,斷連后把目標(biāo)實(shí)例提升為主庫。
第5步是進(jìn)行pg_upgrade操作,做元數(shù)據(jù)的升級(jí),所以效率非常高,然后把用戶的DNS地址切到目標(biāo)實(shí)例上,此時(shí)用戶應(yīng)用就可以進(jìn)行讀和寫。
第6步重搭備庫,利用秒級(jí)快照能力,可以快速搭建備庫,最終將整個(gè)實(shí)例平滑升級(jí)到高版本。
整個(gè)升級(jí)流程有以下幾個(gè)關(guān)鍵的地方:
應(yīng)用不停服
1)不停服:用戶應(yīng)用全程可讀
2)平滑性: 第5步,通過連接地址交換來實(shí)現(xiàn),用戶應(yīng)用無需修改代碼
可驗(yàn)證可回滾
1)可驗(yàn)證: 非割接模式,源實(shí)例零干預(yù)
2)可回滾: 第5步之前,零代價(jià)回滾,連接地址隨時(shí)可回滾
效率高
1)速度快: 第5步pg_upgrade2T數(shù)據(jù)在10秒內(nèi)可以升級(jí)完畢
2)重搭快: 秒級(jí)快照,10分鐘左右重搭備庫,與數(shù)據(jù)量大小無關(guān)
用戶影響
1)第 3-5 步,僅分鐘級(jí)RO時(shí)間
總結(jié):應(yīng)用不停服,零宕機(jī),僅分鐘級(jí)的RO。
(五)應(yīng)用不停服零宕機(jī)
升級(jí)的過程做到應(yīng)用不停服零宕機(jī),主要是通過以下四點(diǎn)實(shí)現(xiàn)。
1.克隆目標(biāo)實(shí)例目標(biāo)實(shí)例采用類克隆實(shí)例方案,源端實(shí)例一直可用。
2.可驗(yàn)證、可回滾非割接模式提供驗(yàn)證能力,連接地址切換之前,均可回滾。
3.DNS地址切換切換用戶連接DNS地址到目標(biāo)實(shí)例上,避免應(yīng)用改動(dòng)。
4.pg_upgrade元數(shù)據(jù)升級(jí)pg_upgrade僅元數(shù)據(jù)升級(jí),耗時(shí)與數(shù)據(jù)量大小無關(guān),實(shí)測2TB數(shù)據(jù),少于10秒。
通過以上四點(diǎn),最終一鍵平滑地完成大版本升級(jí)。
四、PostgreSQL版本升級(jí)成果
(一)成果展示
阿里云RDS PG大版本升級(jí)在覆蓋面、可用性、效率、可驗(yàn)證可回滾能力方面取得顯著成果。
(二)行業(yè)對(duì)比
阿里云RDS PG一鍵大版本升級(jí)在產(chǎn)品化、用戶體驗(yàn)、可驗(yàn)證可回滾能力上引領(lǐng)行業(yè)