一文解析數(shù)據(jù)庫的三生三世
如果從大學(xué)學(xué)習(xí)數(shù)據(jù)庫管理系統(tǒng)算起,跟數(shù)據(jù)庫結(jié)緣已經(jīng)超過 20 年了?;仡欉^去的職業(yè)生涯,走上數(shù)據(jù)庫這條不歸路也是一個小小的偶然:第一份工作在分小組的時候被分到了 Oracle,就此開始了與數(shù)據(jù)庫的不解之緣。
關(guān)于數(shù)據(jù)庫已經(jīng)有太多太多的內(nèi)容,這里不敢講什么學(xué)術(shù)理論,只是想把自己對數(shù)據(jù)庫的理解做一個梳理,希望能夠幫助那些對數(shù)據(jù)庫感興趣的朋友們更好地理解數(shù)據(jù)庫這個既古老又充滿生機(jī)的玩意兒。
什么是數(shù)據(jù)庫
數(shù)據(jù)庫就是英文的「database」翻譯來的,data + base,顧名思義就是數(shù)據(jù)的根源,數(shù)據(jù)的基礎(chǔ)。那么為什么要有數(shù)據(jù)庫呢?數(shù)據(jù)庫首先是個計算機(jī)軟件,在所謂數(shù)據(jù)庫誕生之前,常用方法可能是程序員自己寫一個小程序來完成數(shù)據(jù)處理分析這樣的工作。
隨著計算機(jī)的普及,越來越多的場景開始使用計算機(jī),產(chǎn)生了越來越多的數(shù)據(jù),也催生了越來越多的數(shù)據(jù)分析需求。為了降低數(shù)據(jù)分析的門檻,讓更多人能夠更方便高效地管理分析數(shù)據(jù),工程師們就打造了一種專門的軟件來幫助人們對數(shù)據(jù)進(jìn)行合理的存儲以提高存取效率,提供易用的接口和豐富的分析算法以方便使用,集成有效的管理工具以提高數(shù)據(jù)安全性等等,這就是數(shù)據(jù)庫,也被稱為數(shù)據(jù)庫管理系統(tǒng)(DBMS,Database management system)。
數(shù)據(jù)庫是一整套數(shù)據(jù)管理體系,包括數(shù)據(jù)存儲的模型、數(shù)據(jù)組織的架構(gòu)、數(shù)據(jù)分析的算法、數(shù)據(jù)管理的工具以及數(shù)據(jù)訪問的接口等等。
舉個例子,糧倉。如果你有一畝三分地,產(chǎn)的糧食剛剛夠一家人吃,吃不完的自己找個缸就放下了,這個缸也只需要方便自己家人使用就行了。隨著你種的地越來越多,比如一萬畝地,生產(chǎn)的糧食根本吃不完,那就必須修建一個專門用來存放糧食的倉庫,同時還要方便不同的商家來拉糧食,為了保證糧食存放的安全和效率,就必須對糧倉進(jìn)行特殊的設(shè)計和處理,比如恒溫恒濕、自動噴淋、傳送系統(tǒng)等等。數(shù)據(jù)庫也是類似的道理。
數(shù)據(jù)庫起源于阿波羅登月計劃,因為當(dāng)時需要大量的數(shù)據(jù)分析人員對大量的數(shù)據(jù)進(jìn)行分析,就不得不開發(fā)一款能夠方便更多人使用的數(shù)據(jù)管理分析軟件。這確實是人類當(dāng)時的燈塔,不得不給 NASA 的工程師們點個贊。
數(shù)據(jù)庫的核心功能是什么
數(shù)據(jù)庫根據(jù)應(yīng)用場景的不同而分為不同的類別,比如最經(jīng)典的分類 OLTP(在線事務(wù)處理)和 OLAP(聯(lián)機(jī)分析處理)。舉個例子,你每天要使用信用卡支付來坐地鐵、買午餐、買飲料、上淘寶購物等等,這每一筆交易都需要后臺數(shù)據(jù)庫準(zhǔn)確地記錄下來,這個數(shù)據(jù)庫就是 OLTP 類型。
你也會通過系統(tǒng)去查詢你上個月的消費(fèi)情況,系統(tǒng)會根據(jù)你上個月的交易數(shù)據(jù)做個匯總發(fā)給你,并告訴你吃飯花了多少、交通花了多少、娛樂花了多少等等,支持這個場景的就是 OLAP 類型。
OLTP 主要處理短小的事務(wù),要求事務(wù)吞吐量很高,因為每個人每天可能要支付十幾次,但每次需要處理的數(shù)據(jù)量比較小;而 OLAP,每個人可能每個月只用一次,但是每次要處理的數(shù)據(jù)量相對比較大,而且計算比較復(fù)雜。
近年來,伴隨著人工智能、物聯(lián)網(wǎng)、邊緣計算等數(shù)字化場景的興起,數(shù)據(jù)庫的功能也產(chǎn)生了更多的分類,如 HTAP(同時能夠處理 OLTP 和 OLAP 的場景)、流式數(shù)據(jù)處理、時序數(shù)據(jù)處理、非結(jié)構(gòu)化數(shù)據(jù)處理、跨平臺數(shù)據(jù)處理、多模態(tài)數(shù)據(jù)處理等等。如何理解這些分類呢?
類似于不同功能的汽車,有貨車、有客車、有 MPV、有 SUV、有皮卡、有燃油車、有新能源車等等。車的核心功能是一致的,只是為了適應(yīng)不同的場景和需求,不同的車會有不同的架構(gòu)設(shè)計和調(diào)參,如此而已。
那么,數(shù)據(jù)庫應(yīng)該有哪些核心功能呢?
首先,數(shù)據(jù)庫、數(shù)據(jù)庫,必須要把數(shù)據(jù)保存下來。要把數(shù)據(jù)按照合理的格式,安全保存在可持久化的存儲介質(zhì)里面,要保證數(shù)據(jù)的正確性、完整性和安全性。這是所有數(shù)據(jù)系統(tǒng)最核心的功能。換句話說,把數(shù)據(jù)交給數(shù)據(jù)庫,數(shù)據(jù)庫要保證數(shù)據(jù)不丟、不錯。這個是最最起碼的要求。正如糧倉,不能糧食存進(jìn)去都發(fā)霉了,被耗子吃了。
其次,數(shù)據(jù)庫要盡可能提高數(shù)據(jù)存取效率。要用更有效率的方式存儲數(shù)據(jù),讓數(shù)據(jù)存儲得更快,更易于使用者理解,更方便上層業(yè)務(wù)的使用。查詢數(shù)據(jù)時效率更高,更快給出結(jié)果。就像有人來送糧食入庫,要快速地稱重、烘干、質(zhì)檢、打包、入庫,不能讓人家等一禮拜。有人要買小麥,有人要買玉米,必須按照要求快速找到相應(yīng)的存放地點把糧食交給糧商。
再次,數(shù)據(jù)庫要提供豐富的數(shù)據(jù)分析算法,盡可能把跟數(shù)據(jù)密切相關(guān)的計算在數(shù)據(jù)庫中完成,減少數(shù)據(jù)傳輸?shù)拈_銷,減輕上層業(yè)務(wù)邏輯的計算壓力。就像糧庫要提供完善的糧食處理措施,比如稱重、烘干、打包、品質(zhì)分級等,方便糧食交易。
最后,數(shù)據(jù)庫要提供易于使用的接口,降低數(shù)據(jù)分析人員的使用門檻,能夠支持各種數(shù)據(jù)分析工具,讓使用數(shù)據(jù)更加方便。就像糧庫要有方便的停車場、清晰的指示牌、專業(yè)友好的工作人員等。
數(shù)據(jù)庫的核心組件有哪些
為了實現(xiàn)這些核心功能,通常數(shù)據(jù)庫會包括以下核心組件:
a. 存儲管理
數(shù)據(jù)用什么樣的方式來組織、存儲,是 key-value 還是關(guān)系型,是按行存還是按列存,支不支持壓縮,支不支持刪除和修改,支持什么樣的數(shù)據(jù)類型和存儲接口,POSIX 還是對象存儲。是否要支持計算存儲分離,是否要支持分布式存儲,是否支持事物處理,是否支持多副本,采用什么算法來加速數(shù)據(jù)的檢索(索引)等等。存儲管理是數(shù)據(jù)庫的核心組件,解決了存儲管理問題,數(shù)據(jù)庫的問題就解決了一半了。
b. 查詢優(yōu)化器
要提高數(shù)據(jù)查詢的效率,數(shù)據(jù)庫必須找到一條最優(yōu)化的執(zhí)行路徑,比如,查詢時是否需要使用索引,如果有多個索引,應(yīng)該選擇哪一個,如果數(shù)據(jù)分布在不同的存儲單元(表、集合等)里,應(yīng)該按照什么順序來訪問效率最高等等。優(yōu)化器面對的問題可能是一個極其復(fù)雜的路徑規(guī)劃問題,它需要在很短的時間里計算出最優(yōu)路徑,需要大量核心優(yōu)化算法,屬于數(shù)據(jù)庫中復(fù)雜程度最高的部分。
舉個例子,你要帶著全家人,包括老人、小孩一起從上海去海南旅行,要制作一個性價比最好、家人滿意度最高的計劃,那么在計劃時需要考慮哪些因素呢?首先,怎么去,是開車去,還是火車去,還是飛機(jī)去。開車,路上要花多久,中間需要休息幾次,你和太太有沒有時間,老人孩子是不是受得了,汽油費(fèi)用,過路費(fèi)用;飛機(jī),怎么去機(jī)場,行李有多少,帶不帶得下,機(jī)票有沒有打折,下了飛機(jī)怎么辦等等。住什么酒店,去什么景點,老人喜歡去人多的人文景觀,太太喜歡安靜的地方和方便購物的地方,小孩喜歡有游樂場的地方,要不要酒店 + 景點一起訂,會不會有優(yōu)惠,要不要租車,租什么車......說到這里,是不是可以體會一個查詢優(yōu)化器需要考慮的問題有多少?

