亚洲视频之中文字幕,久久精品成人91一区二区,亚洲欧美动漫卡通一区二区,中文欧美亚洲欧日韩

News Contents
新聞資訊

管理大型共享數(shù)據(jù)庫(kù),做到這幾點(diǎn)不再頭疼!

發(fā)表日期2020/12/28 8:54:46      瀏覽次數(shù):次

編者按:一般來(lái)說(shuō),大型共享數(shù)據(jù)庫(kù)的管理會(huì)遇到不少麻煩,比如維護(hù)費(fèi)用、剩余垃圾等等,但做好一些事情之后,這些麻煩就會(huì)不那么讓人頭疼了。


編譯 | 彎月 責(zé)編 | 張文

頭 圖 | CSDN 下載自東方 IC

出品 | CSDN(ID:CSDNnews)

以下為譯文:

數(shù)據(jù)庫(kù)是業(yè)務(wù)系統(tǒng)的基礎(chǔ),不僅提供數(shù)據(jù)訪問(wèn),還需要在線數(shù)據(jù)庫(kù)定義語(yǔ)言、高可用性、存檔、異地磁帶輪換和管理、在線備份、訪問(wèn)控制、監(jiān)視和操作支持,以及復(fù)制到遠(yuǎn)程數(shù)據(jù)中心。

通常,數(shù)據(jù)庫(kù)規(guī)模龐大,功能強(qiáng)大且成本昂貴。即便是集團(tuán)級(jí)別的企業(yè)一般也只能負(fù)擔(dān)得起一個(gè)大型數(shù)據(jù)庫(kù)。此外,大型主機(jī)計(jì)算機(jī)系統(tǒng)及其數(shù)據(jù)庫(kù)非常昂貴,常常需要專門的工程師來(lái)構(gòu)建能夠滿足企業(yè)需求的應(yīng)用程序。

因此,很多公司的數(shù)據(jù)庫(kù)都會(huì)面臨一些相同的問(wèn)題:每個(gè)應(yīng)用程序都希望共享相同的數(shù)據(jù)庫(kù),且數(shù)據(jù)庫(kù)內(nèi)容納了許多垃圾?!肮氐谋瘎 痹跀?shù)據(jù)庫(kù)中也層出不窮。

因此,在本文中,我們就來(lái)探討一下如何在多個(gè)應(yīng)用程序之間合理地共享數(shù)據(jù)庫(kù),同時(shí)確保數(shù)據(jù)庫(kù)不會(huì)被文檔、照片、音頻文件和電影等非關(guān)系型的數(shù)據(jù)占據(jù)。

獨(dú)享數(shù)據(jù)庫(kù)與共享數(shù)據(jù)庫(kù)

在公司招收若干數(shù)據(jù)庫(kù)管理員,并建立起數(shù)據(jù)中心之后,公司的每個(gè)新應(yīng)用程序都將使用這個(gè)數(shù)據(jù)庫(kù)。這也無(wú)可厚非,因?yàn)橐话愎径紵o(wú)力再負(fù)擔(dān)另一個(gè)大型的主機(jī)。

很快,數(shù)據(jù)管理員就需要不斷設(shè)計(jì)各種的表結(jié)構(gòu),同時(shí)各種新功能和新應(yīng)用程序也將源源不斷地添加到這個(gè)共享的系統(tǒng)。隨著公司的發(fā)展,這個(gè)數(shù)據(jù)庫(kù)變得越來(lái)越重要,數(shù)據(jù)庫(kù)管理員必須確保數(shù)據(jù)庫(kù) 24 小時(shí)無(wú)間斷運(yùn)行。一旦數(shù)據(jù)庫(kù)出現(xiàn)任何問(wèn)題,公司的業(yè)務(wù)也會(huì)立即受到影響。公司的所有數(shù)據(jù)都集中在這個(gè)共享數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)管理員需要確保所有的數(shù)據(jù)都安全,萬(wàn)無(wú)一失。

