一、PostgreSQL行業位置
(一)行業位置
在讨論PostgreSQL(下面簡稱為PG)在整個資料庫行業的位置之前,我們先看一下阿裡雲資料庫在全球的資料庫行業裡的位置。
- 魔力象限上司者

*Gartner 2020,阿裡雲資料庫挺進
全球資料庫魔力象限上司者
- PG年度最佳産品獎
*2020 PG亞洲大會上,阿裡雲資料庫專屬叢集MyBase榮膺“PG年度最佳産品獎”
接下來,我們看一下PG資料庫在行業中的位置。
- 全球資料庫排行
RDS PostgreSQL一鍵大版本更新技術解密
*PostgreSQL連續3年獲得的最佳資料庫在開源資料庫排名TOP2位置,全球流行度趨勢排名TOP4
- 廣泛應用
*PG資料庫廣泛運用于各行各業,包含:計算機軟體、資訊技術及服務、
醫療及健康、金融服務、高等教育、通訊服務等領域
(二)RDS PG VS 自建PG
在大緻了解PG在行業的位置後,接下來再看看阿裡雲RDS PG和自建PG相比有哪些方面的優點。
*如上圖所示,相對于自建PG,RDS PG的優勢主要展現在
可靠性、安全性、智能化和豐富插件四個方面
1.可靠性
RDS PG提供了Logical Slot Failover能力,在主備模式下,當執行個體發生HA切換以後,Logical Slot可以繼續為使用者提供資料同步,這解決了自建PG在HA切換時無法做到資料增量同步的問題。
RDS PG的Standby支援多上遊結點,當HA切換以後,依然可以保持隻讀執行個體讀寫分離功能, 不影響隻讀節點的資料同步。
一鍵大版本更新使得我們的使用者可以産品化地一鍵更新到更高版本的PG,享受PG更新版本的特性與穩定性。
2.安全性
安全性主要分為三個方面。
首先,RDS PG提供雲盤加密功能,使用者隻需要提供一個Key,RDS PG就可以使用這個使用者自定義的Key對資料進行落盤加密。
其次,我們釋出了SSL自定義證書功能,提供用戶端以及服務端的自定義證書,提供用戶端和服務端防僞裝,提升資料庫安全性。
最後,RDS PG提供SGX全加密,這個功能是基于硬體的加密技術,使資料在全鍊路上進行加密。
3.智能化
阿裡雲RDS的整個産品系列都提供了DAS服務。幫助使用者在使用資料庫的過程提供診斷優化能力,DAS可以幫助使用者自發現、自診斷、自優化、自決策地解決使用者資料庫的問題。
4.豐富插件
RDS PG的Ganos時空引擎插件提供了時空資料的存儲、檢索、查詢以及分析能力。
第二個插件是PASE高效向量檢索插件。
第三個插件是oss_fdw,實作資料冷熱分離的場景,将冷資料存儲在更為低價的OSS上,在RDS PG上可以對OSS上的資料進行查詢分析。
通過以上可以發現,相較自建PG,RDS PG在可靠性、安全性、智能化、插件豐富度方面優勢明顯。
二、PostgreSQL版本更新背景
PostgreSQL的更新功能源于使用者使用中遇到的一些問題,在更新中我們也面臨許多挑戰。
1.遇到的問題
- 老版本:過時不維護
過低的資料庫版本,穩定性挑戰, 比如:
1)PG 9.4,版本過老2)低版本,供應鍊問題3)社群不維護,無人兜底
- 高版本:新特性
使用者對于高版本、新特性的強力需求, 比如:
1)增量排序2)并行索引垃圾回收3)索引deduplicate能力4)分區表、聚合性能提升
2.面臨的挑戰
- 彈性能力:極緻彈性
PG 9.4和PG 10.0本地盤版本是跑在實體機形态上的,導緻彈性能力相對較弱,比如:
1)秒級快照2)彈性伸縮能力3)更大存儲空間支援4)備份操作無性能損耗
- 平滑割接: 應用感覺小
在一鍵大版本更新過程中,如何使得使用者應用盡可能的感覺小,平滑的割接是另外一個巨大的挑戰, 比如:
1)保證插件相容性
2)割接、非割接模式3)可復原、可驗證能力4)應用零改動、感覺小5)一鍵大版本更新産品化能力
總結而言,我們期望RDS PG能夠産品化一鍵大版本更新、平滑割接、提供可驗證、可復原能力。
三、PostgreSQL版本更新解密
(一)設計原則
基于以上對産品的思考,我們在設計RDS PG的過程中主要遵循以下四大原則。
1.驗證復原:可驗證、可復原-版本復原:大版本復原-DNS位址:連接配接字元串復原-可驗證: 高版本可驗證能力
2.限制要少:場景全覆寫-DDL限制-表結構限制-資料類型限制-版本全系覆寫
3.一鍵更新:一鍵更新産品化-拒絕更新手冊-一鍵産品化能力-插件相容性适配
4.平滑割接:應用不停服零當機-更新過程應用不停服-更新過程速度快-連接配接位址平滑割接
這四大設計原則的出發點在于,我們希望将複雜留給自己,把簡單留給使用者,為使用者帶去極緻的産品使用體驗。
(二)方案選擇
基于上方的設計原則,我們就要對更新方案進行選擇。對于PG大版本更新,行業内主要有如下存在三種方案。
方案一:邏輯複制
- 優點:
相容性好、平滑割接
- 缺點:
1)庫級别的釋出、訂閱
2)表必須有PK / UK3)不支援DDL、大對象4)外鍵和觸發器禁用5)可能導緻到WAL日志堆積
方案二:pg_upgrade
1)不拷貝資料, 僅中繼資料更新
2)效率高, 2TB資料,更新 < 10s
1)更新預檢查
2)復原驗證政策3)參數、插件相容性4)複雜度高、工作量大、挑戰大
方案三:pg_dump
1)相容性好
2)實作簡單、工作量小
1)僅适用全量遷移
2)效率低下3)應用停服時間長
RDS PG最終選擇限制少、相容性好、效率高、平滑割接的pg_upgrade方案。
(三)更新預檢查
使用者更新之前需要先對執行個體進行更新預檢查,檢查流程可以讓使用者知道執行個體是否可以更新,更新會存在什麼問題,然後使用者再根據錯誤的資訊做相應的修改或适配,使得更新可以順利完成。更新預檢查流程如下:
*更新預檢查流程圖
首先,使用者到前端控制台,根據源端執行個體的版本選擇目标執行個體的版本,然後送出更新預檢查流程,我們的背景會建立一個更新檢查報告。接着初始化使用者選擇的高版本資料目錄,然後生成高版本參數模闆。
然後執行pg_upgrade--check,最終上傳檢查報告到控制台上,使用者在RDS控制台就可以檢視報告,如下是一個典型的更新預檢查報告。
*更新預檢查結果
可以看到,報告包括非常多的檢查項,是否可以更新結果一目了然,幫助使用者更新前屏蔽更新風險。
(四)正式更新
更新預檢查完成且無誤後,就進入了正式更新流程,流程圖如下所示。
如上圖所示,流程圖的每個步驟都包含兩個角色,分别是使用者更新前的源執行個體和更新後的目标執行個體。
更新之前,使用者通過DNS連接配接到源執行個體。當使用者在控制台發起一個大版本更新以後,我們會在背景幫使用者建立一個和源執行個體同版本的目标執行個體的master節點,并且搭建複制鍊路。等待複制鍊路搭建好了,所有的資料同步完畢以後,待使用者的切換時間。時間點到了以後,我們就會對源執行個體做Readonly。
第4步是把源執行個體和目标執行個體進行斷連,斷連後把目标執行個體提升為主庫。
第5步是進行pg_upgrade操作,做中繼資料的更新,是以效率非常高,然後把使用者的DNS位址切到目标執行個體上,此時使用者應用就可以進行讀和寫。
第6步重搭備庫,利用秒級快照能力,可以快速搭建備庫,最終将整個執行個體平滑更新到高版本。
整個更新流程有以下幾個關鍵的地方:
- 應用不停服
1)不停服:使用者應用全程可讀
2)平滑性: 第5步,通過連接配接位址交換來實作,使用者應用無需修改代碼
- 可驗證可復原
1)可驗證: 非割接模式,源執行個體零幹預
2)可復原: 第5步之前,零代價復原,連接配接位址随時可復原
- 效率高
1)速度快: 第5步pg_upgrade2T資料在10秒内可以更新完畢
2)重搭快: 秒級快照,10分鐘左右重搭備庫,與資料量大小無關
- 使用者影響
1)第 3-5 步,僅分鐘級RO時間
總結:應用不停服,零當機,僅分鐘級的RO。
(五)應用不停服零當機
更新的過程做到應用不停服零當機,主要是通過以下四點實作。
1.克隆目标執行個體目标執行個體采用類克隆執行個體方案,源端執行個體一直可用。
2.可驗證、可復原非割接模式提供驗證能力,連接配接位址切換之前,均可復原。
3.DNS位址切換切換使用者連接配接DNS位址到目标執行個體上,避免應用改動。
4.pg_upgrade中繼資料更新pg_upgrade僅中繼資料更新,耗時與資料量大小無關,實測2TB資料,少于10秒。
通過以上四點,最終一鍵平滑地完成大版本更新。
四、PostgreSQL版本更新成果
(一)成果展示
*阿裡雲RDS PG大版本更新在覆寫面、可用性、效率、可驗證可復原能力方面取得顯著成果。
(二)行業對比
*阿裡雲RDS PG一鍵大版本更新在産品化、使用者體驗、可驗證可復原能力上引領行業