目前,“大數(shù)據(jù)”這個詞已經(jīng)成為互聯(lián)網(wǎng)行業(yè)乃至整個社會的一個熱門詞匯,中培偉業(yè)《ORACLE數(shù)據(jù)庫管理與性能調(diào)優(yōu)實踐》培訓專家楊老師指出,可以確定的是,隨著物聯(lián)網(wǎng)、移動應用的興起,數(shù)據(jù)量相比過去會有幾何級的提升,因此數(shù)據(jù)庫所需要解決的問題不再僅僅是記錄程序正確的處理結(jié)果,還需要解決如下挑戰(zhàn):
當數(shù)據(jù)庫性能遇到問題時,是否能夠橫向擴展,通過添加服務器的方式達到更高的吞吐量,從而充分利用現(xiàn)有的硬件實現(xiàn)更好的投資回報率。
?是否擁有實時同步的副本,當數(shù)據(jù)庫面臨災難時,可以短時間內(nèi)通過故障轉(zhuǎn)移的方式保證數(shù)據(jù)庫的可用性。此外,當數(shù)據(jù)丟失或損壞時,能否通過所謂的實時副本(熱備)實現(xiàn)數(shù)據(jù)的零損失。
?數(shù)據(jù)庫的橫向擴展是否對應用程序透明,如果數(shù)據(jù)庫的橫向擴展需要應用程序端進行大量修改,則所帶來的后果不僅僅是高昂的開發(fā)成本,同時也會帶來很多潛在和非潛在的風險。
面對上述挑戰(zhàn)一個顯而易見的辦法是將多個服務器組成一組集群,這樣一來就可以充分利用每一臺服務器的資源并將客戶端負載分發(fā)到不同服務器上,隨著應用程序負載的增加,只需要將新的服務器添加到集群即可。
本篇文章將對集群的概念、形式以及目前主流的數(shù)據(jù)庫集群技術(shù)進行探討。
數(shù)據(jù)庫集群的形式
數(shù)據(jù)庫的集群和擴展不像應用程序擴展那樣容易,因為從數(shù)據(jù)庫端來說,一旦涉及到了集群,往往會涉及到數(shù)據(jù)庫層面的同步,因此從是否存在數(shù)據(jù)冗余這個角度來講,我們可以從大面上把數(shù)據(jù)庫集群分為以下兩種形式:
Share-Disk架構(gòu)
Share-Disk架構(gòu)是通過多個服務器節(jié)點共享一個存儲來實現(xiàn)數(shù)據(jù)庫集群,兩臺機器最簡單的。在此基礎之上,Share-Disk架構(gòu)又分為單活和雙活,雙活即為集群中的每一個節(jié)點都可以同時對外提供服務,而單活為集群中只有一個節(jié)點可對外提供服務,集群中的其他服務器作為冗余在“活”的節(jié)點出現(xiàn)故障時接替該服務器成為對外提供服務的節(jié)點。該類架構(gòu)最典型的產(chǎn)品就是SQL Server Failover Cluster(SQL Server故障轉(zhuǎn)移集群)、NEC的EXPRESSCLUSTER、ROSE的ROSE HA。
?硬件資源的嚴重浪費,同一時間集群中只有一臺服務器活著,其他服務器只能作為冗余服務器。
?集群無法提升性能,因為只有一臺服務器可用
?存儲方面存在單點故障,除非在存儲層級保證高可用,通常需要昂貴的SAN存儲。
因此該類方案僅僅可以做到服務器層面的高可用,無法帶來性能的提升,也無法解決存儲單點故障的問題。因此如果不搭配其他高可用或負載均衡的技術(shù),存在的意義并不是很大。
另一類技術(shù)是Share-Disk中的雙活的技術(shù),與單活技術(shù)不同的是,雙活的技術(shù)雖然也是共享磁盤,但集群中的所有節(jié)點都可以對外提供服務,典型的產(chǎn)品就是Oracle的RAC。RAC的技術(shù)性非常的高,因此需要水平比較高的人來運維系統(tǒng)。RAC設計的初衷并不是為了性能,而是為了高可用和可擴展性,如果應用程序不是針對RAC架構(gòu)設計和開發(fā)的,則將應用程序遷移到RAC上由于block contention (block busy waits)可能會導致性能的急劇下降,并且節(jié)點越多性能下降越明顯。
Share-Nothing架構(gòu)
Share-Nothing架構(gòu)又分為兩種,首先是分布式架構(gòu)。將數(shù)據(jù)庫中的數(shù)據(jù)按照某一標準分布到多臺機器中,查詢或插入時按照條件查詢或插入對應的分區(qū)。
另一種是每一個節(jié)點完全獨立,節(jié)點之間通過網(wǎng)絡連接,通常是通過光釬等專用網(wǎng)絡。在Share-Nothing架構(gòu)中,每一個節(jié)點都擁有自己的內(nèi)存和存儲,都保留數(shù)據(jù)的完整副本。通常來說,又可以分為兩種,可以負載均衡和不可以負載均衡。
首先談談不可負載均衡的集群,在不可負載均衡的技術(shù)中,集群中的節(jié)點會被分為主節(jié)點和輔助節(jié)點,主節(jié)點向外提供服務,輔助節(jié)點作為熱備(二階段事務提交)或暖備(不需要保證事務同步),同時有可能使得輔助節(jié)點提供只讀的服務。使用這個架構(gòu)的技術(shù)包括:SQL Server AlwaysOn,SQL Server Mirror,Oracle Data Guard這種架構(gòu)帶來的好處包括:
?輔助節(jié)點數(shù)據(jù)和主節(jié)點保持同步或準同步,當搭配第三方仲裁后,可以實現(xiàn)自動的故障轉(zhuǎn)移,從而實現(xiàn)了高可用
?輔助節(jié)點由于和主節(jié)點完全獨立且數(shù)據(jù)同步或準同步,因此主節(jié)點出現(xiàn)數(shù)據(jù)損壞后,可以從輔助節(jié)點恢復數(shù)據(jù)(自動或手動)
?由于Share-Nothing架構(gòu)使用了本地存儲(或SAN),相較于Share-Disk架構(gòu)在慢速網(wǎng)絡時有非常大的性能優(yōu)勢
當然,弊端也顯而易見,因為輔助節(jié)點無法對外提供服務或只能提供只讀服務,因此該類集群的弊端包括:
?擴展能力非常有限
?對性能沒有提升,因為涉及到各節(jié)點的數(shù)據(jù)同步,甚至帶來性能的下降
?輔助節(jié)點如果可讀,雖然提升性能,但需要修改前端應用程序,對應用程序不透明
另一類Share-Nothing架構(gòu)中,是允許負載均衡的。所謂負載均衡就是就是將對數(shù)據(jù)庫的負載分布到集群中的多個節(jié)點上,在集群中的每一個節(jié)點都可以對外提供服務,從而達到更高的吞吐量,更好的資源利用率和更低的響應時間。前端通過代理進行調(diào)度。使用該類架構(gòu)的技術(shù)包括:MySQL上的Amoeba,MySQL上的HA Proxy格瑞趨勢在SQL Server上的Moebius集群??韶撦d均衡的Share-Nothing架構(gòu)的好處是每臺服務器都能提供服務,能充分利用現(xiàn)有資源,達到更高的吞吐量。其中Amoeba中可能會涉及到數(shù)據(jù)分片,數(shù)據(jù)分片的好處是對于海量數(shù)據(jù)的處理更加高效,但同時也引入了其他問題,比如說需要應用程序端對應數(shù)據(jù)分片進行調(diào)整、跨分片節(jié)點查詢的處理問題、每一個數(shù)據(jù)分片節(jié)點是否能夠承受各自業(yè)務負載的高峰問題等。該類架構(gòu)需要實施的人員水平比較高,且需要應用層面做調(diào)整,因此更適合于互聯(lián)網(wǎng)企業(yè)。
另一類不涉及到數(shù)據(jù)分片的架構(gòu),比如一類可以使用組合方案,比如說Oracle RAC+F5。另一類是使用單個廠商提供的方案,比如說SQL Server上的Moebius。這類方案集群中的每個節(jié)點都會對外提供服務,因此有如下好處:
?由于每一個節(jié)點都可以對外提供服務,因此可以提升性能
?擴展性得到提升,可以通過向集群添加節(jié)點直接進行Scale-Out擴充
?由于前端應用通過代理連接到集群,而集群中的每一個節(jié)點都保持完整的數(shù)據(jù)集,因此不存在分片不到位反而造成性能下降的問題,因此對應用程序端完全透明。