數(shù)據(jù)庫(kù)是長(zhǎng)時(shí)間存儲(chǔ)在計(jì)算機(jī)中的有組織且可共享的數(shù)據(jù)集合。數(shù)據(jù)庫(kù)中的數(shù)據(jù)是指某種數(shù)據(jù)模型的組織,描述和存儲(chǔ),具有最小的冗余度,高度的數(shù)據(jù)獨(dú)立性和易伸縮性,并且可以在一定范圍內(nèi)多個(gè)用戶共享,這就不得不提到數(shù)據(jù)庫(kù)擴(kuò)展了,在數(shù)據(jù)庫(kù)擴(kuò)展中主要存這樣幾個(gè)問(wèn)題即:成本、使用指標(biāo)查找瓶頸、從鳥(niǎo)瞰視角擴(kuò)展應(yīng)用程序。那么數(shù)據(jù)庫(kù)擴(kuò)展解決方案有哪些?在本文中,研究了數(shù)據(jù)庫(kù)擴(kuò)展解決方案,這通常是失敗的第一點(diǎn)。如果您還不熟悉系統(tǒng)設(shè)計(jì),下文將向您簡(jiǎn)短介紹這個(gè)問(wèn)題。
1.緩存數(shù)據(jù)庫(kù)查詢
緩存數(shù)據(jù)庫(kù)查詢是可以處理數(shù)據(jù)庫(kù)負(fù)載的最簡(jiǎn)單的改進(jìn)之一。通常,應(yīng)用程序?qū)贁?shù)查詢,這些查詢構(gòu)成了大多數(shù)請(qǐng)求。不必每次都在網(wǎng)絡(luò)上對(duì)該數(shù)據(jù)進(jìn)行往返,而是可以將其簡(jiǎn)單地緩存在web服務(wù)器的內(nèi)存中。第一個(gè)請(qǐng)求將從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),并將結(jié)果緩存在服務(wù)器上,以后的請(qǐng)求將從緩存中讀取。由于數(shù)據(jù)花費(fèi)在網(wǎng)絡(luò)上的時(shí)間更少,并且距離客戶端更近,因此可以提高性能。
由于大量的工作負(fù)載分配給了緩存系統(tǒng),因此還導(dǎo)致更多的數(shù)據(jù)庫(kù)服務(wù)器資源可用。除了提高可用性之外,如果數(shù)據(jù)庫(kù)不可用,則高速緩存仍可以為應(yīng)用程序提供連續(xù)服務(wù),從而使系統(tǒng)對(duì)故障的恢復(fù)能力更強(qiáng)。您可以使用許多工具對(duì)數(shù)據(jù)庫(kù)查詢?nèi)罩具M(jìn)行分析,因此您可以查看哪些查詢花費(fèi)的時(shí)間最長(zhǎng),哪些查詢運(yùn)行的頻率最高。
顯然,緩存的數(shù)據(jù)會(huì)很快變得"陳舊"或過(guò)時(shí)。您將必須選擇要緩存的數(shù)據(jù)以及要保留多長(zhǎng)時(shí)間。例如,在線報(bào)紙每24小時(shí)就會(huì)有一份新的日?qǐng)?bào),而不是每次用戶訪問(wèn)該網(wǎng)站時(shí)都從數(shù)據(jù)庫(kù)中請(qǐng)求該數(shù)據(jù),而是可以將這些數(shù)據(jù)在Web服務(wù)器上緩存24小時(shí)并直接從服務(wù)器提供該數(shù)據(jù)。產(chǎn)品或業(yè)務(wù)要求將決定哪些內(nèi)容可以緩存,哪些內(nèi)容不能緩存。
2.數(shù)據(jù)庫(kù)索引
數(shù)據(jù)庫(kù)索引是一種提高數(shù)據(jù)庫(kù)表上數(shù)據(jù)檢索操作速度的技術(shù)。索引用于快速定位數(shù)據(jù),而不必每次訪問(wèn)表時(shí)都在表中搜索每一行。通常,數(shù)據(jù)庫(kù)索引的數(shù)據(jù)結(jié)構(gòu)將是二進(jìn)制搜索樹(shù)。這允許將訪問(wèn)數(shù)據(jù)的時(shí)間復(fù)雜度從線性時(shí)間O(n)降低到對(duì)數(shù)時(shí)間Olog(n)。
根據(jù)表中的行數(shù),這可以節(jié)省大量使用索引列的查詢的時(shí)間。例如,如果您有10,000個(gè)用戶,并且您的應(yīng)用程序的配置文件頁(yè)面按用戶名查找用戶,則未編制索引的查詢將檢查users表中的每一行,直到找到與傳遞給查詢的用戶名匹配的配置文件。這可能需要多達(dá)10,000個(gè)行檢查O(n)。通過(guò)為"用戶名"列創(chuàng)建索引,數(shù)據(jù)庫(kù)可以在對(duì)數(shù)時(shí)間復(fù)雜度(Olog(n))下提取該行。在這種情況下,行檢查的最大數(shù)量將是14,而不是10,000!
有效的索引編制通過(guò)提高效率來(lái)減輕數(shù)據(jù)庫(kù)的負(fù)載,這還可以顯著提高性能,從而帶來(lái)更好的用戶體驗(yàn)。創(chuàng)建索引確實(shí)會(huì)添加另一組要存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù),因此在確定要索引的字段時(shí)必須謹(jǐn)慎判斷。即使使用了現(xiàn)有的存儲(chǔ)空間,索引也還是很值得的,尤其是在現(xiàn)代開(kāi)發(fā)中,內(nèi)存便宜且性能是生存不可或缺的一部分。
在本節(jié)中略微提到了時(shí)間復(fù)雜度和數(shù)據(jù)結(jié)構(gòu),但沒(méi)有進(jìn)行詳盡的解釋。如果您有興趣學(xué)習(xí)或希望對(duì)時(shí)間復(fù)雜性和數(shù)據(jù)結(jié)構(gòu)有所了解,那么上面鏈接的文章非常有用!
3.會(huì)話存儲(chǔ)
許多應(yīng)用程序通過(guò)將會(huì)話ID存儲(chǔ)在cookie中,然后將每個(gè)會(huì)話的鍵/值對(duì)的實(shí)際數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)表中來(lái)處理會(huì)話。這可能會(huì)成為對(duì)數(shù)據(jù)庫(kù)的大量讀取和寫(xiě)入。如果會(huì)話數(shù)據(jù)使數(shù)據(jù)庫(kù)不堪重負(fù),那么最好重新考慮如何以及在何處存儲(chǔ)該數(shù)據(jù)。
將會(huì)話數(shù)據(jù)移動(dòng)到內(nèi)存緩存工具可能是一個(gè)不錯(cuò)的選擇。由于內(nèi)存中的內(nèi)存比大多數(shù)數(shù)據(jù)庫(kù)使用的持久性磁盤存儲(chǔ)要快,因此這將減輕數(shù)據(jù)庫(kù)中會(huì)話數(shù)據(jù)的負(fù)擔(dān),并提高訪問(wèn)速度。但是,由于內(nèi)存是易失性內(nèi)存,因此如果緩存系統(tǒng)脫機(jī),則存在丟失所有會(huì)話數(shù)據(jù)的風(fēng)險(xiǎn)。
您也可以考慮將會(huì)話實(shí)現(xiàn)更改為將會(huì)話信息存儲(chǔ)在cookie本身中,這將使您保持會(huì)話狀態(tài)的方法從服務(wù)器移到客戶端。JWT是這種模式最流行的實(shí)現(xiàn)。這將減輕數(shù)據(jù)庫(kù)中所有會(huì)話數(shù)據(jù)的負(fù)擔(dān),并消除服務(wù)器端會(huì)話的依賴性,盡管這會(huì)帶來(lái)一系列挑戰(zhàn)。
4.從站主復(fù)制
如果即使在緩存通用查詢,創(chuàng)建有效索引以及處理會(huì)話存儲(chǔ)之后,數(shù)據(jù)庫(kù)仍然承受著來(lái)自讀取的過(guò)多負(fù)載,那么復(fù)制可能是下一個(gè)最佳選擇。
使用從屬主復(fù)制,您只有一個(gè)數(shù)據(jù)庫(kù)可以寫(xiě)入。它被克隆到您讀取的幾個(gè)從數(shù)據(jù)庫(kù)中,每個(gè)從數(shù)據(jù)庫(kù)都位于另一臺(tái)計(jì)算機(jī)上。這樣可以減輕主數(shù)據(jù)庫(kù)的讀取負(fù)擔(dān),并將其分配到多個(gè)服務(wù)器上。該模型還提高了寫(xiě)操作的性能,因?yàn)橹髟O(shè)備專門用于寫(xiě)操作,同時(shí)由于從設(shè)備分布在不同區(qū)域,因此可以顯著提高讀取速度并減少延遲。
由于每個(gè)從數(shù)據(jù)庫(kù)都在另一臺(tái)計(jì)算機(jī)上,因此對(duì)主數(shù)據(jù)庫(kù)的寫(xiě)入需要傳播到從數(shù)據(jù)庫(kù),這可能導(dǎo)致數(shù)據(jù)不一致。如果您需要立即讀取寫(xiě)入數(shù)據(jù)庫(kù)的數(shù)據(jù),例如您正在更新配置文件并希望立即呈現(xiàn)它,則可以選擇從master數(shù)據(jù)庫(kù)讀取。從屬主復(fù)制是一個(gè)功能非常強(qiáng)大的擴(kuò)展解決方案,但是它具有相當(dāng)多的復(fù)雜性。在用盡了更簡(jiǎn)單的解決方案并確保在應(yīng)用程序內(nèi)進(jìn)行有效優(yōu)化之后,實(shí)施此解決方案是明智的。
5.數(shù)據(jù)庫(kù)分片
到目前為止,這些擴(kuò)展解決方案中的大多數(shù)都專注于通過(guò)管理對(duì)數(shù)據(jù)庫(kù)的讀取來(lái)減少負(fù)載。數(shù)據(jù)庫(kù)分片是一種水平擴(kuò)展解決方案,可通過(guò)管理對(duì)數(shù)據(jù)庫(kù)的讀寫(xiě)來(lái)管理負(fù)載。這是一種架構(gòu)模式,涉及將主數(shù)據(jù)庫(kù)拆分為多個(gè)數(shù)據(jù)庫(kù)的過(guò)程,這些數(shù)據(jù)庫(kù)可以更快,更易于管理。
數(shù)據(jù)庫(kù)分片技術(shù)有兩種類型:垂直分片和水平分片。使用水平分區(qū)時(shí),將表取出并放在不同的機(jī)器上,每個(gè)表具有相同的列,但行不同。垂直分區(qū)更為復(fù)雜,其中涉及在多臺(tái)計(jì)算機(jī)之間拆分一個(gè)表。一個(gè)表被分離出來(lái)并放入新的不同表中。一個(gè)垂直分區(qū)中保存的數(shù)據(jù)獨(dú)立于所有其他分區(qū)中的數(shù)據(jù),每個(gè)表都包含不同的行和列。
兩種分片技術(shù)都有助于水平擴(kuò)展,也稱為"向外擴(kuò)展",這使您可以在系統(tǒng)中添加更多機(jī)器以分配/分散負(fù)載。水平擴(kuò)展通常與垂直擴(kuò)展形成對(duì)比,后者涉及升級(jí)現(xiàn)有服務(wù)器的硬件。擴(kuò)展數(shù)據(jù)庫(kù)相對(duì)簡(jiǎn)單,盡管任何非分布式數(shù)據(jù)庫(kù)在計(jì)算能力和存儲(chǔ)方面都有其局限性,因此擁有自由擴(kuò)展的自由度可使您的系統(tǒng)更加靈活。
分片的數(shù)據(jù)庫(kù)體系結(jié)構(gòu)還可以顯著提高應(yīng)用程序查詢的速度,并提供增強(qiáng)的故障恢復(fù)能力。在未分片的數(shù)據(jù)庫(kù)上提交查詢時(shí),它可能不得不搜索表中的每一行,這可能會(huì)非常慢?;蛘?,通過(guò)將一個(gè)表拆分為多個(gè)表,查詢必須遍歷更少的記錄才能返回結(jié)果。由于每個(gè)表都在單獨(dú)的服務(wù)器上,因此減輕了服務(wù)器不可用帶來(lái)的影響。對(duì)于分片的數(shù)據(jù)庫(kù),與未分片的數(shù)據(jù)庫(kù)相比,中斷的影響可能僅影響單個(gè)分片,在未分片的數(shù)據(jù)庫(kù)中,中斷可能使整個(gè)應(yīng)用程序不可用。
具有分片的數(shù)據(jù)庫(kù)體系結(jié)構(gòu)可帶來(lái)一些巨大的好處,但是,它很復(fù)雜且實(shí)現(xiàn)和維護(hù)成本很高。在用完其他擴(kuò)展解決方案之后,絕對(duì)可以考慮使用此選項(xiàng),因?yàn)闊o(wú)效實(shí)施的后果可能非常嚴(yán)重。
以上就是關(guān)于數(shù)據(jù)庫(kù)擴(kuò)展解決方案有哪些的全部?jī)?nèi)容介紹,想了解更多關(guān)于數(shù)據(jù)庫(kù)的信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。