RDS PostgreSQL一鍵大版本升級技術解密
一、PostgreSQL行業位置
(一)行業位置
在討論PostgreSQL(下面簡稱為PG)在整個數據庫行業的位置之前,我們先看一下阿里云數據庫在全球的數據庫行業里的位置。
魔力象限領導者
Gartner 2020,阿里云數據庫挺進 全球數據庫魔力象限領導者
PG年度最佳產品獎
2020 PG亞洲大會上,阿里云數據庫專屬集群MyBase榮膺“PG年度最佳產品獎”
接下來,我們看一下PG數據庫在行業中的位置。
全球數據庫排行
PostgreSQL連續3年獲得的最佳數據庫在開源數據庫排名TOP2位置,全球流行度趨勢排名TOP4
廣泛應用
P廣泛運用于各行各業,包含:計算機軟件、信息技術及服務、醫療及健康、金融服務、高等教育、通訊服務等領域
(二)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一鍵大版本升級在產品化、用戶體驗、可驗證可回滾能力上引領行業