日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

数据库怎么选择?终于有人讲明白了

發(fā)布時(shí)間:2024/8/23 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库怎么选择?终于有人讲明白了 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者 |?Alex?Petrov

所有數(shù)據(jù)庫(kù)管理系統(tǒng)的主要工作都是可靠地存儲(chǔ)數(shù)據(jù)并使其對(duì)用戶可用。我們使用數(shù)據(jù)庫(kù)作為數(shù)據(jù)的主要來(lái)源,幫助我們?cè)趹?yīng)用程序的不同部分之間共享數(shù)據(jù)。我們使用數(shù)據(jù)庫(kù),而不是在每次創(chuàng)建新應(yīng)用程序時(shí)尋找存儲(chǔ)和檢索信息的方法,也不是每次都去發(fā)明一種組織數(shù)據(jù)的新方法。這樣一來(lái),我們就可以專注于應(yīng)用程序邏輯而不是基礎(chǔ)設(shè)施。

數(shù)據(jù)庫(kù)是模塊化的系統(tǒng),由多個(gè)部分組成:接受請(qǐng)求的傳輸層、決定以最高效方式運(yùn)行查詢的查詢處理器、執(zhí)行操作的執(zhí)行引擎以及存儲(chǔ)引擎。

存儲(chǔ)引擎(或數(shù)據(jù)庫(kù)引擎)是數(shù)據(jù)庫(kù)的一個(gè)軟件組件,它負(fù)責(zé)在內(nèi)存和磁盤上存儲(chǔ)、檢索和管理數(shù)據(jù),而設(shè)計(jì)它的目的是長(zhǎng)久保存每個(gè)節(jié)點(diǎn)的數(shù)據(jù)[REED78]。數(shù)據(jù)庫(kù)可以響應(yīng)復(fù)雜的查詢,存儲(chǔ)引擎則會(huì)更細(xì)粒度地看待數(shù)據(jù)并提供一組簡(jiǎn)單的數(shù)據(jù)操作API,允許用戶創(chuàng)建、更新、刪除和檢索數(shù)據(jù)記錄。從某個(gè)角度來(lái)看,數(shù)據(jù)庫(kù)是構(gòu)建在存儲(chǔ)引擎之上的應(yīng)用程序,它提供了表結(jié)構(gòu)(schema)、查詢語(yǔ)言、索引、事務(wù)和許多其他有用的特性。

為了獲得靈活性,鍵和值都可以是沒(méi)有預(yù)設(shè)格式的任意字節(jié)序列。它們的排序和表示語(yǔ)義是在更高級(jí)別的子系統(tǒng)中定義的。例如,你可以在一個(gè)表中使用int32(32位整數(shù))作為鍵,而在另一個(gè)表中使用ascii(ASCII字符串);從存儲(chǔ)引擎的角度來(lái)看,這兩個(gè)鍵都只是序列化的條目。

BerkeleyDB、LevelDB(及其后代RocksDB)、LMDB(及其后代libmdbx、Sophia和HaloDB)等存儲(chǔ)引擎的開(kāi)發(fā)都與它們現(xiàn)在所嵌入的數(shù)據(jù)庫(kù)彼此獨(dú)立。使用可插拔的存儲(chǔ)引擎使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠使用現(xiàn)有存儲(chǔ)引擎來(lái)構(gòu)建數(shù)據(jù)庫(kù)系統(tǒng),并將精力集中在其他子系統(tǒng)上。

同時(shí),數(shù)據(jù)庫(kù)系統(tǒng)組件之間清晰的解耦為切換不同引擎提供了機(jī)會(huì),這些引擎可能分別適用于特定的用例。例如:流行的數(shù)據(jù)庫(kù)MySQL有幾個(gè)存儲(chǔ)引擎,包括InnoDB、MyISAM和RocksDB(在MyRocks發(fā)行版中),而MongoDB則允許在WiredTiger、內(nèi)存以及(現(xiàn)已棄用的)MMAPv1存儲(chǔ)引擎之間進(jìn)行切換。