剛開(kāi)始的時(shí)候,每個(gè)應(yīng)用程序都使用各自的表,服務(wù)各自的業(yè)務(wù)。然而,隨著應(yīng)用程序之間的交互越來(lái)越多,程序員很快就會(huì)放棄繁瑣的消息機(jī)制或 API 調(diào)用,轉(zhuǎn)而直接讀取其他應(yīng)用程序的表。這樣有什么壞處?各個(gè)應(yīng)用程序和表之間的關(guān)系會(huì)越來(lái)越復(fù)雜,糾纏不清。通過(guò)一個(gè)事務(wù)更新多個(gè)應(yīng)用程序的表的現(xiàn)象也會(huì)非常普遍。這時(shí),數(shù)據(jù)庫(kù)的整潔性也會(huì)蕩然無(wú)存。

非關(guān)系型的數(shù)據(jù)應(yīng)該保存在何處?

非關(guān)系型的數(shù)據(jù),例如文檔、照片、音頻以及視頻資料也需要妥善地保存起來(lái)。程序員常常利用 SQL 的 Blob 類型來(lái)存儲(chǔ)大量的數(shù)據(jù)。雖然數(shù)據(jù)庫(kù)是保存這類數(shù)據(jù)的一個(gè)好地方,但從數(shù)據(jù)庫(kù)本身來(lái)看,這種做法弊端很多。

對(duì)數(shù)據(jù)庫(kù)的使用者來(lái)說(shuō),將大量的數(shù)據(jù)塞入數(shù)據(jù)省時(shí)又省心,不僅可以輕松地存儲(chǔ)數(shù)據(jù),而且還有備份,保證了高可用性。此外,這些數(shù)據(jù)的更新也可以通過(guò)事務(wù)保證一致性。

然而,對(duì)于數(shù)據(jù)庫(kù)管理員來(lái)說(shuō),這就是噩夢(mèng)!隨著大量數(shù)據(jù)的“入駐”,數(shù)據(jù)庫(kù)會(huì)變得臃腫不堪。將文檔、照片、視頻這類的不可變數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)底層昂貴的存儲(chǔ)上,簡(jiǎn)直就是浪費(fèi)。

此外,從數(shù)據(jù)庫(kù)中提取這類龐大的數(shù)據(jù)并不是一件易事。也許我們可以利用掃描后的紙質(zhì)文檔和其他介質(zhì)的不可變的性質(zhì)來(lái)幫助我們完成這一操作。你可以為文檔分配 128 位 UUID,并將文檔存儲(chǔ)在其他位置,而數(shù)據(jù)庫(kù)只需在相關(guān)的記錄中保存該標(biāo)識(shí)符。

不過(guò),很快你就會(huì)發(fā)現(xiàn),將這些數(shù)據(jù)轉(zhuǎn)移到更便宜的存儲(chǔ)介質(zhì)上時(shí)會(huì)遇到很多困難。

首先,無(wú)法保證數(shù)據(jù)更新的事務(wù)性。通常,你需要通過(guò)以下方式更新這些數(shù)據(jù):

通過(guò)數(shù)據(jù)庫(kù)的事務(wù) 1 更新關(guān)系系統(tǒng),即將 UUID-X 對(duì)象插入應(yīng)用程序的表中,并通過(guò)另一列管理不可變對(duì)象的狀態(tài)。

使用 UUID-X 將不可變對(duì)象復(fù)制到新的存儲(chǔ)中。

通過(guò)數(shù)據(jù)庫(kù)的事務(wù) 2 更新對(duì)象的狀態(tài)(表示應(yīng)用程序可以使用不可變對(duì)象了)。

這中間會(huì)出現(xiàn)什么問(wèn)題?

