1. 為什么要做數據庫選型
1.1 數據庫選型的重要性與難點
發(fā)展數字經濟是當下各行各業(yè)的重要方向。支撐數字經濟的底座是軟件,特別是基礎軟件,可以說基礎軟件是整個數字經濟的堅實底座。在基礎軟件領域,有三大基礎軟件,分別是操作系統(tǒng)、數據庫系統(tǒng)和中間件。我們每天日常生活中的方方面面,背后都離不開這些基礎軟件的支撐,其中數據庫系統(tǒng)是業(yè)務數據的載體,比如銀行卡上的余額,是非常重要的數據,不能有任何差錯,數據庫在所有 IT 系統(tǒng)中的地位都是重中之重。
數據庫作為基礎軟件的重要性不言而喻,各行各業(yè)的數字系統(tǒng)都離不開數據庫系統(tǒng)。但不同行業(yè)特點不同,行業(yè)需求也就不同。面對著業(yè)界上百種數據庫類型,到底應該如何根據自己的業(yè)務特征去選擇最合適的數據庫系統(tǒng)?這個問題非常的重要,因為如果數據庫選擇不合適,可能會讓業(yè)務系統(tǒng)停擺,造成嚴重經濟損失。所謂合適的數據庫系統(tǒng),不僅僅要滿足業(yè)務需求,還要盡可能降低成本,減輕運維管理難度,滿足業(yè)務未來的發(fā)展等等。這是個復雜的問題, 因為各行各業(yè)的業(yè)務場景各不相同,對數據庫的需求和使用場景差異很大,可選擇的數據庫系統(tǒng)也是幾十上百種,如此一組合下來,對于非數據庫專業(yè)人士,選擇復雜度非常高。
本文的目的就是要嘗試回答這個重要且復雜的問題。如果您計劃將 IT 業(yè)務系統(tǒng)部署在火山引擎之上,可以參考本文的思路,選擇合適的火山引擎云數據庫服務,為業(yè)務應用打造堅實的數據庫底座。
1.2 數據庫發(fā)展與類型簡介
數據庫系統(tǒng)在上世紀 70 年代初出現,至今已經發(fā)展了半個多世紀,其理論、技術與產品已經非常豐富,呈現出百花齊放的景象。根據其特點可以大概分為關系型數據庫管理系統(tǒng)(RDBMS),非關系型數據庫(NoSQL),NewSQL、云原生數據庫、分布式數據庫等等。每一類數據庫中使用不同的技術實現,又可以分化出不同的產品類型。根據 DB-Engines 的統(tǒng)計,數據庫產品數量已經有將近 400 種,數據庫廠商也有幾百家,如下圖所示,不同數據庫產品的實際應用規(guī)模也大有不同,其中關系型數據庫管理系統(tǒng)是所有數據庫中使用最廣泛的一類。同時,根據卡內基梅隆大學維護的全球數據庫信息庫(dbdb.io)顯示,數據庫系統(tǒng)種類已經多達 870 種,可謂是欣欣向榮,讓人眼花繚亂。

縱觀整個數據庫發(fā)展史,關系型數據庫系統(tǒng)是歷史最悠久并且使用最廣泛的一類數據庫系統(tǒng),其理論基礎是基于 IBM 研究員 E.F.Codd 博士在 1970 年提出的“關系模型(Relational model)”。關系型數據庫也是過去幾十年里各行各業(yè)使用最多最廣泛的數據庫類型。
隨著 2000 年之后移動互聯(lián)網的大規(guī)模爆發(fā),催生出了豐富多彩的面向互聯(lián)網的應用,這些應用共同的特點是并發(fā)量非常高,數據量特別大。基于這些互聯(lián)網的新場景與新需求,又出現了 NoSQL 數據庫技術,其理論基礎主要是由 Eric Brewer 提出的 CAP 定理以及 Dan Pritchett 提出的 BASE 原則。
再往后,業(yè)界將關系型數據庫與 NoSQL 數據庫的優(yōu)勢進行了融合,出現了 NewSQL 數據庫,隨著云原生技術的入場與爆發(fā),又有了云原生數據庫。