?

數(shù)據(jù)庫(kù)的比較

?

對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的選擇將會(huì)產(chǎn)生長(zhǎng)期的影響。如果選擇的數(shù)據(jù)庫(kù)不合適(因其導(dǎo)致性能問(wèn)題、一致性問(wèn)題或運(yùn)維上的挑戰(zhàn)),那么我們最好在開(kāi)發(fā)周期的早期就發(fā)現(xiàn)這一點(diǎn),因?yàn)檫w移到不同的系統(tǒng)可能并非易事,甚至在某些情況下,你還需要對(duì)應(yīng)用程序的代碼進(jìn)行重大的修改。

每個(gè)數(shù)據(jù)庫(kù)系統(tǒng)都有優(yōu)點(diǎn)和缺點(diǎn)。為了降低進(jìn)行高成本遷移的風(fēng)險(xiǎn),你可以在選擇數(shù)據(jù)庫(kù)上投入一些時(shí)間,以確保其具備滿足應(yīng)用程序需求的能力。

試圖根據(jù)數(shù)據(jù)庫(kù)的組件(例如:使用的存儲(chǔ)引擎,數(shù)據(jù)共享、復(fù)制和分布的方式等)、它們的排名(ThoughtWorks等咨詢機(jī)構(gòu)或諸如DB-Engines和Database of Databases等數(shù)據(jù)庫(kù)比較網(wǎng)站所呈現(xiàn)的流行度值)或?qū)崿F(xiàn)語(yǔ)言(C、Java或Go等)來(lái)比較數(shù)據(jù)庫(kù),可能導(dǎo)致無(wú)效和不成熟的結(jié)論。這些方法只能用于高層次上的比較,并且可能出現(xiàn)例如在HBase和SQLite之間進(jìn)行選擇這樣粗糙的對(duì)比。因此,即使只是對(duì)每個(gè)數(shù)據(jù)庫(kù)的工作原理和內(nèi)部結(jié)構(gòu)有粗淺了解,這些了解也可以很好地幫助你得出一個(gè)更可靠的結(jié)論。

每一次比較都應(yīng)該從清晰界定的目標(biāo)開(kāi)始,因?yàn)槟呐率亲钚〉钠疃伎赡苁拐麄€(gè)調(diào)查完全無(wú)效。如果你正在找尋一個(gè)非常適合當(dāng)下(或者未來(lái))的工作負(fù)載的數(shù)據(jù)庫(kù),那么你所能做的最好的事情就是在不同的數(shù)據(jù)庫(kù)系統(tǒng)上模擬這些工作負(fù)載、測(cè)量對(duì)你很重要的那些性能指標(biāo),并比較結(jié)果。有些問(wèn)題(特別是性能和可伸縮性方面的問(wèn)題)只有在一段時(shí)間后或隨著容量的增長(zhǎng)才會(huì)開(kāi)始顯現(xiàn)出來(lái)。為了發(fā)現(xiàn)潛在的問(wèn)題,最好在盡可能接近真實(shí)生產(chǎn)環(huán)境的環(huán)境中進(jìn)行長(zhǎng)期的運(yùn)行測(cè)試。

模擬現(xiàn)實(shí)世界中的工作負(fù)載不僅能幫助你了解數(shù)據(jù)庫(kù)的運(yùn)行方式,還能幫助你學(xué)習(xí)如何操作與調(diào)試數(shù)據(jù)庫(kù),并了解其社區(qū)的友好程度和能提供幫助的程度。數(shù)據(jù)庫(kù)的選擇總是這些因素的組合,而性能通常并不是最重要的方面:使用保存數(shù)據(jù)緩慢的數(shù)據(jù)庫(kù)通常比使用會(huì)快速丟失數(shù)據(jù)的數(shù)據(jù)庫(kù)要好得多。

