資料系統的未來:拆開的資料庫、Kappa,與端到端的正確性(完結)

· tech

#distributed-systems#book-notes#data-engineering

📑 目錄

終章。前面十一章把儲存、複製、分區、交易、共識、批次、串流一塊塊講完,Kleppmann 在這章把它們收攏成一個大膽的視角:別再把「資料庫」當成一個盒子——把它拆開。 而讀到這裡你會發現,這個「未來」你其實已經住在裡面了。

Unbundling:你的資料平台,就是一台拆開的資料庫

一台資料庫,其實是一堆功能的捆綁包:儲存引擎、索引、快取、materialized view、複製 log——全部裝在一個盒子裡,由 DB 內部保證它們一致。Kleppmann 的觀察是:現代資料平台正在把這個盒子拆開——每個功能由一個特化系統負責,而讓它們一致的膠水,正是上一篇的那條 log:

傳統:一個盒子,全部捆在一起 儲存引擎 索引 快取 mat. view log ↓ 拆開(unbundle),每個功能交給一個特化系統 ↓ log 當中樞(Kafka)— 定順序的膠水 OLTP DB儲存 + 交易 Elasticsearch= 索引 Redis= 快取 數倉 / Gold 層= materialized view 每個系統都是 log 的 follower,照同一順序消費 → 各自一致 你的資料平台 = 一台「由內翻外」的資料庫;讓它不散架的,是那條 log
上半是傳統資料庫:儲存、索引、快取、materialized view 捆在一個盒子裡,由 DB 內部保證一致。下半是 unbundling:同樣的功能被特化系統各自認領——OLTP DB 管儲存與交易、Elasticsearch 就是拆出來的索引、Redis 就是拆出來的快取、數倉就是拆出來的 materialized view——而讓它們一致的,是中間那條 log(每個系統都是它的 follower)。換句話說:你養的那個資料平台,本質上是一台由內翻外的資料庫——設計它的紀律,也該跟資料庫一樣:log 定順序、衍生資料可重建

這個視角的實用價值:「幫平台加一個搜尋功能」= 「幫這台大資料庫建一個索引」——做法也一樣:從 log 重放、長出一個新 follower,不碰現有系統。資料庫內建索引時你信任它自動維護;拆開之後,維護「索引跟上主資料」的責任落到了你頭上——這正是資料工程師這個職業存在的深層原因。

Lambda vs Kappa:兩套邏輯,還是一條 log

「同一份資料要同時算得準(批次)又算得快(即時)」,歷史上有兩個答案:

Lambda:兩條軌 資料進來 batch layer定期全量重算(準) speed layer串流補即時(快) 查詢:兩邊結果要「合併」 ✗ 同一套邏輯寫兩份(批次+串流),兩倍維護 Kappa:一條 log 一條可重播的 log(留得夠久) 串流 job v1一直在線上算 串流 job v2要重算:從頭重放 追上後切換 → 一套程式碼,重算=重放 前提:log 留得夠久、重放的 throughput 撐得住 邏輯改版頻繁、養不起兩套 → kappa;重算量大到串流重放不划算 → 保留批次那條
Lambda:batch layer 定期全量重算(準)+ speed layer 串流補即時(快),查詢時合併兩邊——代價是同一套業務邏輯要用兩個框架寫兩份,兩倍維護,兩邊對不上時排查地獄。Kappa:只留一條可重播的 log 和一套串流邏輯;要重算歷史(改了邏輯、修了 bug),就起一個新 job 從 log 開頭重放、追上後切換——批次的「人為容錯」用串流的形式做到了。前提是 log 留得夠久、重放 throughput 撐得住;流批統一的引擎(同一套程式跑兩種模式)也在從框架層消掉「寫兩份」這個痛

最誠實的一課:正確性的最後一哩,在端到端

全書最後的技術段落,Kleppmann 潑了一盆重要的冷水:別盲信任何中間件的保證。 exactly-once 很強,但它的保證有邊界——資料出了那個邊界(寫進外部系統、呼叫外部 API、使用者按兩次送出),語意就斷了。真正可靠的去重,只有端到端的做法:請求從源頭就帶一個唯一的 request id(冪等鍵),一路帶到最終寫入的地方,由終點做最後的把關——這是網路領域古老的 end-to-end argument 在資料系統的重演,也是 冪等那條紀律的理論根據。再往上一層,他主張系統要稽核(audit):定期驗證資料的完整性(數量對不對、加總對不對),而不是假設「pipeline 沒報錯 = 資料是對的」——沒報錯只代表沒發現錯。這句話,正是資料品質工程的起點。

反思

「平台是一台拆開的資料庫」——這個視角把我的整張地圖翻了過來

Unbundling 是我讀完全書後座力最強的觀念。回頭看我自己養的平台:Kafka 是 commit log、Elasticsearch 是索引、Redis 是快取、數倉的 Gold 層是 materialized view——我每天維運的,其實是一台攤開在 K8s 上的巨型資料庫,而我的職責,就是資料庫核心工程師的職責:保證這些「拆開的元件」跟主資料一致。這個視角立刻給了我兩條紀律:設計上,任何新元件都該是 log 的 follower,而不是另一個雙寫的受害者;債務上,資料庫用交易「免費」保證的一致性,拆開後每一分都要自己還——所以拆之前先問:這個功能,單機資料庫真的做不到了嗎?又是那道題

「沒報錯 ≠ 資料是對的」——稽核是資料工程的下一站

end-to-end 那一課,對我這個角色是量身訂做的提醒。做 SRE 久了,很容易把「監控綠燈」當成「一切正常」;但 Kleppmann 點破:pipeline 全綠,只代表系統沒報錯,不代表資料是對的——筆數悄悄少了 2%、某個 join 默默對空、金額欄位單位錯了,監控一聲不吭。系統的可靠性靠監控,資料的正確性靠稽核——後者是獨立驗證(對帳、數量核對、不變量檢查),不是看 log。這正是我接下來想開的 Data Quality 系列要處理的主題:把「資料對不對」從一種祈禱,變成一門有指標、有告警、有 SLO 的工程。DDIA 的最後一章,剛好是那個系列最好的引言。

全書收官:它給的不是答案,是一套提問的框架

十二章讀完,如果要我說 DDIA 到底給了什麼,我的答案是:一套永遠不會過時的問題清單。 資料怎麼擺(讀的形狀)?狀態在哪、誰是 source of truth?順序由誰決定、被什麼保護?保證的邊界在哪、最後一哩誰把關?——工具會換(書裡不少範例已經老了),但這些問題會問到你退休。這也是整個部落格走到這裡的收束:DDIA 是原理層,Redis/Kafka/Spark/K8s 是實作層,SRE/LGTM 是維運層——同一張網,原理讓你看懂工具,工具讓你驗證原理,維運讓你為兩者付出代價、也收穫敬畏。最後,Kleppmann 選擇用整整一節倫理收尾:資料是權力,而權力需要自律——我們這行天天在決定「記錄什麼、留多久、給誰看」,那從來不只是技術決策。能力越大的系統,越需要克制的工程師——這本書,收在這裡。