關系型數據庫將數據存儲于二維表格之中,數據以行為單位,一行數據表示一個實體信息,每一行數據的屬性都是相同的,通過 SQL 語言進行操作,容易理解,廣泛應用于企業(yè)的 ERP、CRM、財務系統(tǒng)和交易系統(tǒng)等核心業(yè)務系統(tǒng)。其最大的特點是支持事務,遵循 ACID,保證數據強一致性。業(yè)界常見的關系型數據庫又分商業(yè)數據庫與開源數據庫,其中主流的商業(yè)關系型數據庫代表有 Oracle、SQL Server、DB2 等;主流的開源關系型數據庫代表有 MySQL、PostgreSQL、MariaDB 等。
NoSQL,Not Only SQL,“不僅僅是 SQL”,廣泛應用于以互聯(lián)網業(yè)務為代表的場景。NoSQL 數據庫又可以細分為 KV 型 NoSQL 數據庫(以 Redis 為代表)、文檔型 NoSQL 數據庫(以 MongoDB 為代表)、寬列型 NoSQL 數據庫(以 HBase 為代表)、時序型 NoSQL 數據庫(以 InfluxDB 為代表)以及圖 NoSL 數據庫(以 Neo4j 為代表)。雖然這些類型都屬于 NoSQL 數據庫范疇,但是不同類型的 NoSQL 數據庫所適用的場景各有不同,需要根據業(yè)務特征選擇合適的 NoSQL 數據庫。
其中 KV 型 NoSQL 數據庫適用于需要超高性能,讀遠多于寫,并且可以容忍數據部分丟失的場景,例如作為關系型數據庫的外部緩存,用于提升系統(tǒng)整體的讀性能,減輕關系型數據庫的讀壓力。
文檔型 NoSQL 數據庫使用的是一種半結構化的數據模型(json 或 xml 格式),與關系型數據庫相比,文檔型 NoSQL 是沒有 Schema 的,由于沒有 Schema 的特性,可以隨意地存儲與讀取數據,因此文檔型 NoSQL 數據庫解決了關系型數據庫表結構擴展不方便的問題。
寬列型 NoSQL 數據庫,主要用在大數據、OLAP 場景。其特點是可以提供海量的存儲容量,PB 級別數據量可以輕松存儲,并且成本較低。
時序型 NoSQL 數據庫主要應用在一些與時間強相關的數據模型,例如 IoT、監(jiān)控數據等場景。對于時間序列相關的數據,時序型 NoSQL 數據庫的處理與關系型數據庫的處理方式是不一樣的,時序型 NoSQL 數據庫主要是有效地收集、存儲和查詢高頻產生的各種時間序列數據,對此做了專門的設計和優(yōu)化,專門用于這類場景。
圖 NoSQL 數據庫主要用于處理‘關系’數據。這里的‘關系’不是關系型數據庫中的關系,而是指不同對象之間的聯(lián)系。例如,社交關系(人與人的關系)、推薦關系(人與物的關系)、關聯(lián)關系(物與物的關系)等等。這類數據用關系型數據庫很難處理,特別是在互聯(lián)網海量數據條件下更復雜,所以圖 NoSQL 數據庫主要是針對這類場景做了專門的設計與優(yōu)化,用于進行‘關系’數據的存儲與查詢。
從技術角度出發(fā),數據庫可以分為關系型數據庫與 NoSQL 數據庫。從場景角度出發(fā),數據庫又可以分為 OLTP 數據庫與 OLAP 數據庫。OLTP(Online trancaction processing),是關系型數據庫的主要應用,側重于交互式的事務處理,例如銀行交易、在線訂單處理等。OLAP(Online analytical processing) 是數據倉庫系統(tǒng)的主要應用,支持復雜的分析操作,側重分析決策支持,并且提供直觀易懂的查詢結果,主要跟大數據系統(tǒng)關系緊密。OLTP 與 OLAP 系統(tǒng)之間通常會使用 ETL 進行連接。