如果在第 1 步和第 2 步之間出現(xiàn)問(wèn)題,那就會(huì)導(dǎo)致表中出現(xiàn)不完整的數(shù)據(jù),應(yīng)用程序雖然可以讀取數(shù)據(jù),但外部存儲(chǔ)中卻沒(méi)有實(shí)際的文件。與之類似,如果第2 步和第 3 步之間出現(xiàn)錯(cuò)誤,就會(huì)導(dǎo),外部存儲(chǔ)中的不可變對(duì)象就會(huì)變成永遠(yuǎn)無(wú)法訪問(wèn)的“垃圾”。

這個(gè)問(wèn)題的解決方法是,使用另一個(gè)表來(lái)記錄正在進(jìn)行的插入或者刪除。至少,這個(gè)表的狀態(tài)與應(yīng)用程序表中的插入或刪除操作的狀態(tài)是同步的。而且,正在進(jìn)行的插入或刪除應(yīng)該帶有時(shí)間戳,這樣萬(wàn)一出現(xiàn)了失敗的插入,你可以通過(guò)時(shí)間戳來(lái)判斷是否已經(jīng)過(guò)了足夠長(zhǎng)的時(shí)間,從而決定是否應(yīng)該進(jìn)行清理。這樣你的數(shù)據(jù)庫(kù)就相對(duì)穩(wěn)定了。

另一個(gè)可能出現(xiàn)的問(wèn)題是,過(guò)了幾個(gè)月或幾年后,存儲(chǔ)不可變數(shù)據(jù)的 blob 即將達(dá)到容量上限。為了在多個(gè)存儲(chǔ)中不可變數(shù)據(jù),你不得不修改數(shù)據(jù)庫(kù)中所有保存了 UUID 的表,為它們添加一列來(lái)記錄存儲(chǔ)庫(kù)的 ID。結(jié)果,你會(huì)發(fā)現(xiàn)你不知道數(shù)據(jù)庫(kù)的哪些表存儲(chǔ)了不可變對(duì)象!因?yàn)楦鱾€(gè)應(yīng)用程序在添加不可變對(duì)象的時(shí)候,并沒(méi)有彼此協(xié)調(diào)。

這個(gè)問(wèn)題的解決方法就是,專門建立一個(gè)表來(lái)管理不可變對(duì)象,并通過(guò)一個(gè)專門的模塊來(lái)封裝更新操作。這樣只要新的應(yīng)用程序遵守這個(gè)規(guī)則,采用間接的方式來(lái)使用不可變對(duì)象即可。但是,那些依然在直接訪問(wèn)不可變對(duì)象的舊應(yīng)用程序就只能聽(tīng)之任之了,因?yàn)閹缀醪豢赡馨阉械闹苯釉L問(wèn)都找出來(lái)并改掉。

你可以通過(guò)這種間接的手段,跨數(shù)據(jù)中心復(fù)制數(shù)據(jù),甚至可以將不可變的 Blob存儲(chǔ)遷移到新的數(shù)據(jù)中心。

分割系統(tǒng)

軟件工程中最大的問(wèn)題之一就是解耦合。我們的系統(tǒng)包含成千上萬(wàn)的軟件工程師傾注大量心血編寫的代碼,這些代碼相互交織,又互依互存。

然而,很多時(shí)候,共享寶貴的數(shù)據(jù)庫(kù)會(huì)讓我們的系統(tǒng)深陷巨大的泥潭。一旦各個(gè)應(yīng)用程序之間開(kāi)始互相訪問(wèn)表,就很難將它們隔離開(kāi)來(lái)。

為了實(shí)現(xiàn)應(yīng)用程序之間的解耦合,我們需要循序漸進(jìn):

創(chuàng)建渠道,方便跨應(yīng)用程序之間的異步工作。

禁止跨應(yīng)用程序訪問(wèn)表。應(yīng)用程序可以保留表的只讀副本,并在表的“主人”更新數(shù)據(jù)時(shí),異步更新這些副本。而其他應(yīng)用程序只可訪問(wèn)這些副本。

這種方式需要堅(jiān)持多年才能實(shí)現(xiàn)解耦合。

