99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀大數(shù)據(jù)時(shí)代的數(shù)據(jù)庫集群技術(shù)漫談
大數(shù)據(jù)時(shí)代的數(shù)據(jù)庫集群技術(shù)漫談
2016-05-16
收藏

大數(shù)據(jù)時(shí)代的數(shù)據(jù)庫集群技術(shù)漫談

當(dāng)今世界是一個(gè)信息化的世界, 我們的生活中無論是生活、工作、學(xué)習(xí)都離不開信息系統(tǒng)的支撐。而信息系統(tǒng)的背后用于保存和處理最終結(jié)果的地方就是數(shù)據(jù)庫。因此數(shù)據(jù)庫系統(tǒng)就變得尤為重要, 這意味著如果數(shù)據(jù)庫如果面臨問題,則意味著整個(gè)應(yīng)用系統(tǒng)也會(huì)面臨挑戰(zhàn),從而帶來嚴(yán)重的損失和后果。

如今“大數(shù)據(jù)”這個(gè)詞已經(jīng)變得非常流行,雖然這個(gè)概念如何落地不得而知。但可以確定的是,隨著物聯(lián)網(wǎng)、移動(dòng)應(yīng)用的興起,數(shù)據(jù)量相比過去會(huì)有幾何級(jí)的提升,因此數(shù)據(jù)庫所需要解決的問題不再僅僅是記錄程序正確的處理結(jié)果,還需要解決如下挑戰(zhàn):

當(dāng)數(shù)據(jù)庫性能遇到問題時(shí),是否能夠橫向擴(kuò)展,通過添加服務(wù)器的方式達(dá)到更高的吞吐量,從而充分利用現(xiàn)有的硬件實(shí)現(xiàn)更好的投資回報(bào)率。

是否擁有實(shí)時(shí)同步的副本,當(dāng)數(shù)據(jù)庫面臨災(zāi)難時(shí),可以短時(shí)間內(nèi)通過故障轉(zhuǎn)移的方式保證數(shù)據(jù)庫的可用性。此外,當(dāng)數(shù)據(jù)丟失或損壞時(shí),能否通過所謂的實(shí)時(shí)副本(熱備)實(shí)現(xiàn)數(shù)據(jù)的零損失。

數(shù)據(jù)庫的橫向擴(kuò)展是否對(duì)應(yīng)用程序透明,如果數(shù)據(jù)庫的橫向擴(kuò)展需要應(yīng)用程序端進(jìn)行大量修改,則所帶來的后果不僅僅是高昂的開發(fā)成本,同時(shí)也會(huì)帶來很多潛在和非潛在的風(fēng)險(xiǎn)。

面對(duì)上述挑戰(zhàn)一個(gè)顯而易見的辦法是將多個(gè)服務(wù)器組成一組集群,這樣一來就可以充分利用每一臺(tái)服務(wù)器的資源并將客戶端負(fù)載分發(fā)到不同服務(wù)器上,隨著應(yīng)用程序負(fù)載的增加,只需要將新的服務(wù)器添加到集群即可。

本篇文章將對(duì)集群的概念、形式以及目前主流的數(shù)據(jù)庫集群技術(shù)進(jìn)行探討。

數(shù)據(jù)庫集群的形式

數(shù)據(jù)庫的集群和擴(kuò)展不像應(yīng)用程序擴(kuò)展那樣容易,因?yàn)閺臄?shù)據(jù)庫端來說,一旦涉及到了集群,往往會(huì)涉及到數(shù)據(jù)庫層面的同步,因此從是否存在數(shù)據(jù)冗余這個(gè)角度來講,我們可以從大面上把數(shù)據(jù)庫集群分為以下兩種形式:

Share-Disk架構(gòu)

Share-Disk架構(gòu)是通過多個(gè)服務(wù)器節(jié)點(diǎn)共享一個(gè)存儲(chǔ)來實(shí)現(xiàn)數(shù)據(jù)庫集群,兩臺(tái)機(jī)器最簡單的Share-Disk架構(gòu)如圖1所示。

1

圖1.簡單的Share-Disk架構(gòu)