當(dāng)然,這部分工作可以有相對簡單的實現(xiàn)(基于規(guī)則),比如太太說了,時間確定、飛機(jī)來回、五星酒店、帶私人沙灘,這樣計劃就會簡單很多。然而,這份工作也可能復(fù)雜到難以想象(基于機(jī)器學(xué)習(xí)、基于實際開銷等等),比如太太說你全權(quán)負(fù)責(zé),具體時間不確定,大概在 8月 - 9月,要少花錢多辦事,多做調(diào)研,找一個最優(yōu)方案。那么做這個計劃就會非常復(fù)雜,需要的支持決策信息就會非常多。這樣做出來的決策大概率相對會優(yōu)化,比基于規(guī)則實現(xiàn)的計劃能適應(yīng)更多場景。
c. 執(zhí)行模塊
優(yōu)化器做好了執(zhí)行計劃后,接下來就會有執(zhí)行的模塊按照執(zhí)行計劃對數(shù)據(jù)進(jìn)行相關(guān)的計算,包括數(shù)據(jù)的存取、常規(guī)的加減乘除、排序、平均值、哈希,也會包括一些機(jī)器學(xué)習(xí)的算法,數(shù)據(jù)的壓縮/解壓縮,最后將計算完成的結(jié)果返回給客戶端。