通常,這些工作都需要系統(tǒng)架構(gòu)師來(lái)推動(dòng),由他們從整體角度出發(fā),設(shè)計(jì)各個(gè)應(yīng)用程序的基礎(chǔ)架構(gòu)。很多時(shí)候,系統(tǒng)的整體架構(gòu)設(shè)計(jì)會(huì)與實(shí)際的工作發(fā)生沖突,公司領(lǐng)導(dǎo)需要高度重視公司文化的轉(zhuǎn)變與培養(yǎng)。在達(dá)成目標(biāo)時(shí)成功給予公平合理的獎(jiǎng)賞,并在構(gòu)建新功能時(shí)優(yōu)先考慮解耦合,避免解耦合成為團(tuán)隊(duì)前進(jìn)的阻力。

從某些方面來(lái)看,分割一個(gè)大型的應(yīng)用程序要比將兩個(gè)遺留系統(tǒng)以解耦合的方式合并在一起簡(jiǎn)單得多。在收購(gòu)另一家公司時(shí),他們的應(yīng)用程序基于完全不同的公司文化,對(duì)最基本的概念(比如客戶)都有不同的理解,如果將這些應(yīng)用程序的元數(shù)據(jù)直接融合到你的數(shù)據(jù)庫(kù)中,那么勢(shì)必引發(fā)巨大的混亂。

分割巨大的應(yīng)用程序就像規(guī)劃一座城市的道路一樣,如何能夠像古代長(zhǎng)安一樣,規(guī)劃出整齊劃一又四通八達(dá)的街道,這本身就是一項(xiàng)巨大的挑戰(zhàn)。一不小心,城市中心就會(huì)被一座座摩天大樓割裂,道路崎嶇,交通堵塞。

數(shù)據(jù)庫(kù)的擴(kuò)張

隨著公司業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫(kù)必將不斷增長(zhǎng)。即使將 Blob 等大型數(shù)據(jù)存儲(chǔ)在其他地方,實(shí)現(xiàn)各個(gè)應(yīng)用程序之間的解耦合,相關(guān)的數(shù)據(jù)仍然在同一個(gè)數(shù)據(jù)庫(kù)中。

通常,數(shù)據(jù)庫(kù)的擴(kuò)張可以朝著兩個(gè)方向發(fā)展:

向上擴(kuò)展:購(gòu)買更多更好的硬件,擴(kuò)展數(shù)據(jù)庫(kù)的底層設(shè)施。

向外擴(kuò)展:嘗試向外擴(kuò)展數(shù)據(jù)庫(kù),通過(guò)多臺(tái)計(jì)算機(jī)組成的集群來(lái)構(gòu)建更大規(guī)模的數(shù)據(jù)庫(kù)。

規(guī)模擴(kuò)大意味著保存的數(shù)據(jù)更多,處理的事務(wù)也更多。應(yīng)用程序是在平臺(tái)上開(kāi)發(fā)出來(lái)的,而數(shù)據(jù)庫(kù)是平臺(tái)的主要組成部分。將某個(gè)大型應(yīng)用程序移至新數(shù)據(jù)庫(kù)的難度非常大,且風(fēng)險(xiǎn)極高。

數(shù)據(jù)庫(kù)中有許多微妙的方面,會(huì)對(duì)應(yīng)用程序大量的代碼產(chǎn)生影響,比如:

使用非標(biāo)準(zhǔn)數(shù)據(jù)庫(kù)功能。每個(gè)數(shù)據(jù)庫(kù)供應(yīng)商都會(huì)提供一些專屬的非標(biāo)準(zhǔn)功能。在大多數(shù)情況下,代碼中會(huì)存在大量使用這些非標(biāo)準(zhǔn)功能的代碼,而且經(jīng)過(guò)長(zhǎng)年累月的修改和重構(gòu),這些代碼已經(jīng)深深扎根于代碼庫(kù)中,而最初的作者早已離職,根本沒(méi)辦法找出當(dāng)初這樣做的原因。