本文主要側重于 OLTP 系統(tǒng)的選型指南,也就是上圖中圓圈中的范圍,包含關系型數據庫與 NoSQL 數據庫。OLAP 與大數據相關不在本文討論范圍。
2. 選型基本方法論
在開始介紹數據庫選型方法論之前,首先需要介紹一個理念:“數據庫選型沒有銀彈”。就是說沒有任何一款數據庫可以滿足所有業(yè)務場景的需求,找不到一個可以包打天下的數據庫。
如果真有“數據庫銀彈”,那也就不必做數據庫選型了,直接用銀彈就行,數據庫世界也就不會出現如此多種類的數據庫技術和產品類型了。
所以需要根據不同的業(yè)務場景、業(yè)務需求去選擇一款最適合的數據庫系統(tǒng),這也是本文所要討論的核心問題。

2.1 參與選型的角色
數據庫選型不僅僅是一個技術選擇,而是一個全局選擇。后面會從多種視角多個方面來說明做數據庫選型需要考慮的因素,包括應用接口、數據模型、性能、穩(wěn)定性、成本、運維復雜度、高可用性、安全性、擴展性等方面。
數據庫選型是一個全局選擇,參與到選擇中的角色主要有三類:
● 開發(fā)人員,代表了業(yè)務和應用本身。
● DBA,代表了數據庫管理角色。
● 財務部門,代表了成本控制角色。
財務部門主要關注的是數據庫系統(tǒng)的成本,需要根據業(yè)務系統(tǒng)的規(guī)模、重要性等方面決定財務投入,簡單說就是準備花多少錢建設與維護數據庫系統(tǒng)。投入越多,可以獲得更強的數據庫能力,也可以聘請更專業(yè)的 DBA 進行數據庫維護,保障數據庫系統(tǒng)穩(wěn)定運行。企業(yè)組織中越是重要核心的數據庫系統(tǒng),會獲得更多的資源投入。
DBA,Database Administrator,是數據庫管理員的簡稱。從名字就能看出來,DBA 是負責管理數據庫系統(tǒng)的角色,主要關注數據庫的可運維性,包括監(jiān)控告警、備份恢復、升級遷移、問題診斷工具、調優(yōu)工具等;穩(wěn)定性,包括高可用性、自動主從切換、手動主從切換、會話管理等;性能,包括 QPS、時延、吞吐量等;可擴展性,包括靈活變配、計算擴容、存儲擴容等;安全性,包括 SQL 審計、操作審計、數據加密、數據脫敏等。
開發(fā)人員,是應用程序的設計者與開發(fā)者,也是數據庫系統(tǒng)的實際使用者,開發(fā)人員設計的應用程序會直接與數據庫進行交互,利用數據庫進行數據的高效存取。開發(fā)人跟 DBA 的關注點有類似的地方,例如開發(fā)人員也會關注數據庫的性能、穩(wěn)定性、可擴展性。但除此之外,開發(fā)人員更關注的是數據庫提供的接口和支持的數據模型,這一點直接決定了應用應該選擇什么樣的數據庫。接口與數據模型包括了是否支持 SQL、是否遵循 ACID、數據一致性等等。

2.2 數據庫選型考慮
數據庫選型首先需要考慮的應該是業(yè)務應用所服務的場景,是 OLTP 場景還是 OLAP 場景。如果是 OLAP,建議參考大數據相關選型指導;如果是 OLTP,可以參考本文的選型指導。
接下來是考慮應用的數據模型。數據模型可以是關系型、半結構化、非結構化、KV 型等等。如果是關系型,可以選擇關系型數據庫;如果是KV 型,可以選擇 Redis;如果是非結構化或半結構化,可以從 NoSQL 數據庫系列中選擇適合的種類,需要看具體的數據模型。
如果業(yè)務應用對事務 ACID 是強需求,那么關系型數據庫將會是最佳的選擇,例如 MySQL、PostgreSQL 等。
接著要考慮業(yè)務應用對數據一致性的要求。如果業(yè)務應用需要強一致性,那么優(yōu)先選擇關系型數據庫;如果業(yè)務應用可以接受數據的最終一致性,那么各類 NoSQL 數據庫都可以成為待選項,具體結合數據模型做進一步考慮。其中,MongoDB 可以通過調整本身的某些參數達到數據強一致的效果,開發(fā)人員需要關注。
此外,除了考慮業(yè)務應用現階段的需求,還需要為未來做考慮,這里面最重要的就是預估業(yè)務增量,包括對性能、數據量的預估。如果業(yè)務在未來增速可能會很快,會需要更強的數據處理能力,或者需要更大的數據容量,那么也需要同時考慮數據庫的可擴展性,通過擴展來獲取更強的數據處理能力以及更大的數據存儲空間,以保證業(yè)務應用可以平穩(wěn)運行。

