最近我的朋友,Omnigres 的創(chuàng)始人尤里跟我聊天,他說想要招一個(gè) PostgreSQL 打包專家 —— 當(dāng)然具體的崗位名字,他起了個(gè) EEE —— Extension Ecoystem Engineer,也就是 “擴(kuò)展生態(tài)工程師”,倒是挺有意思。他發(fā)的這個(gè) JD 吧,是公開的(https://github.com/omnigres/rfc/pull/2/files),我就直接貼在下面了。
稀缺的技能:Linux 打包
我覺得他的這個(gè) JD 有點(diǎn)兒過分,DevRel + SRE + DBA + Building Engineer + PostgreSQL 專精 六邊形戰(zhàn)士,簡(jiǎn)直是照著我寫的,但老馮還真沒見過其他有這種組合的人,所以我還是建議他老老實(shí)實(shí)找一個(gè)精通 Debian/EL 打包的構(gòu)建工程師更實(shí)際一些…。但盡管如此,我認(rèn)為難度還是挺大的,因?yàn)槭煜?“打包構(gòu)建” 這個(gè)技能的人,咱都不能說用”稀缺“來形容了(更稀缺的應(yīng)該是 DevRel)。
當(dāng)然這里其實(shí)上下文語(yǔ)境,說的是 PostgreSQL 數(shù)據(jù)庫(kù)內(nèi)核/擴(kuò)展在 Linux 操作系統(tǒng)上的構(gòu)建打包。主要是 C 和 C++,還有一些 Rust,Java,Go 之類的擴(kuò)展與工具。打包的產(chǎn)物主要是 RPM 和 DEB 包,以 APT / YUM 軟件倉(cāng)庫(kù)的形式交付。老馮認(rèn)為,這是一個(gè)相當(dāng)不為人知的高價(jià)值稀缺技能。
什么時(shí)候意識(shí)到這一點(diǎn)?
老馮第一次意識(shí)到構(gòu)建打包這個(gè)事是在 2017 年,那時(shí)候我去聊 Pivotal,面試官就問了我一嘴,你會(huì)打包嗎,我們現(xiàn)在沒有會(huì)這個(gè)的。我就嘀咕,什么包? RPM 包?嘿還真是。后來 Pivotal 出來的姚老板(YMatrix)也問過我這個(gè)事,你是不是打包構(gòu)建比較熟悉,我們現(xiàn)在就特別缺這個(gè),又讓我加深了印象。
后來其實(shí)我也看過許多國(guó)內(nèi)國(guó)外的數(shù)據(jù)庫(kù)公司發(fā)布的軟件,打包這一塊確實(shí)慘不忍睹。比如之前的 Greenplum 是怎么交付給客戶的呢?是一個(gè) CentOS 7.9 RPM 包。啊對(duì),這個(gè)軟件它就提供一個(gè) EL 7.9 RPM 包,您想要在 EL 8, EL9,或者 Ubuntu / Debian 或者其他 Linux 上運(yùn)行?拜拜了您吶!
包括阿里云的 PolarDB for PG ,瀚高的 IvorySQL,本來也就是一兩個(gè) EL RPM 包的樣子,在老馮的 Push 下總算是支持齊活主流 Linux 發(fā)行版了。MySQL 兼容的 OpenHalo 內(nèi)核和 OrioleDB ,干脆就是我直接自己上替他們打包了。
![]()
構(gòu)建打包的價(jià)值
打包這個(gè)技能很稀缺,但價(jià)值在哪里?其實(shí)你會(huì)發(fā)現(xiàn),絕大多數(shù)終端用戶 并不在乎你是不是開源,他們?cè)诤醯氖怯袥]有一個(gè)穩(wěn)定可靠(最好免費(fèi))的二進(jìn)制軟件包可以下載。就比如說 Greenplum 閉源了,但現(xiàn)在還時(shí)不時(shí)的有朋友來管我要 Greenplum 的 RPM 包。姚老板的 YMatrix (GP7 閉源分支)雖說是閉源商業(yè)軟件,但因?yàn)槊赓M(fèi)提供試用下載,大家也照樣能用著,誰(shuí)管你開不開源。
更鮮活的例子是—— 源代碼其實(shí)還是在那里的,但是你把二進(jìn)制產(chǎn)物(鏡像)給直接刪掉了,這就影響到終端用戶了 —— 你開不開源其實(shí)對(duì)用戶毛影響都沒有。真正會(huì)出現(xiàn)供應(yīng)鏈卡脖子問題的,從來都不是軟件的源代碼,而是軟件制成品。
構(gòu)建打包讓開源軟件自主可控
開源專家 Tison在他的公眾號(hào)文章《》和 《》其實(shí)深入聊過這個(gè)問題。結(jié)論就是:開源軟件是沒法斷供的,但是開源制品是可以斷供的 —— 想要安心使用開源軟件,最重要的還是擁有一份本地的軟件副本,或者建設(shè)自己的軟件倉(cāng)庫(kù)。這里的核心就是打包構(gòu)建。
就比如最近的 《》這件事,全世界幾乎所有鏡像站都跟 PGDG 上游失去同步了,停留在五個(gè)月前的過時(shí)版本。目前全世界只有德國(guó)的 XTOM,俄羅斯的 YANDEX,和老馮在中國(guó)的 PIGSTY 提供手動(dòng)更新的 PGDG 最新軟件鏡像。
當(dāng)然,鏡像站也只不過是同步一下人家做好的軟件二進(jìn)制制成品,退一萬(wàn)步講,如果 PGDG 不是停止增量同步而是直接徹底鎖死。那你要是想完全獨(dú)立從零搭建起一個(gè)軟件倉(cāng)庫(kù)出來,針對(duì) RISC-V,MIPS ,ARM 等亂七八糟的國(guó)產(chǎn)架構(gòu)分門別類構(gòu)建,那么打包構(gòu)建依然是繞不過去的一道門檻。
打包和打包不一樣
當(dāng)然有人會(huì)說,哎呀,都是開源軟件,你可以自己從源代碼編譯呀?這話說的不假,使用現(xiàn)代語(yǔ)言編寫的軟件已經(jīng)針對(duì)打包構(gòu)建流程做了很多優(yōu)化了。比如,用 Go 語(yǔ)言寫的程序就非常容易構(gòu)建打包,甚至還有 goreleaser 這樣的神器,可以一鍵幫跨平臺(tái)構(gòu)建所有組合,生成 RPM / DEB 包,構(gòu)建并推送 Docker 鏡像然后自動(dòng)創(chuàng)建 GitHub Release ,而你讓 Vibe Coding 幫你實(shí)現(xiàn)這樣的工作流可能都要不了半個(gè)小時(shí)。
但是,我們說的并不是這些,而是像 Debian,PostgreSQL 這樣的巨無霸生態(tài)型項(xiàng)目(基本上基于 C / C++)。而且,構(gòu)建打包 PostgreSQL 數(shù)據(jù)庫(kù),可不是幾個(gè) RPM 包就完事了。我這么說,現(xiàn)在我提供的10個(gè)發(fā)行版Linux發(fā)行版 x 5個(gè)PG大版本,再加上擴(kuò)展和工具,總共有4萬(wàn)多個(gè)左右的 RPM/DEB 包。
打包構(gòu)建并不是一件輕松的工作:要處理好各種依賴,glibc,icu,openssl,PostGIS 帶著的一顆碩大無朋的依賴數(shù)。各種插件依賴的各種奇奇怪怪的系統(tǒng)庫(kù),不同操作系統(tǒng)發(fā)行版甚至是大版本上的版本沖突, cmake,make,ninja,cargo 各種構(gòu)建工具的用法,諸如此類。
你為什么不用Docker?
Docker 似乎是來 “解決” 打包構(gòu)建的一種捷徑 —— 一次構(gòu)建,到處運(yùn)行 —— 才怪。我的意思是:用 Docker 你可以不用處理 Linux 操作系統(tǒng)大版本的組合因子(比如 el9, d12, u24 這種差異),但你依然要針對(duì) PG 大版本,系統(tǒng)架構(gòu),以及幾百個(gè)擴(kuò)展和他們的多個(gè)版本進(jìn)行構(gòu)建。第二,如果你去看 Postgres Docker 鏡像,就會(huì)發(fā)現(xiàn)其實(shí)它的 Dockerfile 里也還是用 apt install 去安裝 PGDG 的 DEB 包的…。Linux 軟件包是 Docker 鏡像的上游,而不是相反。
第三,PG 的擴(kuò)展是它區(qū)別于其他數(shù)據(jù)庫(kù)的核心特色之一,而 Docker 容器鏡像至今也沒有辦法優(yōu)雅解決 PostgreSQL 擴(kuò)展插件持久化的問題 —— 你不知道用戶到底需要幾百個(gè)擴(kuò)展中的哪一個(gè),然而全部裝上又顯得過于臃腫和愚蠢。Alvaro 在這一方面正在進(jìn)行一些前沿探索,但老馮感覺距離成熟實(shí)踐還有距離。
老馮怎么干起打包了?
老馮干打包這個(gè)事也就是從兩年前,那時(shí)候我要提供在 Pigsty 里自建 Supabase 的能力,但是 Supabase 用到了十幾個(gè) PG 的擴(kuò)展插件,這些擴(kuò)展插件大部份都不在 PGDG 官方的二進(jìn)制倉(cāng)庫(kù)里面。我問了問 PGDG YUM 倉(cāng)庫(kù)的維護(hù)者 Devrim,他說,Rust 寫的擴(kuò)展永遠(yuǎn)也進(jìn)不了 PGDG 倉(cāng)庫(kù),因?yàn)榫幾g太慢了!所以老馮就只好自己上手,給這些擴(kuò)展打好了 RPM 包。后來既然都打了 RPM 包,就干脆把 DEB 包也做了 —— 再后來,既然都已經(jīng)支持了十幾個(gè) PG 擴(kuò)展,那干嘛不把 PGDG 官方倉(cāng)庫(kù)不支持的兩百多個(gè) PG 擴(kuò)展也打包交付了?
一步一步走到今天,老馮獨(dú)立維護(hù)了一個(gè) PostgreSQL 擴(kuò)展倉(cāng)庫(kù),里面包含了 9 種風(fēng)味的 PG 內(nèi)核,以及兩百多款 PG 擴(kuò)展(加上 PGDG 的總共 423 個(gè)可用擴(kuò)展)。目前是 全世界 PG 生態(tài)收錄最多可用擴(kuò)展制品的倉(cāng)庫(kù)了。不謙虛的說,說起 PostgreSQL 打包構(gòu)建,我和 Devrim(YUM 倉(cāng)庫(kù)),Christoph(APT 倉(cāng)庫(kù)),álvaro(OCI 倉(cāng)庫(kù)),David Wheeler(PGXN) 算是這個(gè)賽道的頂級(jí)玩家了。
最直觀的例子就是,Supabase 作為目前 AI 賽道的當(dāng)紅炸子雞與數(shù)據(jù)庫(kù)最大贏家,本應(yīng)吸引大量廠商入局,但直到現(xiàn)在,有能力提供自建 Supabase 能力的開源 PostgreSQL 發(fā)行版,目前也只有老馮的 Pigsty (基于原生 Linux RPM/DEB),以及 Alvaro 的 StackGres(基于 OCI 鏡像與 Kubernetes )
![]()
—— 因?yàn)槲覀兌冀鉀Q了這些 Supabase 專有擴(kuò)展的構(gòu)建打包分發(fā)問題。其實(shí)卡點(diǎn)就在這里,Supabase 即使把他的擴(kuò)展源代碼開源出來(后面還要換 OrioleDB 內(nèi)核),又有幾個(gè)人懂?又有幾個(gè)用戶有能力用起來?
說到底,單純懂 EL / Debian Linux 打包的工程師其實(shí)還是有一些的,但是同時(shí)熟悉 PostgreSQL 生態(tài),能為 PostgreSQL 幾百個(gè)包在十幾個(gè)系統(tǒng)發(fā)行版構(gòu)建的人確實(shí)是鳳毛麟角了。
懂打包的鳳毛麟角
在現(xiàn)實(shí)實(shí)踐中,老馮發(fā)現(xiàn)這個(gè)技能真的太稀缺了,就像尤里問我誰(shuí)還懂這個(gè),國(guó)內(nèi)就甭說了,就算是全球,我知道的可能 ZoomboDB 那個(gè)作者(pgrx 作者)懂這個(gè)(被 ParadeDB 挖走了),別的我還真想不出來有誰(shuí)能做好這個(gè)事情了。
比如說,PG 生態(tài)中,這么多擴(kuò)展,能有有能力直接在發(fā)布的時(shí)候提供主流 Linux RPM / DEB 包的,我知道的就只有 ParadeDB 一家(pg_search),而他們會(huì)做這個(gè)事是因?yàn)樗麄儼l(fā)版太頻繁了,我實(shí)在懶得替他們打包了,所以手把手教他們應(yīng)該怎么打 RPM/DEB 包。另一個(gè)會(huì)自己打包的是 pgroonga,timescaledb,citus,但是怎么說呢,打的包和 PGDG 規(guī)范不統(tǒng)一,而且經(jīng)常缺這個(gè)缺那個(gè) —— 比如 citus 一直就缺 ARM 的包,Timescale 則缺幾個(gè)特定的發(fā)行版,pgronnga 針對(duì)的是 Debian 自帶的 PG 去打的包 —— 諸如此類。
再比如說國(guó)內(nèi)的數(shù)據(jù)庫(kù)廠商, 之前阿里云的 PolarDB for PG 和 IvorySQL 也就幾個(gè) EL RPM 包,后來我使勁兒 push 他們,總算是 Pigsty 支持的 10 個(gè)主流操作系統(tǒng)發(fā)行版現(xiàn)在都有包了。我也幫他們解決過幾個(gè)低級(jí)打包錯(cuò)誤。另外那個(gè) MySQL 兼容的 OpenHalo,老馮干脆自己上了,替他們打好了 DEB/RPM 包。同理,Supabase 收購(gòu)的 OrioleDB 看上去也沒有這個(gè)能力,所以我也替他們做了 RPM / DEB ,在 Pigsty 中開箱即用。
![]()
小結(jié)
很多時(shí)候,價(jià)值源于非共識(shí),打包構(gòu)建就屬于這種半瓶水外行看上去 “不就是編譯封裝一下”,但實(shí)際上相當(dāng)稀缺的技能,脖子卡的嗷嗷叫的技能。
References
![]()
![]()
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.