在 此基礎(chǔ)之上,Share-Disk架構(gòu)又分為單活和雙活,雙活即為集群中的每一個(gè)節(jié)點(diǎn)都可以同時(shí)對(duì)外提供服務(wù),而單活為集群中只有一個(gè)節(jié)點(diǎn)可對(duì)外提供服 務(wù),集群中的其他服務(wù)器作為冗余在“活”的節(jié)點(diǎn)出現(xiàn)故障時(shí)接替該服務(wù)器成為對(duì)外提供服務(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),同一時(shí)間集群中只有一臺(tái)服務(wù)器活著,其他服務(wù)器只能作為冗余服務(wù)器。

集群無法提升性能,因?yàn)橹挥幸慌_(tái)服務(wù)器可用

存儲(chǔ)方面存在單點(diǎn)故障,除非在存儲(chǔ)層級(jí)保證高可用,通常需要昂貴的SAN存儲(chǔ)。

因此該類方案僅僅可以做到服務(wù)器層面的高可用,無法帶來性能的提升,也無法解決存儲(chǔ)單點(diǎn)故障的問題。因此如果不搭配其他高可用或負(fù)載均衡的技術(shù),存在的意義并不是很大。

另 一類技術(shù)是Share-Disk中的雙活的技術(shù),與單活技術(shù)不同的是,雙活的技術(shù)雖然也是共享磁盤,但集群中的所有節(jié)點(diǎn)都可以對(duì)外提供服務(wù),典型的產(chǎn)品就 是Oracle的RAC。RAC的技術(shù)性非常的高,因此需要水平比較高的人來運(yùn)維系統(tǒng)。RAC設(shè)計(jì)的初衷并不是為了性能,而是為了高可用和可擴(kuò)展性,如果 應(yīng)用程序不是針對(duì)RAC架構(gòu)設(shè)計(jì)和開發(fā)的,則將應(yīng)用程序遷移到RAC上由于block contention (block busy waits)可能會(huì)導(dǎo)致性能的急劇下降,并且節(jié)點(diǎn)越多性能下降越明顯。

Share-Nothing架構(gòu)

Share-Nothing架構(gòu)又分為兩種,首先是分布式架構(gòu)。將數(shù)據(jù)庫中的數(shù)據(jù)按照某一標(biāo)準(zhǔn)分布到多臺(tái)機(jī)器中,查詢或插入時(shí)按照條件查詢或插入對(duì)應(yīng)的分區(qū)。

另一種是每一個(gè)節(jié)點(diǎn)完全獨(dú)立,節(jié)點(diǎn)之間通過網(wǎng)絡(luò)連接,通常是通過光釬等專用網(wǎng)絡(luò)。如圖2所示。

2

圖2.Share-Nothing冗余架構(gòu)

在Share-Nothing架構(gòu)中,每一個(gè)節(jié)點(diǎn)都擁有自己的內(nèi)存和存儲(chǔ),都保留數(shù)據(jù)的完整副本。通常來說,又可以分為兩種,可以負(fù)載均衡和不可以負(fù)載均衡。

首 先談?wù)劜豢韶?fù)載均衡的集群,在不可負(fù)載均衡的技術(shù)中,集群中的節(jié)點(diǎn)會(huì)被分為主節(jié)點(diǎn)和輔助節(jié)點(diǎn),主節(jié)點(diǎn)向外提供服務(wù),輔助節(jié)點(diǎn)作為熱備(二階段事務(wù)提交)或 暖備(不需要保證事務(wù)同步),同時(shí)有可能使得輔助節(jié)點(diǎn)提供只讀的服務(wù)。使用這個(gè)架構(gòu)的技術(shù)包括:SQL Server AlwaysOn,SQL Server Mirror,Oracle Data Guard這種架構(gòu)帶來的好處包括:

輔助節(jié)點(diǎn)數(shù)據(jù)和主節(jié)點(diǎn)保持同步或準(zhǔn)同步,當(dāng)搭配第三方仲裁后,可以實(shí)現(xiàn)自動(dòng)的故障轉(zhuǎn)移,從而實(shí)現(xiàn)了高可用

輔助節(jié)點(diǎn)由于和主節(jié)點(diǎn)完全獨(dú)立且數(shù)據(jù)同步或準(zhǔn)同步,因此主節(jié)點(diǎn)出現(xiàn)數(shù)據(jù)損壞后,可以從輔助節(jié)點(diǎn)恢復(fù)數(shù)據(jù)(自動(dòng)或手動(dòng))

由于Share-Nothing架構(gòu)使用了本地存儲(chǔ)(或SAN),相較于Share-Disk架構(gòu)在慢速網(wǎng)絡(luò)時(shí)有非常大的性能優(yōu)勢(shì)

