當(dāng)今世界是一個信息化的世界,我們的生活中無論是生活、工作、學(xué)習(xí)都離不開信息系統(tǒng)的支撐。而信息系統(tǒng)的背后用于保存和處理最終結(jié)果的地方就是數(shù)據(jù)庫。因此數(shù)據(jù)庫系統(tǒng)就變得尤為重要,這意味著如果數(shù)據(jù)庫如果面臨問題,則意味著整個應(yīng)用系統(tǒng)也會面臨挑戰(zhàn),從而帶來嚴(yán)重的損失和后果。
如今“大數(shù)據(jù)”這個詞已經(jīng)變得非常流行,雖然這個概念如何落地不得而知。但可以確定的是,隨著物聯(lián)網(wǎng)、移動應(yīng)用的興起,數(shù)據(jù)量相比過去會有幾何級的提升,因此數(shù)據(jù)庫所需要解決的問題不再僅僅是記錄程序正確的處理結(jié)果,還需要解決如下挑戰(zhàn):
當(dāng)數(shù)據(jù)庫性能遇到問題時,是否能夠橫向擴(kuò)展,通過添加服務(wù)器的方式達(dá)到更高的吞吐量,從而充分利用現(xiàn)有的硬件實現(xiàn)更好的投資回報率。
是否擁有實時同步的副本,當(dāng)數(shù)據(jù)庫面臨災(zāi)難時,可以短時間內(nèi)通過故障轉(zhuǎn)移的方式保證數(shù)據(jù)庫的可用性。此外,當(dāng)數(shù)據(jù)丟失或損壞時,能否通過所謂的實時副本(熱備)實現(xiàn)數(shù)據(jù)的零損失。
數(shù)據(jù)庫的橫向擴(kuò)展是否對應(yīng)用程序透明,如果數(shù)據(jù)庫的橫向擴(kuò)展需要應(yīng)用程序端進(jìn)行大量修改,則所帶來的后果不僅僅是高昂的開發(fā)成本,同時也會帶來很多潛在和非潛在的風(fēng)險。
面對上述挑戰(zhàn)一個顯而易見的辦法是將多個服務(wù)器組成一組集群,這樣一來就可以充分利用每一臺服務(wù)器的資源并將客戶端負(fù)載分發(fā)到不同服務(wù)器上,隨著應(yīng)用程序負(fù)載的增加,只需要將新的服務(wù)器添加到集群即可。
本文將對集群的概念、形式以及目前主流的數(shù)據(jù)庫集群技術(shù)進(jìn)行探討。
數(shù)據(jù)庫集群的形式
數(shù)據(jù)庫的集群和擴(kuò)展不像應(yīng)用程序擴(kuò)展那樣容易,因為從數(shù)據(jù)庫端來說,一旦涉及到了集群,往往會涉及到數(shù)據(jù)庫層面的同步,因此從是否存在數(shù)據(jù)冗余這個角度來講,我們可以從大面上把數(shù)據(jù)庫集群分為以下兩種形式:
Share-Disk架構(gòu)
Share-Disk架構(gòu)是通過多個服務(wù)器節(jié)點(diǎn)共享一個存儲來實現(xiàn)數(shù)據(jù)庫集群,兩臺機(jī)器最簡單的Share-Disk架構(gòu)如圖1所示。
圖1.簡單的Share-Disk架構(gòu)
在此基礎(chǔ)之上,Share-Disk架構(gòu)又分為單活和雙活,雙活即為集群中的每一個節(jié)點(diǎn)都可以同時對外提供服務(wù),而單活為集群中只有一個節(jié)點(diǎn)可對外提供服務(wù),集群中的其他服務(wù)器作為冗余在“活”的節(jié)點(diǎn)出現(xiàn)故障時接替該服務(wù)器成為對外提供服務(wù)的節(jié)點(diǎn)。該類架構(gòu)最典型的產(chǎn)品就是SQL Server Failover Cluster(SQL Server故障轉(zhuǎn)移集群)、NEC的EXPRESSCLUSTER、ROSE的ROSE HA。這種方式的弊端也是顯而易見的,如下:
硬件資源的嚴(yán)重浪費(fèi),同一時間集群中只有一臺服務(wù)器活著,其他服務(wù)器只能作為冗余服務(wù)器。
集群無法提升性能,因為只有一臺服務(wù)器可用
存儲方面存在單點(diǎn)故障,除非在存儲層級保證高可用,通常需要昂貴的SAN存儲。
因此該類方案僅僅可以做到服務(wù)器層面的高可用,無法帶來性能的提升,也無法解決存儲單點(diǎn)故障的問題。因此如果不搭配其他高可用或負(fù)載均衡的技術(shù),存在的意義并不是很大。
另一類技術(shù)是Share-Disk中的雙活的技術(shù),與單活技術(shù)不同的是,雙活的技術(shù)雖然也是共享磁盤,但集群中的所有節(jié)點(diǎn)都可以對外提供服務(wù),典型的產(chǎn)品就是Oracle的 RAC。RAC的技術(shù)性非常的高,因此需要水平比較高的人來運(yùn)維系統(tǒng)。RAC設(shè)計的初衷并不是為了性能,而是為了高可用和可擴(kuò)展性,如果應(yīng)用程序不是針對 RAC架構(gòu)設(shè)計和開發(fā)的,則將應(yīng)用程序遷移到RAC上由于block contention (block busy waits)可能會導(dǎo)致性能的急劇下降,并且節(jié)點(diǎn)越多性能下降越明顯。