d. 內(nèi)部管理和調(diào)度
數(shù)據(jù)庫要正常地工作,還會需要一些內(nèi)部協(xié)調(diào)管理的模塊,比如內(nèi)存和存儲同步,存儲空間整理,元數(shù)據(jù)管理,集群狀態(tài)檢測,容錯和故障恢復(fù)等。
e. 管理工具和接口
為了提高易用性,數(shù)據(jù)庫都需要提供一套管理工具,比如備份/恢復(fù)、狀態(tài)檢測、運(yùn)行時監(jiān)控、資源隔離、權(quán)限管理、安全審計、自定義接口、各種數(shù)據(jù)訪問接口等。
數(shù)據(jù)庫的發(fā)展和展望
數(shù)據(jù)庫的發(fā)展是伴隨著計算機(jī)體系架構(gòu)的發(fā)展而不斷演進(jìn)的,從主機(jī),到個人電腦 + 網(wǎng)絡(luò)(x86),到現(xiàn)在的云服務(wù),數(shù)據(jù)庫也經(jīng)歷了一系列的演化歷程。

a. 主機(jī)時代
最初的計算機(jī)和數(shù)據(jù)庫只是在航空航天、軍事領(lǐng)域使用,只需要支持專業(yè)的數(shù)據(jù)分析人員進(jìn)行數(shù)據(jù)分析。到了上世紀(jì) 70 年代末,伴隨著計算機(jī)進(jìn)入更多商業(yè)場景,大量數(shù)據(jù)分析的需求產(chǎn)生了,數(shù)據(jù)庫則需要面對更為普遍的用戶需求。在 IBM 最早發(fā)布的關(guān)系型數(shù)據(jù)庫的論文中,最強(qiáng)調(diào)的一點就是希望能夠讓數(shù)據(jù)庫的用戶不用再去操心數(shù)據(jù)應(yīng)該如何存儲和組織,而能夠高效率使用這些數(shù)據(jù)進(jìn)行分析。
為了方便用戶的使用,SQL(結(jié)構(gòu)化查詢語言)被定義了出來,按照這樣的語法,數(shù)據(jù)庫用戶只需要關(guān)注數(shù)據(jù)該如何分析,不需要關(guān)注底層的數(shù)據(jù)分布和存儲等。
為了要支持大量用戶的并發(fā)數(shù)據(jù)操作,數(shù)據(jù)庫事務(wù)特性被定義了出來,保證在并發(fā)的數(shù)據(jù)操作下,用戶能夠看到符合業(yè)務(wù)邏輯的數(shù)據(jù)內(nèi)容。
為了保證數(shù)據(jù)庫的高效率和安全性,數(shù)據(jù)庫重做日志(事務(wù)日志)被設(shè)計出來,包括當(dāng)前數(shù)據(jù)庫中經(jīng)常出現(xiàn)的一系列概念,比如回滾日志(undo log)、提交日志(commit log)、檢查點(checkpoint)等等。
主機(jī)時代的硬件成本極其昂貴,不論是存儲、內(nèi)存還是CPU資源,相對來說都很稀缺。那么,數(shù)據(jù)庫在設(shè)計和使用上就會采用各種算法和架構(gòu)來降低對內(nèi)存的使用,減少數(shù)據(jù)的冗余,提高數(shù)據(jù)的檢索效率。因此,各種數(shù)據(jù)索引類型,功能強(qiáng)大的查詢優(yōu)化器,數(shù)據(jù)緩存算法等在數(shù)據(jù)庫中得到了極大的發(fā)展。同時在使用數(shù)據(jù)庫時,也要對數(shù)據(jù)進(jìn)行各種復(fù)雜的模型設(shè)計(三范式模型、星型模型、雪花型模型等等)以降低數(shù)據(jù)的冗余程度,當(dāng)然,這樣也會增加數(shù)據(jù)庫應(yīng)用的開發(fā)難度。
b. x86 時代
伴隨著 x86 服務(wù)器的廣泛使用和網(wǎng)絡(luò)技術(shù)的發(fā)展,把 N 臺 x86 服務(wù)器通過網(wǎng)絡(luò)組建成一個集群,利用這個集群的計算、存儲能力來取代昂貴的主機(jī)也就更加具有性價比。在這種趨勢下,也就設(shè)計出了各種能夠使用集群能力的分布式數(shù)據(jù)庫系統(tǒng),這些系統(tǒng)的核心思想就是把數(shù)據(jù)分散在不同的節(jié)點上,利用多個節(jié)點的計算和存儲資源提高對數(shù)據(jù)的存儲和分析能力。在分布式的處理架構(gòu)下,數(shù)據(jù)一致性協(xié)議、多副本機(jī)制、高可用機(jī)制、數(shù)據(jù)分片機(jī)制、擴(kuò)容/縮容機(jī)制等等也都成為了分布式數(shù)據(jù)庫必須要設(shè)計和解決的問題。
在 x86 時代,由于硬件成本的大幅下降,用戶更多關(guān)注數(shù)據(jù)分析的靈活性和交付的效率。因此,使用數(shù)據(jù)庫時更多會關(guān)注如何加快數(shù)據(jù)分析的過程、如何讓數(shù)據(jù)更易于人類理解,而不需要為了降低數(shù)據(jù)的冗余而進(jìn)行復(fù)雜的模型構(gòu)建。
c. 云時代
隨著技術(shù)的進(jìn)一步發(fā)展,通過把傳統(tǒng)硬件虛擬化/容器化等技術(shù),提高硬件資源的使用效率,降低生產(chǎn)運(yùn)維成本的云服務(wù)被越來越多企業(yè)采用。為了更好地適應(yīng)云服務(wù)的技術(shù)體系,數(shù)據(jù)庫也設(shè)計出了相關(guān)的云特性,比如存儲計算分離、彈性伸縮、微服務(wù)化、跨域數(shù)據(jù)同步等等。
云時代,用戶更加關(guān)注數(shù)據(jù)分析的效率和投入產(chǎn)出比,更加關(guān)注產(chǎn)品是否能夠提供便利的一體化數(shù)據(jù)處理服務(wù),讓業(yè)務(wù)開發(fā)者能夠更加專注于業(yè)務(wù)本身,而數(shù)據(jù)庫服務(wù)也在朝著標(biāo)準(zhǔn)化云服務(wù)的方向不斷演進(jìn)。
d. 展望
不同的數(shù)據(jù)庫架構(gòu)和部署方式不是一個簡單的迭代和取代的關(guān)系,而是在很長一段時間里會同時存在并且逐步迭代的過程。時至今日,依然有不少金融機(jī)構(gòu)會選擇使用在主機(jī)上的數(shù)據(jù)庫產(chǎn)品,只是新的業(yè)務(wù)和場景非常有限。而基于 x86 服務(wù)器的數(shù)據(jù)處理產(chǎn)品,還是當(dāng)前企業(yè)數(shù)據(jù)庫的主流選擇。與此同時,云數(shù)據(jù)庫的市場份額也在逐步增長和擴(kuò)大。采用何種數(shù)據(jù)庫產(chǎn)品要根據(jù)自身的業(yè)務(wù)需求來決定,合適的就是最好的。當(dāng)然從技術(shù)演進(jìn)的方向上看,云技術(shù)(包括公有云和私有云)會是大勢所趨,因為云能夠提供更高的效率。
數(shù)據(jù)庫作為信息產(chǎn)業(yè)的三大基礎(chǔ)技術(shù)(還有芯片和操作系統(tǒng))之一,在相當(dāng)長的時間里,不論從資本還是技術(shù)方面都非常火熱,國內(nèi)近幾年來也出現(xiàn)了相當(dāng)多優(yōu)秀的數(shù)據(jù)庫產(chǎn)品和企業(yè)。在人類邁向數(shù)字化文明的進(jìn)程中,必定會產(chǎn)生越來越多的數(shù)據(jù),也需要從數(shù)據(jù)中挖掘出更多的價值,而數(shù)據(jù)庫作為承載數(shù)據(jù)的核心,也必將持續(xù)發(fā)揮重要作用。有幸一直在從事這個領(lǐng)域的工作,期待與廣大同仁一道為人類數(shù)字化技術(shù)的進(jìn)步貢獻(xiàn)力量。