3. 火山引擎云數據庫選型參考
火山引擎云數據庫提供了豐富的云數據庫產品類型,包括開源數據庫與自研數據庫,同時也提供了完整的數據庫生態(tài)服務,包括數據庫遷移服務與數據庫統(tǒng)一管理服務。接下來會簡單介紹每一種數據庫的特點與適用場景,便于選型參考。

3.1、關系型數據庫 RDS
火山引擎云數據庫 RDS 是關系型數據庫的合稱,RDS 支持 MySQL 引擎、Postgre SQL引擎、SQL Server(暫未上線,敬請期待)引擎,同時提供了數據庫管理、安全、災備、監(jiān)控、遷移等全套解決方案。RDS 基于云原生架構部署,在擴展性、彈性和性價比方面有很大的優(yōu)勢。
火山引擎云數據庫 RDS 可以廣泛應用于互聯(lián)網電商、游戲、在線交易等場景,也可以承載傳統(tǒng) ERP、CRM 等業(yè)務數據,具備高可用、高性能、靈活易用等特點,已有多個行業(yè)的客戶正在使用火山引擎云數據庫 RDS 承載其在線核心業(yè)務系統(tǒng)。

3.2 云原生數據庫 veDB MySQL
veDB MySQL 完全兼容開源 MySQL,采用計算存儲分離架構,最大支持 128TiB 的結構化數據存儲,單個數據庫集群最多可擴展至 16 個計算節(jié)點,包含 1 個主節(jié)點與 15 個讀節(jié)點。基于云原生數據庫設計理念,云數據庫 veDB MySQL 既融合了商業(yè)數據庫高性能、高可靠、高可用的特征,又具有開源數據庫簡單開放、快速迭代、高效擴展的優(yōu)勢。經過字節(jié)跳動內部關鍵業(yè)務場景的錘煉和打磨,veDB MySQL 能夠為企業(yè)提供安全可靠、性能優(yōu)越、功能豐富的數據庫服務。
veDB MySQL 已經在字節(jié)跳動內部廣泛使用,承載了內部多條業(yè)務線的業(yè)務,例如抖音、廣告、小說等業(yè)務。在 2021 年的春晚紅包雨活動中,全國一共發(fā)起了 703 億次紅包雨互動,其中 veDB MySQL 的讀 QPS 峰值達到 500w+,寫峰值達到 360w+,良好的支持了本次紅包雨活動。
veDB 現在正在公測階段,歡迎試用。https://www.volcengine.com/product/vedb-mysql

3.3 緩存數據庫 Redis
火山引擎緩存數據庫 Redis 提供的是托管型的緩存數據庫服務,兼容開源 Redis 數據庫引擎,幫助您在云上輕松、快速地構建 Redis 數據庫。緩存數據庫 Redis 提供了高性能且安全的 Redis 數據庫解決方案,按需計費結合動態(tài)擴展能力能夠顯著地幫助企業(yè)降低成本,同時也有助于消除管理、運維數據庫的復雜性。
緩存數據庫 Redis 在開源社區(qū) Redis 架構上進行了大量優(yōu)化,采用字節(jié)跳動內部實踐的 Achemy 架構,極大提升了 Redis 集群的規(guī)模與穩(wěn)定性。

3.4 文檔數據庫 MongoDB
火山引擎文檔數據庫 MongoDB 版是一款完全兼容開源 MongoDB 協(xié)議,且具備高可用、高性能的在線云數據庫服務。文檔數據庫 MongoDB 支持多種架構,能夠滿足業(yè)務靈活部署的需求。除副本集實例架構外,文檔數據庫 MongoDB 還提供了分片集群架構,以滿足海量數據業(yè)務場景,同時提供了災備、備份及恢復、監(jiān)控等全套解決方案。在互聯(lián)網(游戲、電商、直播、資訊、社交)、新零售等行業(yè)都有廣泛的應用。火山引擎文檔數據庫 MongoDB 即將上線 MongoDB 5.0 版本,敬請期待。