要比較數(shù)據(jù)庫(kù),非常詳細(xì)地理解用例并定義當(dāng)前和預(yù)期的變量是有幫助的,例如:

  • 表結(jié)構(gòu)和記錄大小

  • 客戶端數(shù)量

  • 查詢類型和訪問(wèn)模式

  • 讀寫查詢速率

  • 任何這些變量中的預(yù)期變化

明確這些變量可以幫助回答以下問(wèn)題:

  • 數(shù)據(jù)庫(kù)支持所需的查詢嗎?

  • 數(shù)據(jù)庫(kù)能夠處理我們計(jì)劃存儲(chǔ)的數(shù)據(jù)量嗎?

  • 單個(gè)節(jié)點(diǎn)可以處理的讀寫操作有多少?

  • 一個(gè)系統(tǒng)計(jì)劃要有多少個(gè)節(jié)點(diǎn)?

  • 鑒于預(yù)期的增長(zhǎng)率,我們?nèi)绾螖U(kuò)展集群?

  • 維護(hù)過(guò)程是什么?

在回答了這些問(wèn)題之后,你可以構(gòu)建一個(gè)測(cè)試集群并模擬你的工作負(fù)載。大多數(shù)數(shù)據(jù)庫(kù)已經(jīng)有了壓測(cè)工具,可以用來(lái)重現(xiàn)特定的用例。如果沒(méi)有標(biāo)準(zhǔn)的壓測(cè)工具用來(lái)在數(shù)據(jù)庫(kù)生態(tài)系統(tǒng)中生成現(xiàn)實(shí)中的隨機(jī)工作負(fù)載,那么這可能是一個(gè)危險(xiǎn)的信號(hào)。如果有什么東西讓你無(wú)法使用數(shù)據(jù)庫(kù)自帶的工具,那么你可以嘗試一個(gè)現(xiàn)有的通用工具,或者從零開(kāi)始實(shí)現(xiàn)一個(gè)。

如果測(cè)試結(jié)果理想,那么進(jìn)一步熟悉數(shù)據(jù)庫(kù)代碼可能會(huì)有更大的幫助。為了閱讀源代碼,首先要了解數(shù)據(jù)庫(kù)的各個(gè)部分、如何查找不同組件的源代碼,然后瀏覽這些組件。即使僅對(duì)數(shù)據(jù)庫(kù)代碼庫(kù)有一個(gè)粗略的了解,也有助于你更好地理解它產(chǎn)生的日志和配置參數(shù),并幫助你在使用數(shù)據(jù)庫(kù)的應(yīng)用程序中,甚至在數(shù)據(jù)庫(kù)代碼本身發(fā)現(xiàn)問(wèn)題。

有些人以為,可以將數(shù)據(jù)庫(kù)當(dāng)作黑匣子而無(wú)須了解其中的內(nèi)容是件好事。但實(shí)踐往往表明,這樣做遲早會(huì)碰到bug、服務(wù)中斷、性能倒退或其他問(wèn)題。你最好為這些問(wèn)題做好準(zhǔn)備,如果你了解并且理解數(shù)據(jù)庫(kù)的內(nèi)部結(jié)構(gòu),就可以減少業(yè)務(wù)風(fēng)險(xiǎn)且更有可能快速地恢復(fù)。

用于基準(zhǔn)測(cè)試、性能評(píng)估和比較的一個(gè)流行工具是Yahoo! Cloud Serving Benchmark(YCSB)。YCSB提供了一個(gè)框架和一組可應(yīng)用于不同數(shù)據(jù)存儲(chǔ)的公共工作負(fù)載集。就像任何通用的東西一樣,你應(yīng)該小心使用這個(gè)工具,因?yàn)槭褂盟苋菀椎贸鲥e(cuò)誤的結(jié)論。為了進(jìn)行公平的比較并做出明智的決定,你需要投入足夠的時(shí)間來(lái)了解數(shù)據(jù)庫(kù)將在何種實(shí)際環(huán)境下運(yùn)行,并相應(yīng)地調(diào)整基準(zhǔn)測(cè)試的內(nèi)容。

TPC-C基準(zhǔn)

