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