數(shù)據(jù)庫(kù)擴(kuò)展策略
譯文了解數(shù)據(jù)庫(kù)擴(kuò)展的不同技術(shù),有助于我們選擇適合我們需求和目的的合適策略。
因此,在這篇文章中,我們將展示不同的數(shù)據(jù)庫(kù)服務(wù)器擴(kuò)展解決方案和技術(shù),分為讀取和寫(xiě)入兩大類策略。
讀取/加載
為了解決應(yīng)用程序有時(shí)負(fù)載過(guò)大的問(wèn)題,我們匯總了三種技術(shù):
緩存
緩存技術(shù)將頻繁請(qǐng)求的數(shù)據(jù)或費(fèi)時(shí)的計(jì)算操作響應(yīng)存儲(chǔ)在臨時(shí)內(nèi)存中。緩存中存儲(chǔ)的數(shù)據(jù)需要根據(jù)應(yīng)用程序的性質(zhì)進(jìn)行更改,并且可以通過(guò)緩存失效和清除技術(shù)進(jìn)行更新,以保持?jǐn)?shù)據(jù)的一致性。可以通過(guò)緩存過(guò)期時(shí)間(TTL)方法或其他依賴于所使用的緩存模式來(lái)實(shí)現(xiàn)。
使用不同的緩存模式可以作為實(shí)施緩存解決方案的策略。Caching aside是針對(duì)大量讀取并且即使緩存失效也能工作的解決方案。Read-through和Write-through一起使用,這是適用于讀取密集型工作負(fù)載的良好選擇,但如果緩存失敗會(huì)導(dǎo)致系統(tǒng)故障。Write-back則適用于寫(xiě)入密集型工作負(fù)載,并且被各種數(shù)據(jù)庫(kù)管理系統(tǒng)實(shí)現(xiàn)所使用。
緩存
根據(jù)要求,例如需要大量讀取、大量寫(xiě)入或二者混合,我們可以決定使用哪種模式以更好應(yīng)對(duì)緩存或數(shù)據(jù)庫(kù)故障。
數(shù)據(jù)庫(kù)復(fù)制
復(fù)制是一種工作方式,其中有一個(gè)被稱為“主數(shù)據(jù)庫(kù)”的數(shù)據(jù)庫(kù),所有寫(xiě)入請(qǐng)求都流向該數(shù)據(jù)庫(kù)。此外,我們將主數(shù)據(jù)庫(kù)制作成精確的副本,作為稱為“輔助節(jié)點(diǎn)”的新節(jié)點(diǎn)副本,僅負(fù)責(zé)處理讀取請(qǐng)求。主數(shù)據(jù)庫(kù)不斷向從節(jié)點(diǎn)提供更新的數(shù)據(jù),使得我們?cè)诩褐械乃泄?jié)點(diǎn)之間保持?jǐn)?shù)據(jù)一致性。
復(fù)制是處理容錯(cuò)和維護(hù)CAP定理和系統(tǒng)可擴(kuò)展性的有效策略。假設(shè)其中一個(gè)節(jié)點(diǎn)故障,我們?nèi)匀豢梢蕴峁┓?wù),因?yàn)槲覀冊(cè)谄渌?jié)點(diǎn)中進(jìn)行了相同的數(shù)據(jù)復(fù)制。此外,在集群中,在主節(jié)點(diǎn)故障時(shí),一個(gè)節(jié)點(diǎn)可以接管并成為主數(shù)據(jù)庫(kù)。復(fù)制還有助于減少應(yīng)用程序的延遲,因?yàn)槲覀兛梢詫?shù)據(jù)庫(kù)部署并在不同地區(qū)進(jìn)行數(shù)據(jù)復(fù)制,例如CDN,并且可以輕松地由本地用戶訪問(wèn)。
數(shù)據(jù)庫(kù)復(fù)制
同步和異步
隨著節(jié)點(diǎn)數(shù)量的增加,維護(hù)副本節(jié)點(diǎn)數(shù)據(jù)的一致性變得更加復(fù)雜。根據(jù)需求,這個(gè)問(wèn)題可以通過(guò)使用同步或異步復(fù)制策略來(lái)解決。
同步策略的優(yōu)勢(shì)在于延遲為零,并且數(shù)據(jù)始終保持一致,但劣勢(shì)是性能受到影響,因?yàn)樾枰却懈北靖虏⒈话l(fā)行者確認(rèn)。在異步策略中,寫(xiě)操作變得更快,因?yàn)橹鞴?jié)點(diǎn)不需要等待確認(rèn),但如果某個(gè)副本未能更新數(shù)值,則會(huì)出現(xiàn)不一致?tīng)顟B(tài)的問(wèn)題。
請(qǐng)記住,并沒(méi)有萬(wàn)能策略,最佳策略取決于我們的需求。在一致性、可用性或分區(qū)(CAP定理)之間必須做出權(quán)衡。CAP定理指出我們每次只能保證其中兩個(gè)。
索引
索引用于定位和快速訪問(wèn)數(shù)據(jù),提高數(shù)據(jù)庫(kù)活動(dòng)的性能。一個(gè)數(shù)據(jù)庫(kù)表可以與之關(guān)聯(lián)的一個(gè)或多個(gè)索引。
通過(guò)索引,查詢性能得到提升,數(shù)據(jù)檢索速度更快;索引增強(qiáng)了數(shù)據(jù)訪問(wèn)效率,減少了檢索數(shù)據(jù)的I/O次數(shù);索引優(yōu)化了數(shù)據(jù)排序,因?yàn)閿?shù)據(jù)庫(kù)不需要對(duì)整個(gè)表進(jìn)行排序,只需對(duì)相關(guān)行進(jìn)行排序;索引使得在數(shù)據(jù)量增加的情況下仍然能夠保持?jǐn)?shù)據(jù)一致性;此外,索引還確保了數(shù)據(jù)庫(kù)的完整性,避免存儲(chǔ)重復(fù)數(shù)據(jù)。
但索引的缺點(diǎn)也很明顯——索引需要更多的存儲(chǔ)空間,增加了數(shù)據(jù)庫(kù)的大小。同時(shí),在表中進(jìn)行添加、刪除和修改時(shí)也會(huì)增加維護(hù)開(kāi)銷。在特定查詢或應(yīng)用程序中選擇適當(dāng)?shù)乃饕赡軙?huì)比較困難。
寫(xiě)入
對(duì)于頻繁向數(shù)據(jù)庫(kù)寫(xiě)入大量數(shù)據(jù)的應(yīng)用程序,我們可以采用分片(sharding)和NoSQL作為策略。
分片
分片或數(shù)據(jù)分區(qū)允許將大型數(shù)據(jù)庫(kù)數(shù)據(jù)拆分為更小、更快、更易管理的部分,將數(shù)據(jù)庫(kù)拆分為多個(gè)主要數(shù)據(jù)庫(kù)。有兩種類型的分片,垂直分片和水平分片。
分片的優(yōu)勢(shì)在于查詢優(yōu)化,提供更好的性能和減少延遲。它使得用戶數(shù)據(jù)可以跨不同地理位置進(jìn)行訪問(wèn),從而可以更快地為特定地區(qū)的用戶提供服務(wù)。此外,它還避免了單點(diǎn)故障的問(wèn)題。
但分片的一個(gè)缺點(diǎn)是當(dāng)我們沒(méi)有正確地將數(shù)據(jù)在分區(qū)之間進(jìn)行平衡時(shí),可能會(huì)導(dǎo)致某些分區(qū)負(fù)載過(guò)重。根據(jù)所選擇的策略不同,可能會(huì)出現(xiàn)一些包含大量數(shù)據(jù)的分區(qū)和一些包含較少數(shù)據(jù)的分區(qū),從而導(dǎo)致對(duì)于大型分區(qū)上的查詢變慢。另一個(gè)缺點(diǎn)是一旦實(shí)施了切片策略并將數(shù)據(jù)拆分到不同的數(shù)據(jù)庫(kù)中后,很難回退并恢復(fù)到之前無(wú)切片策略時(shí)的狀態(tài)。
對(duì)于數(shù)據(jù)進(jìn)行切片操作可以選擇邏輯切片或物理切片。邏輯切片是指在同一臺(tái)物理機(jī)器上具有不同的數(shù)據(jù)子集,而物理切片可以在一臺(tái)物理機(jī)器上擁有多個(gè)分區(qū)子集。
在進(jìn)行數(shù)據(jù)切片時(shí),我們可以選擇算法切片或動(dòng)態(tài)切片。存在不同的算法和動(dòng)態(tài)切片技術(shù),其中基于鍵的、基于范圍的和基于目錄的分片是最常用的方法。
垂直分片
對(duì)于垂直分片,我們將每個(gè)表放置在不同的機(jī)器上。例如,用戶表、日志表或評(píng)論表都放置在不同的機(jī)器上。當(dāng)查詢傾向于僅返回?cái)?shù)據(jù)的子集時(shí),垂直分片是有效的。例如,如果某些查詢僅請(qǐng)求名稱,而其他查詢僅請(qǐng)求地址,則可以將名稱和地址分片到單獨(dú)的服務(wù)器上。
垂直分片
水平分片
如果我們有一個(gè)非常大的單個(gè)表,我們可以應(yīng)用水平分片。我們將單個(gè)表中的一部分相關(guān)數(shù)據(jù)拆分到多臺(tái)機(jī)器上。當(dāng)查詢傾向于返回經(jīng)常分組的行的子集時(shí),水平分片是有效的。例如,基于短日期范圍篩選數(shù)據(jù)的查詢非常適合水平分片,因?yàn)槿掌诜秶鷮⒈厝幌拗撇樵兊絻H一部分服務(wù)器上。
水平分片
NoSQL
NoSQL不是一個(gè)關(guān)系型數(shù)據(jù)庫(kù),本質(zhì)上是一個(gè)鍵值對(duì)模型。鍵值對(duì)模型天然能夠輕松地在多臺(tái)不同的機(jī)器上進(jìn)行自動(dòng)擴(kuò)展。NoSQL分為四個(gè)主要類別,列式存儲(chǔ)將數(shù)據(jù)按列族存儲(chǔ),圖形存儲(chǔ)將數(shù)據(jù)存儲(chǔ)為節(jié)點(diǎn)和邊,鍵值存儲(chǔ)將數(shù)據(jù)存儲(chǔ)為鍵值對(duì),文檔存儲(chǔ)將數(shù)據(jù)存儲(chǔ)為半結(jié)構(gòu)化文檔。
NoSQL 數(shù)據(jù)庫(kù)種類
NoSQL數(shù)據(jù)庫(kù)允許動(dòng)態(tài)模式,可以在不改變模式結(jié)構(gòu)的情況下適應(yīng)變化。此外,它提供了水平可擴(kuò)展性,通過(guò)向數(shù)據(jù)庫(kù)集群添加更多節(jié)點(diǎn)來(lái)擴(kuò)展。它還被設(shè)計(jì)為高可用性,能夠自動(dòng)處理節(jié)點(diǎn)故障,并在集群中的多個(gè)節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)復(fù)制。
與關(guān)系型數(shù)據(jù)庫(kù)相比,這種非關(guān)系型數(shù)據(jù)庫(kù)具有多個(gè)優(yōu)點(diǎn),如可擴(kuò)展性、靈活性和成本效益。然而,它們也有一些缺點(diǎn),例如缺乏標(biāo)準(zhǔn)化、缺乏ACID兼容性以及對(duì)復(fù)雜查詢的支持不足。
總結(jié)
在本文中,我們介紹了處理數(shù)據(jù)庫(kù)可擴(kuò)展性時(shí)可以實(shí)施的策略。
我們將策略分為讀取和寫(xiě)入兩個(gè)方面。對(duì)于讀取方面,我們可以應(yīng)用不同的緩存機(jī)制,使用主副本數(shù)據(jù)庫(kù)進(jìn)行復(fù)制,以及實(shí)施索引來(lái)定位和快速訪問(wèn)數(shù)據(jù)。對(duì)于寫(xiě)入可擴(kuò)展性,有分片或NoSQL等策略,它們都有各自的優(yōu)點(diǎn)和缺點(diǎn)。
最后,請(qǐng)記住,沒(méi)有完美的解決方案,我們需要了解自己的需求,并在選擇最佳策略時(shí)進(jìn)行權(quán)衡。
作者 | Jailson Evora