事務(wù)處理性能委員會(huì)(Transaction Processing Performance Council,TPC)提供了一組數(shù)據(jù)庫(kù)廠商用來(lái)比較和宣傳其產(chǎn)品性能的基準(zhǔn)。TPC-C是一個(gè)聯(lián)機(jī)事務(wù)處理(OLTP)基準(zhǔn),它是只讀事務(wù)和更新事務(wù)的混合,用于模擬常見(jiàn)的應(yīng)用程序工作負(fù)載。

該基準(zhǔn)關(guān)注的是執(zhí)行的并發(fā)事務(wù)的性能和正確性。主要性能指標(biāo)是吞吐量:數(shù)據(jù)庫(kù)系統(tǒng)每分鐘能夠處理的事務(wù)數(shù)。其需要執(zhí)行事務(wù)具備ACID屬性并符合基準(zhǔn)本身定義的屬性集。

此基準(zhǔn)不專注于任何特定的業(yè)務(wù)部門,但提供了對(duì)大多數(shù)適用OLTP數(shù)據(jù)庫(kù)的應(yīng)用都很重要的抽象操作集。它包括幾個(gè)表和實(shí)體,如倉(cāng)庫(kù)、庫(kù)存、客戶和訂單,并指定了表布局、可以對(duì)表執(zhí)行的事務(wù)的細(xì)節(jié)、表的最小行數(shù)和數(shù)據(jù)持久性約束。

這并不意味著基準(zhǔn)測(cè)試只能用于比較數(shù)據(jù)庫(kù)。基準(zhǔn)可用于定義和測(cè)試服務(wù)級(jí)別協(xié)議注1的詳細(xì)信息、了解系統(tǒng)要求以及容量規(guī)劃等。你在使用數(shù)據(jù)庫(kù)之前對(duì)它了解得越多,在生產(chǎn)環(huán)境中運(yùn)行數(shù)據(jù)庫(kù)時(shí)節(jié)省的時(shí)間就越多。

選擇數(shù)據(jù)庫(kù)是一個(gè)長(zhǎng)期的決定,最好跟蹤新發(fā)布的版本,了解到底發(fā)生了什么變化及其原因,并制定升級(jí)策略。新版本通常包含對(duì)bug和安全問(wèn)題的改進(jìn)及修復(fù),但也可能會(huì)引入新的bug、性能退化或意外行為,因此在部署新版本之前測(cè)試新版本也是至關(guān)重要的。查看數(shù)據(jù)庫(kù)開(kāi)發(fā)者以前是如何處理升級(jí)的,可能會(huì)讓你對(duì)將來(lái)的情況有一個(gè)很好的了解。過(guò)去的順利升級(jí)并不能保證未來(lái)的升級(jí)也會(huì)如此順利,但過(guò)去復(fù)雜的升級(jí)可能也是未來(lái)升級(jí)亦會(huì)不容易的標(biāo)志。

?

理解權(quán)衡取舍

?

作為用戶,我們可以看到數(shù)據(jù)庫(kù)在不同條件下的行為,但是在使用數(shù)據(jù)庫(kù)時(shí),我們必須做出選擇來(lái)直接影響其行為。

設(shè)計(jì)一個(gè)存儲(chǔ)引擎肯定比僅實(shí)現(xiàn)一個(gè)教科書(shū)上的數(shù)據(jù)結(jié)構(gòu)要復(fù)雜得多:很難在一開(kāi)始就將許多細(xì)節(jié)和邊界情況處理正確。我們需要設(shè)計(jì)物理數(shù)據(jù)布局和組織指針、決定序列化格式、了解數(shù)據(jù)將如何被進(jìn)行垃圾收集、存儲(chǔ)引擎如何適應(yīng)整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)的語(yǔ)義、探索如何使其在并發(fā)環(huán)境中工作,以及最后確保在任何情況下都不會(huì)丟失任何數(shù)據(jù)。