并發(fā)語(yǔ)義。 多版本并發(fā)控制、可序列化性、可重復(fù)讀取以及讀取已提交數(shù)據(jù)這些并發(fā)模型之間的細(xì)微差別并不是無(wú)中生有。 有關(guān)這方面的討論層出不窮,在大型應(yīng)用程序保證并發(fā)語(yǔ)義的一致性非常關(guān)鍵。

樂(lè)觀并發(fā)控制與悲觀并發(fā)控制。 樂(lè)觀并發(fā)控制假設(shè)多用戶并發(fā)的事務(wù)在處理時(shí)不會(huì)彼此互相影響,各事務(wù)能夠在不產(chǎn)生鎖的情況下處理各自的數(shù)據(jù)。如果發(fā)生沖突,則事務(wù)中止。大多數(shù)時(shí)候,這種做法更有效率。在悲觀并發(fā)控制中,如果一個(gè)事務(wù)執(zhí)行的操作讀某行數(shù)據(jù)應(yīng)用了鎖,那么只有當(dāng)這個(gè)事務(wù)釋放鎖,其他事務(wù)才能夠執(zhí)行與該鎖沖突的操作。盡管悲觀并發(fā)控制的代價(jià)更高,但這種方式可以防止陷入由于沖突而反復(fù)提交失敗的困境。雖然樂(lè)觀和悲觀之間的選擇并不會(huì)影響應(yīng)用程序所做更改的正確性,但數(shù)據(jù)庫(kù)行為更改為超出應(yīng)用程序預(yù)期的范圍可能會(huì)引發(fā)很多性能問(wèn)題。

數(shù)據(jù)庫(kù)遷移的難度不容小覷。而將數(shù)據(jù)庫(kù)從集中式系統(tǒng)轉(zhuǎn)移到分布式系統(tǒng),雖然規(guī)模的擴(kuò)張毋庸置疑,但其性能肯定會(huì)受到某些影響。協(xié)調(diào)鎖和并發(fā)將面臨各種的性能挑戰(zhàn),而整個(gè)過(guò)度的過(guò)程也將充滿艱險(xiǎn)。因此,將應(yīng)用程序遷移到分布式數(shù)據(jù)庫(kù)上,需要耐心和洞察力。

總結(jié)

人們對(duì)于數(shù)據(jù)庫(kù)往往是愛(ài)與痛并存。讓每個(gè)應(yīng)用程序獨(dú)享數(shù)據(jù)庫(kù)會(huì)導(dǎo)致公司內(nèi)產(chǎn)生很多數(shù)據(jù)庫(kù),不僅會(huì)加重成本的負(fù)擔(dān),而且也會(huì)為數(shù)據(jù)庫(kù)的操作和管理帶來(lái)挑戰(zhàn)。然而,共享數(shù)據(jù)庫(kù)時(shí),應(yīng)用程序之間又面臨解耦合與交互的問(wèn)題。因此,我們需要謹(jǐn)慎地使用數(shù)據(jù)庫(kù):

管理 Blob。創(chuàng)建一種形式化的機(jī)制來(lái)處理 Blob,即使目前你將這些數(shù)據(jù)保存在數(shù)據(jù)庫(kù)中,以后也可以移至其他地方。

保證應(yīng)用程序之間的解耦合,讓每個(gè)應(yīng)用程序都遠(yuǎn)離其他應(yīng)用程序的表。

利用消息機(jī)制實(shí)現(xiàn)應(yīng)用程序之間的交互。通過(guò)某種形式的異步消息將應(yīng)用程序連接起來(lái),結(jié)合應(yīng)用程序的解耦合,可以降低數(shù)據(jù)庫(kù)的遷移難度。


撫順眾聯(lián)網(wǎng)絡(luò)成立于2002年,一直專注于高品質(zhì)網(wǎng)站建設(shè),服務(wù)!