有時候一個隨手睇到嘅Reddit帖文,會將我拖入成個晚上嘅兔子洞入面,呢個就係嗰樣嘅一個晚上。有人發帖討論好似YouTube呢類公司係點樣為數據庫做擴展嘅,留言區擠滿咗話自己完全搞唔清楚一個系統點可以扛到咁大負載嘅人。呢個問題一直縈繞喺我個腦入面,於是我開始查資料。
YouTube到底係點做嘅
查落先發現,YouTube跑緊MySQL,用Vitess做分片。Vitess最初就係YouTube自己開發嘅一套系統,等MySQL可以跨數千個分片做水平擴展,同時喺應用層睇落依然好似係單一數據庫。睇到呢度,我即刻返過頭審視自己嘅架構,問自己:我點解冇咁做?
盤點吓自己實際喺跑咩
我有兩部伺服器。一部喺Docker入面跑住一個共享嘅PostgreSQL實例,服務住好幾個細網站。另一部專門畀Immich用,用嘅係帶pgvector擴展嘅Postgres,用於相片嘅相似度搜尋。唯一跑MySQL嘅係我阿媽個網站doc-agnes.com,用WordPress搭嘅,嗰個我唔敢郁。我目前仲未有足夠嘅信心喺唔冒住整丟數據風險嘅情況下遷移一個正喺度跑緊嘅WordPress數據庫,而且老實講,我亦唔太肯定WordPress同Postgres配合得到底好唔好。
跌入Citus同Aurora嘅坑
於是我去查Postgres有冇自己嘅「Vitess」。查到咗Citus,一個用於分散式/分片Postgres嘅擴展,但由我搵到嘅大多數對比嚟睇,喺純粹嘅水平MySQL式擴展上,佢比Vitess要慢。呢個令我開始嘀咕:或者我一開始就應該用MySQL加Vitess嚟搭,而唔係Postgres。
然後Aurora進入咗視野。AWS冇依賴標準嘅MySQL或Postgres內核,而係喺Aurora底層自建咗一套儲存引擎,嗰啲數字確實令我印象深刻。喺我讀到嘅唔少基準測試入面,佢都跑贏咗另外兩者。但當我叫Gemini將呢三者放埋一齊權衡嗰陣,佢指出Aurora嘅標準配置喺持續極高寫入吞吐量下會開始食力(粗略數字大概喺每秒15萬次寫入左右會撞到瓶頸),呢個令佢喺真正大規模、寫入密集嘅負載場景下打咗個折扣。
跟住我比較咗運維複雜度。MySQL加Vitess嘅運維難度遙遙領先,因為分片邏輯、代理同連接處理基本上都要自己搞掂。Citus作為一個Postgres擴展,相對嚟講輕鬆得多——佢係搭建喺我已經熟悉嘅數據庫之上,而唔係要我從頭手工拼一整套全新嘅分散式系統。就係喺呢一刻,我先明白點解而家咁多公司預設揀Postgres:唔一定係因為佢喺每項基準測試入面都更快,而係因為運維成本低得多。(AWS較新嘅分散式Postgres產品Aurora Limitless睇落都幾扎實。)
一次市場份額嘅小插曲
喺呢個漩渦嘅某個環節,我順手查咗一下數據庫市場份額,發現Postgres喺開發者調查排名入面位居榜首,MySQL緊隨其後——不過具體排序會隨你睇嘅係邊種調查而變(安裝基數,定係開發者自己話緊喺用/想用嘅),排名會互換。無論點,Postgres而家嘅勢頭係顯而易見嘅。
Redis都被提到咗。我一直以為佢純粹就係一個快取層,Gemini話我大體上冇錯,但技術上嚟講佢其實係一個完整嘅記憶體數據庫,而唔止係坐喺某個數據庫前面嘅快取。佢嘅速度嚟自RAM比磁碟快好多呢一點。我之前模糊唔清嘅地方係,Redis其實仍然可以喺背景持久化去磁碟(快照,或者一份只追加寫入嘅日誌),所以重啟並唔一定意味住數據全部丟失。佢並唔似我以為咁純粹係臨時性嘅。
現實檢驗
讀完咁多嘢、做完咁多對比、對住自己大概永遠都用唔上嘅架構嘀咕咗半日之後,我忍唔住笑咗自己一下。我根本冇YouTube嗰種問題。每個項目大概就得四個用戶,仲全部都係我真正識嘅人;我存嘅最重嘅嘢就係Immich入面嘅相片。冇分片,冇Vitess,亦冇每秒15萬次寫入。只有我自己、Postgres,以及一份非常細、非常知足嘅數據集。不過好彩,而家起碼理論我係識咗。