不僅有許多事情需要決定,而且這些決定中的大多數(shù)都涉及權(quán)衡取舍。例如,如果按數(shù)據(jù)插入數(shù)據(jù)庫(kù)的順序保存,我們就可以更快地存儲(chǔ)它們;但是如果按字典順序檢索它們,我們就必須在將結(jié)果返回給客戶端之前對(duì)它們進(jìn)行重新排序。正如你將在本書(shū)中看到的那樣,存儲(chǔ)引擎設(shè)計(jì)有許多不同的方法,每個(gè)實(shí)現(xiàn)都有它自己的優(yōu)點(diǎn)和缺點(diǎn)。

在研究不同的存儲(chǔ)引擎時(shí),我們會(huì)討論它們的優(yōu)點(diǎn)和缺點(diǎn)。如果對(duì)于每個(gè)可以想到的用例都有一個(gè)絕對(duì)最優(yōu)的存儲(chǔ)引擎,那么人人都一定會(huì)使用它。但是并不存在這樣的儲(chǔ)存引擎,因此我們需要根據(jù)服務(wù)的工作負(fù)載和用例進(jìn)行明智的選擇。

市面上有許多存儲(chǔ)引擎,它們使用各種數(shù)據(jù)結(jié)構(gòu)并且用不同的語(yǔ)言實(shí)現(xiàn)—從低級(jí)語(yǔ)言(如C)到高級(jí)語(yǔ)言(如Java)。所有存儲(chǔ)引擎都面臨相同的挑戰(zhàn)和限制。可以將其與城市規(guī)劃相類比:我們?yōu)樘囟ǖ娜丝跀?shù)量構(gòu)建一座城市,并選擇是在高度上還是面積上對(duì)這座城市進(jìn)行擴(kuò)展。這兩種情況都可以將同樣數(shù)量的人放入該城市,但這些方法導(dǎo)致了截然不同的生活方式。當(dāng)在高度上建設(shè)城市時(shí),人們住在公寓里,人口密度可能導(dǎo)致面積較小地區(qū)的交通流量增加;而在一個(gè)面積更大且更分散的城市中,人們更有可能住在大房子里,但通勤則需要走更遠(yuǎn)的路。

類似地,存儲(chǔ)引擎的開(kāi)發(fā)人員所做的設(shè)計(jì)決策使它們更適合于不同的情況:有些對(duì)低讀寫延遲進(jìn)行了優(yōu)化,有些則試圖最大化存儲(chǔ)密度(每個(gè)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)量),而有些則專注于運(yùn)維上的簡(jiǎn)單性。

在《數(shù)據(jù)庫(kù)系統(tǒng)內(nèi)幕》的小結(jié)中,你可以找到可用于實(shí)現(xiàn)的完整算法和其他附加參考。閱讀本書(shū)可以使你為高效地利用這些資料而做好準(zhǔn)備,并使你對(duì)其中所述概念的現(xiàn)有替代辦法有扎實(shí)的理解。

本文摘編于《數(shù)據(jù)庫(kù)系統(tǒng)內(nèi)幕》,經(jīng)出版方授權(quán)發(fā)布。

推薦閱讀
  • 淺談分布式存儲(chǔ)中的網(wǎng)絡(luò)通信

  • 138 張圖帶你 MySQL 入門!

  • 如何在 Kubernetes 上配置 Jenkins?

  • 突發(fā)!印度封禁抖音、微信、快手等 59 款中國(guó) App

  • 厲害!國(guó)內(nèi)大學(xué)生計(jì)算機(jī)編程第一人,一人挑戰(zhàn)一個(gè)隊(duì),百度最年輕 T10,現(xiàn)創(chuàng)業(yè)自動(dòng)駕駛

  • Balancer因通縮代幣STA遭遇閃電貸攻擊,價(jià)值50萬(wàn)美元資產(chǎn)被黑

  • 淺談分布式存儲(chǔ)中的網(wǎng)絡(luò)通信

真香,朕在看了!

總結(jié)

以上是生活随笔為你收集整理的数据库怎么选择?终于有人讲明白了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。