3.5 表格數據庫 HBase
火山引擎表格數據庫 HBase 是基于 Apache HBase 提供的全托管 NoSQL 服務,兼容標準 HBase 訪問協(xié)議,具備低成本存儲、高吞吐、靈活擴展等優(yōu)勢。
表格數據庫 HBase 具備以下優(yōu)勢,幫助您構建理想應用:
支持 KeyValue 數據模型。
● 高可用架構,Master 為包含兩個節(jié)點的主備模式,支持 HA 實時檢測。
● 存儲和計算分離保證數據的高可靠,存儲采用多副本機制,可用性不低于 99.5%。
● 支持實例變配,包括橫向擴容和縱向擴縮容,還提供了監(jiān)控告警等功能,實例管理簡單方便。

3.6 圖數據庫 veGraph
圖數據庫 veGrap 是一款以屬性圖為基礎結構數據的分布式云原生數據庫,提供了海量關系的數據存儲和毫秒級的在線查詢服務,廣泛應用于社交網絡、欺詐檢測、推薦引擎、知識圖譜等場景。
圖數據庫 veGraph 主要具備如下特性:
● 有向屬性圖。基于有向屬性圖(Property Graph),由點、邊、點類型、邊類型以及屬性組成。
● 可視化圖平臺。查詢結果可視化,支持圖形化地展示數據的關聯(lián)性,便于更高效地分析數據。
● 圖管理。提供圖管理、Schema 管理和通過圖形化界面來配置數據導入等功能。
● 圖查詢語言。支持 Gremlin 圖查詢語言。

3.7 生態(tài)工具 DTS
火山引擎數據庫傳輸服務 DTS(Database Transmission Service)提供了數據遷移、數據同步、數據訂閱于一體的數據庫數據傳輸管理服務,支持關系型數據庫、非關系型數據庫數據源間的數據傳輸,降低數據庫之間數據流通復雜性,可在業(yè)務不停服的前提下輕松完成數據庫遷移上云。相較于第三方遷移工具,數據庫傳輸服務 DTS 可以更方便地創(chuàng)建和管理豐富多樣、高性能、高安全可靠的傳輸鏈路。

3.8 小結
在傳統(tǒng)自建數據庫模式下,DBA 人員需要承擔的運維工作會非常繁雜,從主機、存儲、操作系統(tǒng)到數據庫,每一層都涉及到復雜的運維操作。但是在云計算時代,火山引擎云數據庫提供了完善的數據庫運維體系,將很多常規(guī)數據庫管理動作都封裝為自動化功能,DBA 無需再去執(zhí)行很多復雜的運維命令,直接通過火山引擎云數據庫控制臺一鍵即可完成。同時火山引擎云數據庫控制臺上也提供了完善的數據庫指標監(jiān)控儀表盤,可以從多種維度觀測數據庫系統(tǒng)的運行情況,讓 DBA 對數據庫運行狀態(tài)做到心中有數。
火山引擎云數據庫極大的簡化了復雜的數據庫運維工作,通過自動化、平臺化的方式把 DBA 從繁瑣的運維工作中解放出來。同時火山引擎云數據庫也提供了高可用部署、自動/手動主備切換、自動/手動備份、靈活升降配等功能,又進一步的降低了 DBA 的運維工作量,提高了數據庫系統(tǒng)的靈活性。DBA 可以投入更多精力去關注數據庫系統(tǒng)其他方面,例如性能優(yōu)化,幫助開發(fā)人員優(yōu)化 SQL 等。
在成本方面,火山引擎云數據庫提供按量計費與包年包月的計費方式,相較于自建數據庫的模式,避免了一次性投入大量資金,做到只為使用的資源付費,極大的降低了數據庫的成本。
以上就是火山引擎云數據庫提供的產品與能力,如果我們將這些云數據庫產品做一個橫向比較,把數據庫選型過程中關注的細節(jié)進行對比,我們可以得到下面的云數據庫能力對比表格。再結合前面介紹的數據庫選型方法論,就可以為業(yè)務應用選擇合適的數據庫系統(tǒng)。

