Moebius中间件
SQL Server負(fù)載均衡;數(shù)據(jù)庫(kù)集群
前言?
Internet的規(guī)模每一百天就會(huì)增長(zhǎng)一倍,客戶希望獲得7天×24小時(shí)的不間斷可用性及較快的系統(tǒng)反應(yīng)時(shí)間,而不愿屢次看到某個(gè)站點(diǎn)“Server Too Busy”及頻繁的系統(tǒng)故障。?
隨 著業(yè)務(wù)量的提高,以及訪問(wèn)量和數(shù)據(jù)流量的快速增長(zhǎng),網(wǎng)絡(luò)各個(gè)核心部分的處理性能和計(jì)算強(qiáng)度也相應(yīng)增大,使得單一設(shè)備根本無(wú)法承擔(dān)。在此情況下,如果扔掉現(xiàn) 有設(shè)備去做大量的硬件升級(jí),必將造成現(xiàn)有資源的浪費(fèi),而且下一次業(yè)務(wù)量的提升,又將導(dǎo)致再一次硬件升級(jí)的高額成本投入。于是,負(fù)載均衡機(jī)制應(yīng)運(yùn)而生。?
ORACLE的“RAC”啟示?
對(duì)于負(fù)載均衡,筆者經(jīng)常接觸的當(dāng)屬Oracle的負(fù)載均衡機(jī)制。下面,我們先簡(jiǎn)單了解Oracle的負(fù)載均衡的實(shí)現(xiàn)方案。?
Real Application Clusters是并行服務(wù)器(8i及以前版本稱作Oracle Parallel Server,OPS),用來(lái)在集群環(huán)境下實(shí)現(xiàn)多機(jī)共享數(shù)據(jù)庫(kù),以保證應(yīng)用的高可用性,同時(shí)可以自動(dòng)實(shí)現(xiàn)并行處理及均分負(fù)載,還能實(shí)現(xiàn)數(shù)據(jù)庫(kù)在故障時(shí)的排 錯(cuò)和無(wú)斷點(diǎn)恢復(fù)。它可以自動(dòng)進(jìn)行負(fù)載平衡、故障修復(fù)和規(guī)劃停機(jī)時(shí)間,以支持高可用性應(yīng)用程序。若并行服務(wù)器中某節(jié)點(diǎn)失效,透明的應(yīng)用程序容錯(cuò)能夠把用戶自 動(dòng)轉(zhuǎn)接到另一節(jié)點(diǎn)上繼續(xù)運(yùn)行,應(yīng)用程序在用戶沒(méi)有察覺(jué)的情況下繼續(xù)執(zhí)行。這使周期性和非周期性發(fā)生故障的系統(tǒng)增大了連續(xù)可用性。進(jìn)程的失效可以完全透明地 轉(zhuǎn)移到另一節(jié)點(diǎn)上去,通過(guò)適當(dāng)?shù)嘏渲?#xff0c;可以指定所有查詢都在客戶端進(jìn)行緩存,這樣它們便可以在轉(zhuǎn)移后的節(jié)點(diǎn)上重新設(shè)置。那么在SQL Server平臺(tái)上是否也可以實(shí)現(xiàn)類似的效果??
1、集群的分類?
一 般來(lái)講,集群軟件根據(jù)側(cè)重的方向和試圖解決的問(wèn)題,分為三大類:高性能集群(High performance cluster,HPC)、負(fù)載均衡集群(Load balance cluster, LBC),高可用性集群(High availability cluster,HAC)。?
高 性能集群(High performance cluster,HPC),它是利用一個(gè)集群中的多臺(tái)機(jī)器共同完成同一件任務(wù),使得完成任務(wù)的速度和可靠性都遠(yuǎn)遠(yuǎn)高于單機(jī)運(yùn)行的效果。彌補(bǔ)了單機(jī)性能上的 不足。該集群在天氣預(yù)報(bào)、環(huán)境監(jiān)控等數(shù)據(jù)量大,計(jì)算復(fù)雜的環(huán)境中應(yīng)用比較多;?
負(fù) 載均衡集群(Load balance cluster, LBC),它是利用一個(gè)集群中的多臺(tái)單機(jī),完成許多并行的小的工作。一般情況下,如果一個(gè)應(yīng)用使用的人多了,那么用戶請(qǐng)求的響應(yīng)時(shí)間就會(huì)增大,機(jī)器的性能 也會(huì)受到影響,如果使用負(fù)載均衡集群,那么集群中任意一臺(tái)機(jī)器都能響應(yīng)用戶的請(qǐng)求,這樣集群就會(huì)在用戶發(fā)出服務(wù)請(qǐng)求之后,選擇當(dāng)時(shí)負(fù)載最小,能夠提供最好 的服務(wù)的這臺(tái)機(jī)器來(lái)接受請(qǐng)求并相應(yīng),這樣就可用用集群來(lái)增加系統(tǒng)的可用性和穩(wěn)定性。這類集群在網(wǎng)站中使用較多;?
高 可用性集群(High availability cluster,HAC),它是利用集群中系統(tǒng) 的冗余,當(dāng)系統(tǒng)中某臺(tái)機(jī)器發(fā)生損壞的時(shí)候,其他后備的機(jī)器可以迅速的接替它來(lái)啟動(dòng)服務(wù),等待故障機(jī)的維修和返回。最大限度的保證集群中服務(wù)的可用性。這類 系統(tǒng)一般在銀行,電信服務(wù)這類對(duì)系統(tǒng)可靠性有高的要求的領(lǐng)域有著廣泛的應(yīng)用。?
2、Microsoft Cluster Server(MSCS)相對(duì)于單點(diǎn)來(lái)說(shuō)Microsoft Cluster Server(MSCS)是一個(gè)可以提升可用性的技術(shù),不可以負(fù)載均衡的,Microsoft稱之為故障轉(zhuǎn)移集群。(屬于高可用集群共享磁盤架構(gòu))?
從硬件連接上看,很像Oracle的RAC,兩個(gè)節(jié)點(diǎn),通過(guò)網(wǎng)絡(luò)連接,共享磁盤;事實(shí)上SQL Server數(shù)據(jù)庫(kù)只運(yùn)行在一個(gè)節(jié)點(diǎn)上,當(dāng)出現(xiàn)故障時(shí),另一個(gè)節(jié)點(diǎn)只是作為這個(gè)節(jié)點(diǎn)的備份;?
因?yàn)槭冀K只有一個(gè)節(jié)點(diǎn)在運(yùn)行,在性能上也得不到提升,系統(tǒng)也就不具備擴(kuò)展的能力。當(dāng)現(xiàn)有的機(jī)器不能滿足應(yīng)用的負(fù)載時(shí)只能更換更高配置的機(jī)器。?
升級(jí)到綜合性能更強(qiáng)大的硬件,帶來(lái)的問(wèn)題是硬件的浪費(fèi),然而,單節(jié)點(diǎn)體系結(jié)構(gòu)最終會(huì)達(dá)到一個(gè)瓶頸并無(wú)法實(shí)現(xiàn)進(jìn)一步的有效擴(kuò)展。具體表現(xiàn)為逐漸縮小的回報(bào)率或者價(jià)格驚人的昂貴硬件設(shè)備,系統(tǒng)得不到可持續(xù)的擴(kuò)展。?
4、復(fù)制、訂閱?
我 們知道,SQL Server 提供了復(fù)制技術(shù)(Replication),可以有多個(gè)只讀服務(wù)器供查詢用,這個(gè)技術(shù)可以有效緩解查詢的壓力。我們知道,復(fù)制、訂閱是一個(gè)讀寫分離的技 術(shù),數(shù)據(jù)先寫到中心數(shù)據(jù)庫(kù)上,寫成功即返回給應(yīng)用程序;通過(guò)復(fù)制將數(shù)據(jù)復(fù)制到只讀的服務(wù)器,查詢的時(shí)候從只讀服務(wù)器查。?
這就意味著訂閱端的數(shù)據(jù)和中心數(shù)據(jù)庫(kù)的數(shù)據(jù)不同步,是個(gè)異步的過(guò)程,所以數(shù)據(jù)滯后嚴(yán)重,數(shù)據(jù)同步的實(shí)時(shí)性得不到保障,中心數(shù)據(jù)庫(kù)在正常的壓力下10秒左右。當(dāng)訪問(wèn)負(fù)荷很高或者中心數(shù)據(jù)庫(kù)在整理數(shù)據(jù)時(shí),將出現(xiàn)大量DML操作時(shí)延遲時(shí)間比較長(zhǎng)或者出現(xiàn)堵塞的情況;?
某些修改操作需要重新建立復(fù)制關(guān)系并初始化,這期間需要停止數(shù)據(jù)庫(kù)的讀取服務(wù),規(guī)模越大的應(yīng)用停止的時(shí)間越長(zhǎng),嚴(yán)重影響了數(shù)據(jù)庫(kù)的可用性。 另外中心數(shù)據(jù)庫(kù)所采用的結(jié)構(gòu)還是MSCS,只是提供了一種故障轉(zhuǎn)移的機(jī)制,當(dāng)有一個(gè)節(jié)點(diǎn)出現(xiàn)問(wèn)題后把負(fù)載轉(zhuǎn)移到另一個(gè)節(jié)點(diǎn)上;?
結(jié) 論:從上面可以看出,在MS-SQL Server 平臺(tái)上沒(méi)有提供類似Oracle RAC的技術(shù),實(shí)現(xiàn)不了負(fù)載均衡。數(shù)據(jù)庫(kù)的高并發(fā)及橫向擴(kuò)展是用戶經(jīng)常遇到的問(wèn)題,所以好多SQL Server用戶遇到這樣的困惑時(shí)就移植到Oracle平臺(tái)上,采用RAC來(lái)解決。這將是一個(gè)即費(fèi)財(cái)力又費(fèi)物力、人力,同時(shí)還要面臨很大風(fēng)險(xiǎn)的一個(gè)艱難過(guò) 程。?
所以說(shuō)在MS-SQL Server平臺(tái)上實(shí)現(xiàn)像Oracle RAC一樣高性能、高可用性和方便擴(kuò)展的集群解就成廣大SQL Server用戶期待的一個(gè)焦點(diǎn),就目前來(lái)說(shuō),這類技術(shù)似乎只能在在一些專業(yè)研究第三方數(shù)據(jù)庫(kù)集群的公司看到。?
數(shù)據(jù)庫(kù)負(fù)載均衡集群的實(shí)現(xiàn)?
1、實(shí)現(xiàn)原理?
實(shí) 現(xiàn)數(shù)據(jù)庫(kù)的負(fù)載均衡技術(shù),首先要有一個(gè)可以控制連接數(shù)據(jù)庫(kù)的控制端。在這里,它截?cái)嗔藬?shù)據(jù)庫(kù)和程序的直接連接,由所有的程序來(lái)訪問(wèn)這個(gè)中間層,然后再由中 間層來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。這樣,我們就可以具體控制訪問(wèn)某個(gè)數(shù)據(jù)庫(kù)了,然后還可以根據(jù)數(shù)據(jù)庫(kù)的當(dāng)前負(fù)載采取有效的均衡策略,來(lái)調(diào)整每次連接到哪個(gè)數(shù)據(jù)庫(kù)。好處在 兩個(gè)方面:首先,它成功地將數(shù)據(jù)庫(kù)放到了內(nèi)網(wǎng)之中,更好地保護(hù)了數(shù)據(jù)庫(kù)的安全性。如果數(shù)據(jù)庫(kù)也在公網(wǎng)上,1433端口是很容易被***的,所以要保護(hù)數(shù)據(jù)庫(kù) 與之的連接,就用到了中間層。它可以將數(shù)據(jù)庫(kù)更加好地保護(hù)在內(nèi)網(wǎng)。其次,對(duì)應(yīng)用來(lái)說(shuō)完全透明,集群暴露出來(lái)的就是一個(gè)IP ,連接數(shù)據(jù)庫(kù)的所有連接都可以控制,更方便DBA對(duì)數(shù)據(jù)的管理,看哪些連接更耗費(fèi)數(shù)據(jù)庫(kù)資源,以便更好地優(yōu)化代碼。?
但 是,也有兩點(diǎn)要注意:第一,必須要做成Windows的服務(wù)程序。Windows發(fā)展到今天,如果以一個(gè)集成的大系統(tǒng)來(lái)講,做成服務(wù)程序更加穩(wěn)定,也更加 安全,這樣做即使用戶不登錄機(jī)器,也可以使用。第二,必須要使用多個(gè)中間層。從中間層的作用可以看出,它承接了數(shù)據(jù)庫(kù)的所有連接,所以,一旦出了問(wèn)題,就 會(huì)導(dǎo)致整個(gè)系統(tǒng)癱瘓。所以做多個(gè)中間層是必要的,這樣,如果一個(gè)壞了可以登錄到另一個(gè)。?
2、實(shí)現(xiàn)多據(jù)庫(kù)數(shù)據(jù)同步?
前 端連接數(shù)據(jù)庫(kù)起均衡作用的有了,下一步的工作是設(shè)置構(gòu)建數(shù)據(jù)庫(kù)集群。對(duì)于負(fù)載均衡,最重要的就是所有服務(wù)器的數(shù)據(jù)都是實(shí)時(shí)同步的。這是一個(gè)集群所必需的, 因?yàn)?#xff0c;如果數(shù)不據(jù)實(shí)時(shí)、不同步,那么用戶從一臺(tái)服務(wù)器讀出的數(shù)據(jù),就有別于從另一臺(tái)服務(wù)器讀出的數(shù)據(jù),這是不能允許的。所以必須實(shí)現(xiàn)數(shù)據(jù)庫(kù)的數(shù)據(jù)同步。這 樣,在查詢的時(shí)候就可以有多個(gè)資源,實(shí)現(xiàn)均衡。?
Moebius 集群采用將核心程序駐留在每個(gè)機(jī)器的數(shù)據(jù)庫(kù)中的辦法,這個(gè)核心程序稱為Moebius 中間件,主要作用是監(jiān)測(cè)數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)的變化并將變化的數(shù)據(jù)同步到其他數(shù)據(jù)庫(kù)中。數(shù)據(jù)同步完成后客戶端才會(huì)得到響應(yīng),同步過(guò)程是并發(fā)完成的,所以同步到多個(gè) 數(shù)據(jù)庫(kù)和同步到一個(gè)數(shù)據(jù)庫(kù)的時(shí)間基本相等;另外同步的過(guò)程是在事務(wù)的環(huán)境下完成的,保證了多份數(shù)據(jù)在任何時(shí)刻數(shù)據(jù)的一致性。?
正因?yàn)镸oebius 中間件宿主在數(shù)據(jù)庫(kù)中的創(chuàng)新,讓中間件不但能知道數(shù)據(jù)的變化,而且知道引起數(shù)據(jù)變化的SQL語(yǔ)句,根據(jù)SQL語(yǔ)句的類型智能的采取不同的數(shù)據(jù)同步的策略以保證數(shù)據(jù)同步成本的最小化。?
數(shù)據(jù)條數(shù)很少,數(shù)據(jù)內(nèi)容也不大,則直接同步數(shù)據(jù)?
數(shù)據(jù)條數(shù)很少,但是里面包含大數(shù)據(jù)類型,比如文本,二進(jìn)制數(shù)據(jù)等,則先對(duì)數(shù)據(jù)進(jìn)行壓縮然后再同步,從而減少網(wǎng)絡(luò)帶寬的占用和傳輸所用的時(shí)間。?
數(shù)據(jù)條數(shù)很多,此時(shí)中間件會(huì)拿到造成數(shù)據(jù)變化的SQL語(yǔ)句, 然后對(duì)SQL語(yǔ)句進(jìn)行解析,分析其執(zhí)行計(jì)劃和執(zhí)行成本,并選擇是同步數(shù)據(jù)還是同步SQL語(yǔ)句到其他的數(shù)據(jù)庫(kù)中。此種情況應(yīng)用在對(duì)表結(jié)構(gòu)進(jìn)行調(diào)整或者批量更改數(shù)據(jù)的時(shí)候非常有用。?
Moebius中間件同步策略?
數(shù)據(jù)壓縮:?
如果需要同步的數(shù)據(jù)中包含文本、二進(jìn)制等大數(shù)據(jù)類型, 則先對(duì)數(shù)據(jù)進(jìn)行壓縮然后再同步,從而減少對(duì)網(wǎng)絡(luò)帶寬的消耗和數(shù)據(jù)在傳輸過(guò)程中所用的時(shí)間。尤其對(duì)于網(wǎng)絡(luò)帶寬資源非常稀缺的場(chǎng)景。 通過(guò)fire_compression_bytes參數(shù)進(jìn)行閥值控制。?
批量執(zhí)行重復(fù)性數(shù)據(jù):?
如果需要同步的數(shù)據(jù)中包含重復(fù)性的數(shù)據(jù),則中間件會(huì)把重復(fù)性的數(shù)據(jù)合并到一個(gè)同步命令中只執(zhí)行一次,從而減少執(zhí)行的次數(shù)。?
例 如:執(zhí)行語(yǔ)句 UPDATE dbo.UserInfo SET DeleteFlag = 1 WHERE LastLoginDate < '2008-08-08' 共修改了600條數(shù)據(jù),這600條數(shù)據(jù)的DeleteFlag列具有相同的值,中間件會(huì)把這些相同的值合并到一個(gè)同步命令中去,同步的SQL語(yǔ)句 為:UPDATE dbo.UserInfo SET DeleteFlag = 1 WHERE UserID IN(1, 3, 4, 5, 7, 10, 13, 15, ......, 895, 897, 899, 1000)。而不是逐條的去同步:?
UPDATE dbo.UserInfo SET DeleteFlag = 1 WHERE UserID = 1?
UPDATE dbo.UserInfo SET DeleteFlag = 1 WHERE UserID = 3?
UPDATE dbo.UserInfo SET DeleteFlag = 1 WHERE UserID = 4?
.?
.?
.?
.?
.?
.?
UPDATE dbo.UserInfo SET DeleteFlag = 1 WHERE UserID = 899?
UPDATE dbo.UserInfo SET DeleteFlag = 1 WHERE UserID = 1000?
該策略對(duì)數(shù)據(jù)進(jìn)行批量更新、批量刪除的場(chǎng)景下非常有用。 通過(guò)rows_in_command參數(shù)進(jìn)行閥值控制。?
升級(jí)數(shù)據(jù)庫(kù)鎖(鎖優(yōu)化器)?
如 果更新的數(shù)據(jù)量非常大,SQL Server本身會(huì)對(duì)鎖進(jìn)行升級(jí),將大量較細(xì)粒度的鎖(例如行)轉(zhuǎn)換為少量較粗粒度的鎖(例如表)從而減少系統(tǒng)開(kāi)銷。中間件在同步之前先檢查當(dāng)前SQL Server的鎖的粒度,如果鎖已經(jīng)升級(jí),則中間件先對(duì)目標(biāo)數(shù)據(jù)庫(kù)直接進(jìn)行鎖升級(jí)然后再同步數(shù)據(jù)。從而避免了目標(biāo)數(shù)據(jù)庫(kù)鎖升級(jí)的過(guò)程。通過(guò) fire_lock_optimizer_rows 參數(shù)進(jìn)行閥值控制。?
同步SQL語(yǔ)句(同步優(yōu)化器)?
如 果更新的數(shù)據(jù)量非常大,超過(guò)了設(shè)定的閥值,同步大量的數(shù)據(jù)勢(shì)必會(huì)消耗大量的網(wǎng)絡(luò)帶寬并且延長(zhǎng)同步的時(shí)間,甚至?xí)斐删W(wǎng)絡(luò)擁堵。這時(shí)候中間件首先獲取導(dǎo)致數(shù) 據(jù)變化的SQL語(yǔ)句,分析該SQL語(yǔ)句的類型以及執(zhí)行成本,并選擇是把變化的數(shù)據(jù)同步過(guò)去還是把導(dǎo)致數(shù)據(jù)變化的SQL語(yǔ)句同步過(guò)去。該策略在對(duì)表結(jié)構(gòu)進(jìn)行 調(diào)整或批量更改數(shù)據(jù)的時(shí)候非常有用,大量的減少網(wǎng)絡(luò)帶寬的消耗,降低同步時(shí)間。通過(guò)fire_sync_optimizer_rows 參數(shù)進(jìn)行閥值控制。?
并發(fā)執(zhí)行SQL語(yǔ)句?
即 使使用了同步SQL語(yǔ)句策略,總的執(zhí)行時(shí)間也相當(dāng)于執(zhí)行兩次SQL語(yǔ)句的時(shí)間。如果這個(gè)時(shí)間還是不能接受。可以通過(guò)中間件提供的系統(tǒng)存儲(chǔ)過(guò)程 usp_MBS_ParallelExecute在集群中的各個(gè)節(jié)點(diǎn)數(shù)據(jù)庫(kù)中并發(fā)執(zhí)行SQL語(yǔ)句,使執(zhí)行時(shí)間降低到相當(dāng)于在單機(jī)數(shù)據(jù)庫(kù)中執(zhí)行一次的時(shí)間。 但是要注意并不是所有的語(yǔ)句都適合并發(fā)執(zhí)行,具體請(qǐng)參見(jiàn)usp_MBS_ParallelExecute。?
4、透明性?
中間件宿主在SQL Server數(shù)據(jù)庫(kù)中,這是Moebius 的一個(gè)創(chuàng)新,主要是確保原有的數(shù)據(jù)庫(kù)架構(gòu)移植到集群架構(gòu)上簡(jiǎn)單方便,避免對(duì)系統(tǒng)進(jìn)行較大的改造。?
對(duì)開(kāi)發(fā)透明:?
中間件是在數(shù)據(jù)庫(kù)內(nèi)部工作的,不改變SQL Server原來(lái)的應(yīng)用特性,開(kāi)發(fā)人員面對(duì)的還是熟悉的SQL Server數(shù)據(jù)庫(kù)、SQL語(yǔ)句以及開(kāi)發(fā)/調(diào)試工具。不需要改變?cè)械牧?xí)慣,不需要學(xué)習(xí)新的工具。?
許多關(guān)鍵的數(shù)據(jù)庫(kù)技術(shù)比如事務(wù)、連接池、鎖、數(shù)據(jù)存儲(chǔ)、安全等還是依靠SQL Server數(shù)據(jù)庫(kù)來(lái)完成,對(duì)客戶來(lái)說(shuō),無(wú)論是研發(fā)成本還是實(shí)施風(fēng)險(xiǎn)都降到最低。?
對(duì)管理透明:?
對(duì)于管理人員來(lái)說(shuō),仍然可以使用SQL Server提供的管理工具來(lái)管理數(shù)據(jù)庫(kù),可以把集群看成一個(gè)數(shù)據(jù)庫(kù)來(lái)管理,系統(tǒng)進(jìn)行了封裝,感覺(jué)和使用原來(lái)的一個(gè)數(shù)據(jù)庫(kù)時(shí)候一樣,易用性非常好。?
對(duì)應(yīng)用透明:?
對(duì)于應(yīng)用程序的連接,用戶只需要在應(yīng)用程序連接組件中進(jìn)行配置,將應(yīng)用程序與數(shù)據(jù)庫(kù)集群連接即可,對(duì)您的應(yīng)用程序及業(yè)務(wù)沒(méi)有絲毫影響。
轉(zhuǎn)載于:https://blog.51cto.com/tianshili/1640091
總結(jié)
以上是生活随笔為你收集整理的Moebius中间件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 复现 ASPCMS企业建站系统Cooki
- 下一篇: 机器学习实战一——朴素贝叶斯中文情感分类