自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

數(shù)據(jù)庫怎么選擇?

運(yùn)維 數(shù)據(jù)庫運(yùn)維
所有數(shù)據(jù)庫管理系統(tǒng)的主要工作都是「可靠地存儲(chǔ)數(shù)據(jù)」并使其對(duì)用戶可用。我們使用數(shù)據(jù)庫作為數(shù)據(jù)的主要來源,幫助我們?cè)趹?yīng)用程序的不同部分之間共享數(shù)據(jù)。

 本文轉(zhuǎn)載自微信公眾號(hào)「 武培軒」,作者Alex Petrov。轉(zhuǎn)載本文請(qǐng)聯(lián)系 武培軒公眾號(hào)。 

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

[[334223]]

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

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

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

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

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

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

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

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

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

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

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

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

客戶端數(shù)量

查詢類型和訪問模式

讀寫查詢速率

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

明確這些變量可以幫助回答以下問題:

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

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

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

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

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

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

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

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

有些人以為,可以將數(shù)據(jù)庫當(dāng)作黑匣子而無須了解其中的內(nèi)容是件好事。但實(shí)踐往往表明,這樣做遲早會(huì)碰到bug、服務(wù)中斷、性能倒退或其他問題。你最好為這些問題做好準(zhǔn)備,如果你了解并且理解數(shù)據(jù)庫的內(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í)間來了解數(shù)據(jù)庫將在何種實(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ù)庫廠商用來比較和宣傳其產(chǎn)品性能的基準(zhǔn)。TPC-C是一個(gè)聯(lián)機(jī)事務(wù)處理(OLTP)基準(zhǔn),它是只讀事務(wù)和更新事務(wù)的混合,用于模擬常見的應(yīng)用程序工作負(fù)載。

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

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

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

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

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

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

不僅有許多事情需要決定,而且這些決定中的大多數(shù)都涉及權(quán)衡取舍。例如,如果按數(shù)據(jù)插入數(shù)據(jù)庫的順序保存,我們就可以更快地存儲(chǔ)它們;但是如果按字典順序檢索它們,我們就必須在將結(jié)果返回給客戶端之前對(duì)它們進(jìn)行重新排序。正如你將在本書中看到的那樣,存儲(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)并且用不同的語言實(shí)現(xiàn)—從低級(jí)語言(如C)到高級(jí)語言(如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ǔ)引擎的開發(fā)人員所做的設(shè)計(jì)決策使它們更適合于不同的情況:有些對(duì)低讀寫延遲進(jìn)行了優(yōu)化,有些則試圖最大化存儲(chǔ)密度(每個(gè)節(jié)點(diǎn)存儲(chǔ)的數(shù)據(jù)量),而有些則專注于運(yùn)維上的簡單性。

 

責(zé)任編輯:武曉燕 來源: 武培軒
相關(guān)推薦

2013-08-14 09:12:42

云數(shù)據(jù)庫SQLNoSQL

2024-07-09 08:27:30

2024-03-28 09:00:00

NoSQL數(shù)據(jù)庫

2010-05-28 16:27:35

EnterpriseD

2011-03-30 08:56:44

Zabbix數(shù)據(jù)庫

2011-03-23 15:34:57

數(shù)據(jù)庫審計(jì)

2019-07-23 11:41:45

數(shù)據(jù)庫SQLDocker

2023-07-06 15:05:34

矢量數(shù)據(jù)庫數(shù)據(jù)庫

2017-11-20 13:32:54

微服務(wù)數(shù)據(jù)庫開發(fā)

2010-11-15 16:13:24

Oracle數(shù)據(jù)庫性能

2023-01-24 15:58:39

數(shù)據(jù)庫架構(gòu)編程語言

2023-04-03 08:00:00

數(shù)據(jù)庫NoSQL

2019-06-26 07:25:47

NoSQL數(shù)據(jù)庫開發(fā)

2022-05-05 09:11:33

數(shù)據(jù)庫加密數(shù)據(jù)安全

2020-06-17 15:01:30

物聯(lián)網(wǎng)數(shù)據(jù)庫物聯(lián)網(wǎng)數(shù)據(jù)庫

2016-10-08 18:13:55

數(shù)據(jù)庫性能工具數(shù)據(jù)庫管理系統(tǒng)

2017-06-19 16:20:09

數(shù)據(jù)庫性能工具

2011-03-07 09:52:49

PSQL MySQL 開源數(shù)據(jù)庫

2014-07-15 14:39:13

甲骨文

2011-04-19 09:28:26

數(shù)據(jù)庫產(chǎn)品
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)