當(dāng)然,弊端也顯而易見,因?yàn)檩o助節(jié)點(diǎn)無法對(duì)外提供服務(wù)或只能提供只讀服務(wù),因此該類集群的弊端包括:

擴(kuò)展能力非常有限

對(duì)性能沒有提升,因?yàn)樯婕暗礁鞴?jié)點(diǎn)的數(shù)據(jù)同步,甚至帶來性能的下降

輔助節(jié)點(diǎn)如果可讀,雖然提升性能,但需要修改前端應(yīng)用程序,對(duì)應(yīng)用程序不透明

另一類Share-Nothing架構(gòu)中,是允許負(fù)載均衡的。所謂負(fù)載均衡就是就是將對(duì)數(shù)據(jù)庫的負(fù)載分布到集群中的多個(gè)節(jié)點(diǎn)上,在集群中的每一個(gè)節(jié)點(diǎn)都可以對(duì)外提供服務(wù),從而達(dá)到更高的吞吐量,更好的資源利用率和更低的響應(yīng)時(shí)間。前端通過代理進(jìn)行調(diào)度。

3

圖3.Amoeba

5

圖4.HA Proxy

4

圖5.Moebius集群

可 負(fù)載均衡的Share-Nothing架構(gòu)的好處是每臺(tái)服務(wù)器都能提供服務(wù),能充分利用現(xiàn)有資源,達(dá)到更高的吞吐量。其中Amoeba中可能會(huì)涉及到數(shù)據(jù) 分片,數(shù)據(jù)分片的好處是對(duì)于海量數(shù)據(jù)的處理更加高效,但同時(shí)也引入了其他問題,比如說需要應(yīng)用程序端對(duì)應(yīng)數(shù)據(jù)分片進(jìn)行調(diào)整、跨分片節(jié)點(diǎn)查詢的處理問題、每 一個(gè)數(shù)據(jù)分片節(jié)點(diǎn)是否能夠承受各自業(yè)務(wù)負(fù)載的高峰問題等。該類架構(gòu)需要實(shí)施的人員水平比較高,且需要應(yīng)用層面做調(diào)整,因此更適合于互聯(lián)網(wǎng)企業(yè)。

另一類不涉及到數(shù)據(jù)分片的架構(gòu),比如一類可以使用組合方案,比如說Oracle RAC+F5。另一類是使用單個(gè)廠商提供的方案,比如說SQL Server上的Moebius。這類方案集群中的每個(gè)節(jié)點(diǎn)都會(huì)對(duì)外提供服務(wù),因此有如下好處:

由于每一個(gè)節(jié)點(diǎn)都可以對(duì)外提供服務(wù),因此可以提升性能

擴(kuò)展性得到提升,可以通過向集群添加節(jié)點(diǎn)直接進(jìn)行Scale-Out擴(kuò)充

由于前端應(yīng)用通過代理連接到集群,而集群中的每一個(gè)節(jié)點(diǎn)都保持完整的數(shù)據(jù)集,因此不存在分片不到位反而造成性能下降的問題,因此對(duì)應(yīng)用程序端完全透明

但相比較于MySQL的數(shù)據(jù)分片,該類方案的弊端也顯而易見,因?yàn)槊恳粋€(gè)節(jié)點(diǎn)都需要完整的數(shù)據(jù)集,因此需要占用更多的存儲(chǔ)空間。

小結(jié)

本文從一個(gè)比較高的層面談到了數(shù)據(jù)庫集群技術(shù)。從數(shù)據(jù)庫應(yīng) 用層面的Share-Disk集群直到集群的最高形式-能夠提供負(fù)載均衡的集群,并列舉了一些主流的商用產(chǎn)品。集群的存在意義是為了保證高可用、數(shù)據(jù)安 全、擴(kuò)展性以及負(fù)載均衡。如果現(xiàn)在的集群產(chǎn)品不能包含這幾個(gè)特性,而業(yè)務(wù)場景也需要,也可以將和一些現(xiàn)有的技術(shù)結(jié)合來實(shí)現(xiàn),但畢竟不是每一個(gè)人都是數(shù)據(jù)庫 專家,即使給你一堆工具和材料你也做不出來iPhone,因此在系統(tǒng)設(shè)計(jì)之初就對(duì)數(shù)據(jù)庫方面的方案有所考慮會(huì)免去很多麻煩。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }