轉載自:http://www.cnblogs.com/ejiyuan/archive/2010/10/29/1796292.html
隨著(zhù)互聯(lián)網(wǎng)應用的廣泛普及,海量數據的存儲和訪(fǎng)問(wèn)成為了系統設計的瓶頸問(wèn)題。對于一個(gè)大型的互聯(lián)網(wǎng)應用,每天百萬(wàn)級甚至上億的PV無(wú)疑對數據庫造成了相當高的負載。對于系統的穩定性和擴展性造成了極大的問(wèn)題。
一、負載均衡技術(shù)
負載均衡集群是由一組相互獨立的計算機系統構成,通過(guò)常規網(wǎng)絡(luò )或專(zhuān)用網(wǎng)絡(luò )進(jìn)行連接,由路由器銜接在一起,各節點(diǎn)相互協(xié)作、共同負載、均衡壓力,對客戶(hù)端來(lái)說(shuō),整個(gè)群集可以視為一臺具有超高性能的獨立服務(wù)器。
1、實(shí)現原理
實(shí)現數據庫的負載均衡技術(shù),首先要有一個(gè)可以控制連接數據庫的控制端。在這里,它截斷了數據庫和程序的直接連接,由所有的程序來(lái)訪(fǎng)問(wèn)這個(gè)中間層,然后再由中間層來(lái)訪(fǎng)問(wèn)數據庫。這樣,我們就可以具體控制訪(fǎng)問(wèn)某個(gè)數據庫了,然后還可以根據數據庫的當前負載采取有效的均衡策略,來(lái)調整每次連接到哪個(gè)數據庫。
2、實(shí)現多據庫數據同步
對于負載均衡,最重要的就是所有服務(wù)器的數據都是實(shí)時(shí)同步的。這是一個(gè)集群所必需的,因為,如果數不據實(shí)時(shí)、不同步,那么用戶(hù)從一臺服務(wù)器讀出的數據,就有別于從另一臺服務(wù)器讀出的數據,這是不能允許的。所以必須實(shí)現數據庫的數據同步。這樣,在查詢(xún)的時(shí)候就可以有多個(gè)資源,實(shí)現均衡。比較常用的方法是Moebius for SQL Server集群,Moebius for SQL Server集群采用將核心程序駐留在每個(gè)機器的數據庫中的辦法,這個(gè)核心程序稱(chēng)為Moebius for SQL Server 中間件,主要作用是監測數據庫內數據的變化并將變化的數據同步到其他數據庫中。數據同步完成后客戶(hù)端才會(huì )得到響應,同步過(guò)程是并發(fā)完成的,所以同步到多個(gè)數據庫和同步到一個(gè)數據庫的時(shí)間基本相等;另外同步的過(guò)程是在事務(wù)的環(huán)境下完成的,保證了多份數據在任何時(shí)刻數據的一致性。正因為Moebius 中間件宿主在數據庫中的創(chuàng )新,讓中間件不但能知道數據的變化,而且知道引起數據變化的SQL語(yǔ)句,根據SQL語(yǔ)句的類(lèi)型智能的采取不同的數據同步的策略以保證數據同步成本的最小化。
數據條數很少,數據內容也不大,則直接同步數據
數據條數很少,但是里面包含大數據類(lèi)型,比如文本,二進(jìn)制數據等,則先對數據進(jìn)行壓縮然后再同步,從而減少網(wǎng)絡(luò )帶寬的占用和傳輸所用的時(shí)間。
數據條數很多,此時(shí)中間件會(huì )拿到造成數據變化的SQL語(yǔ)句, 然后對SQL語(yǔ)句進(jìn)行解析,分析其執行計劃和執行成本,并選擇是同步數據還是同步SQL語(yǔ)句到其他的數據庫中。此種情況應用在對表結構進(jìn)行調整或者批量更改數據的時(shí)候非常有用。
3、優(yōu)缺點(diǎn)
(1) 擴展性強:當系統要更高數據庫處理速度時(shí),只要簡(jiǎn)單地增加數據庫服務(wù)器就 可以得到擴展。
(2) 可維護性:當某節點(diǎn)發(fā)生故障時(shí),系統會(huì )自動(dòng)檢測故障并轉移故障節點(diǎn)的應用,保證數據庫的持續工作。
(3) 安全性:因為數據會(huì )同步的多臺服務(wù)器上,可以實(shí)現數據集的冗余,通過(guò)多份數據來(lái)保證安全性。另外它成功地將數據庫放到了內網(wǎng)之中,更好地保護了數據庫的安全性。
(4) 易用性:對應用來(lái)說(shuō)完全透明,集群暴露出來(lái)的就是一個(gè)IP
(1) 不能夠按照Web服務(wù)器的處理能力分配負載。
(2) 負載均衡器(控制端)故障,會(huì )導致整個(gè)數據庫系統癱瘓。
二、數據庫的讀寫(xiě)分離
1,實(shí)現原理:讀寫(xiě)分離簡(jiǎn)單的說(shuō)是把對數據庫讀和寫(xiě)的操作分開(kāi)對應不同的數據庫服務(wù)器,這樣能有效地減輕數據庫壓力,也能減輕io壓力。主數據庫提供寫(xiě)操作,從數據庫提供讀操作,其實(shí)在很多系統中,主要是讀的操作。當主數據庫進(jìn)行寫(xiě)操作時(shí),數據要同步到從的數據庫,這樣才能有效保證數據庫完整性。

(ebay的讀寫(xiě)比率是260:1,ebay的讀寫(xiě)分離)
(微軟數據庫分發(fā))
2,實(shí)現方法:在MS Sql server中可以使用發(fā)布定義的方式實(shí)現數據庫復制,實(shí)現讀寫(xiě)分離,復制是將一組數據從一個(gè)數據源拷貝到多個(gè)數據源的技術(shù),是將一份數據發(fā)布到多個(gè)存儲站點(diǎn)上的有效方式。使用復制技術(shù),用戶(hù)可以將一份數據發(fā)布到多臺服務(wù)器上。復制技術(shù)可以確保分布在不同地點(diǎn)的數據自動(dòng)同步更新,從而保證數據的一致性。SQL SERVER復制技術(shù)類(lèi)型有三種,分別是:快照復制、事務(wù)復制、合并復制。SQL SERVER 主要采用出版物、訂閱的方式來(lái)處理復制。源數據所在的服務(wù)器是出版服務(wù)器,負責發(fā)表數據。出版服務(wù)器把要發(fā)表的數據的所有改變情況的拷貝復制到分發(fā)服務(wù)器,分發(fā)服務(wù)器包含有一個(gè)分發(fā)數據庫,可接收數據的所有改變,并保存這些改變,再把這些改變分發(fā)給訂閱服務(wù)器。
3,優(yōu)缺點(diǎn)
(1)數據的實(shí)時(shí)性差:數據不是實(shí)時(shí)同步到自讀服務(wù)器上的,當數據寫(xiě)入主服務(wù)器后,要在下次同步后才能查詢(xún)到。
(2)數據量大時(shí)同步效率差:?jiǎn)伪頂祿窟^(guò)大時(shí)插入和更新因索引,磁盤(pán)IO等問(wèn)題,性能會(huì )變的很差。
(3)同時(shí)連接多個(gè)(至少兩個(gè))數據庫:至少要連接到兩個(gè)數據數據庫,實(shí)際的讀寫(xiě)操作是在程序代碼中完成的,容易引起混亂
(4)讀具有高性能高可靠性和可伸縮:只讀服務(wù)器,因為沒(méi)有寫(xiě)操作,會(huì )大大減輕磁盤(pán)IO等性能問(wèn)題,大大提高效率;只讀服務(wù)器可以采用負載均衡,主數據庫發(fā)布到多個(gè)只讀服務(wù)器上實(shí)現讀操作的可伸縮性。
三、數據庫拆分(分布式)
通過(guò)某種特定的條件,將存放在同一個(gè)數據庫中的數據分散存放到多個(gè)數據庫上,實(shí)現分布存儲,通過(guò)路由規則路由訪(fǎng)問(wèn)特定的數據庫,這樣一來(lái)每次訪(fǎng)問(wèn)面對的就不是單臺服務(wù)器了,而是N臺服務(wù)器,這樣就可以降低單臺機器的負載壓力。
垂直(縱向)拆分:是指按功能模塊拆分,比如分為訂單庫、商品庫、用戶(hù)庫...這種方式多個(gè)數據庫之間的表結構不同。
水平(橫向)拆分:將同一個(gè)表的數據進(jìn)行分塊保存到不同的數據庫中,這些數據庫中的表結構完全相同。

(縱向拆分)

(橫向拆分)
1,實(shí)現原理:使用垂直拆分,主要要看應用類(lèi)型是否合適這種拆分方式,如系統可以分為,訂單系統,商品管理系統,用戶(hù)管理系統業(yè)務(wù)系統比較明的,垂直拆分能很好的起到分散數據庫壓力的作用。業(yè)務(wù)模塊不明晰,耦合(表關(guān)聯(lián))度比較高的系統不適合使用這種拆分方式。但是垂直拆分方式并不能徹底解決所有壓力問(wèn)題,例如 有一個(gè)5000w的訂單表,操作起來(lái)訂單庫的壓力仍然很大,如我們需要在這個(gè)表中增加(insert)一條新的數據,insert完畢后,數據庫會(huì )針對這張表重新建立索引,5000w行數據建立索引的系統開(kāi)銷(xiāo)還是不容忽視的,反過(guò)來(lái),假如我們將這個(gè)表分成100個(gè)table呢,從table_001一直到table_100,5000w行數據平均下來(lái),每個(gè)子表里邊就只有50萬(wàn)行數據,這時(shí)候我們向一張只有50w行數據的table中insert數據后建立索引的時(shí)間就會(huì )呈數量級的下降,極大了提高了DB的運行時(shí)效率,提高了DB的并發(fā)量,這種拆分就是橫向拆分
2,實(shí)現方法:垂直拆分,拆分方式實(shí)現起來(lái)比較簡(jiǎn)單,根據表名訪(fǎng)問(wèn)不同的數據庫就可以了。橫向拆分的規則很多,這里總結前人的幾點(diǎn),
(1)順序拆分:如可以按訂單的日前按年份才分,2003年的放在db1中,2004年的db2,以此類(lèi)推。當然也可以按主鍵標準拆分。
優(yōu)點(diǎn):可部分遷移
缺點(diǎn):數據分布不均,可能2003年的訂單有100W,2008年的有500W。
(2)hash取模分: 對user_id進(jìn)行hash(或者如果user_id是數值型的話(huà)直接使用user_id的值也可),然后用一個(gè)特定的數字,比如應用中需要將一個(gè)數據庫切分成4個(gè)數據庫的話(huà),我們就用4這個(gè)數字對user_id的hash值進(jìn)行取模運算,也就是user_id%4,這樣的話(huà)每次運算就有四種可能:結果為1的時(shí)候對應DB1;結果為2的時(shí)候對應DB2;結果為3的時(shí)候對應DB3;結果為0的時(shí)候對應DB4,這樣一來(lái)就非常均勻的將數據分配到4個(gè)DB中。
優(yōu)點(diǎn):數據分布均勻
缺點(diǎn):數據遷移的時(shí)候麻煩;不能按照機器性能分攤數據 。
(3)在認證庫中保存數據庫配置
就是建立一個(gè)DB,這個(gè)DB單獨保存user_id到DB的映射關(guān)系,每次訪(fǎng)問(wèn)數據庫的時(shí)候都要先查詢(xún)一次這個(gè)數據庫,以得到具體的DB信息,然后才能進(jìn)行我們需要的查詢(xún)操作。
優(yōu)點(diǎn):靈活性強,一對一關(guān)系
缺點(diǎn):每次查詢(xún)之前都要多一次查詢(xún),會(huì )造成一定的性能損失。
聯(lián)系客服