注: * 代表還未上線,敬請期待。
我們把選型方法論和火山引擎云數據庫產品能力結合在一起,就可以得到了如下的一張選型流程圖,按照流程可以確定應用需要的云數據庫類型,供大家參考。

4. 測試驗證與優(yōu)化
為了確保選擇的云數據庫可以滿足業(yè)務應用需要,可以穩(wěn)定支撐業(yè)務應用的運行,非常建議將業(yè)務應用與云數據庫放在一起進行全面的驗證與測試工作。主要驗證兼容性、性能、異常處理等方面。也可以通過一些測試工具來測試云數據庫的性能峰值是否滿足業(yè)務需求,例如 RDS MySQL 可以使用 sysbench 工具,Redis 可以使用 Memtier-benchmark 工具。
在測試過程中,通過云數據庫提供的監(jiān)控系統(tǒng),收集測試過程中云數據庫的各項指標,例如 CPU 負載、內存使用率、連接數、響應時間、慢查詢等指標。通過收集到的各項參數指標,找到業(yè)務應用或云數據庫的性能瓶頸所在,并進行相應的調優(yōu)。
火山引擎云數據庫線上文檔也有性能測試相關白皮書,提供了測試工具、測試方法和性能結果等內容,可以作為性能測試的參考內容。
如果出現整體測試效果不佳的情況,一方面需要由 DBA 調整云數據庫規(guī)格、參數,另一方面需要開發(fā)人員檢查應用使用云數據庫的方式,最常見的就是進行 SQL 優(yōu)化,例如 SQL 查詢中沒有加索引,或者加了索引但因為某種原因導致索引失效等。除 SQL 優(yōu)化之外,業(yè)務拆分也是常見的優(yōu)化手段,即將業(yè)務數據與壓力分散到不同的數據庫實例之上,這樣既可以保證性能,又可以進行故障隔離。在整體測試效果不佳的時候,需要檢查每一個環(huán)節(jié),優(yōu)化每一個環(huán)節(jié)。
火山引擎云數據庫提供了強大的性能、穩(wěn)定性和功能支撐,但不意味著業(yè)務應用不需要遵守一些標準的開發(fā)規(guī)范,特別是一些 SQL 規(guī)范。只有在業(yè)務應用與云數據庫都做到各自最優(yōu)的時候,整體系統(tǒng)才可以達到一個最優(yōu)的情況,讓業(yè)務平穩(wěn)且高性能的運行。需要開發(fā)人與 DBA 一起緊密配合,業(yè)務需要根據自身特征選擇數據庫,也需要根據數據庫特征調整業(yè)務邏輯,互相配合才能達到最佳效果。
5. 總結與展望
數據庫一直是IT系統(tǒng)基礎中的基礎,核心中的核心。正所謂“基礎不牢,地動山搖”,數據庫如果出現問題,即使是很小的問題,也會成倍放大最終對業(yè)務系統(tǒng)造成嚴重的影響。所以業(yè)務系統(tǒng)對數據庫的選擇需要非常謹慎。
本文介紹了數據庫系統(tǒng)的分類與每一類數據庫適合的場景,也從技術和場景細節(jié)方面說明了不同的業(yè)務特征應該選擇何種數據庫產品。根據選型流程圖的指導,業(yè)務應用可以選擇出合適的數據庫類型。同時也介紹了火山引擎云數據庫的產品種類和各種特征,結合選型方法論,可以幫助業(yè)務應用在火山引擎上選擇出合適的云數據庫作為業(yè)務應用的底座。在業(yè)務系統(tǒng)正式上線之前,還需要開發(fā)人員與 DBA 進行緊密的配合,對整體系統(tǒng)進行充分的測試與優(yōu)化,保障業(yè)務系統(tǒng)可以高性能、平穩(wěn)的運行。
火山引擎提供了豐富的云數據產品類型,可以滿足大部分業(yè)務場景的需求。云原生數據庫 veDB 現在正在進行公測,歡迎試用。后續(xù)火山引擎云數據庫還會陸續(xù)推出圖數據庫 veGraph、時序數據庫、數據庫工作臺 DBW 等一系列相關產品,敬請期待。