天天看點

大型網際網路應用的資料庫設計與部署方案

随着網際網路應用的廣泛普及,海量資料的存儲和通路成為了系統設計的瓶頸問題。對于一個大型的網際網路應用,每天百萬級甚至上億的PV無疑對資料庫造成了相當高的負載。對于系統的穩定性和擴充性造成了極大的問題。 負載均衡技術 負載均衡叢集是由一組互相獨立的計算機系統構成,通過正常網絡或專用網絡進行連接配接,由路由器銜接在一起,各節點互相協作、共同負載、均衡壓力,對用戶端來說,整個群集可以視為一台具有超高性能的獨立伺服器。 實作原理:實作資料庫的負載均衡技術,首先要有一個可以控制連接配接資料庫的控制端。在這裡,它截斷了資料庫和程式的直接連接配接,由所有的程式來通路這個中間層,然後再由中間層來通路資料庫。這樣,我們就可以具體控制通路某個資料庫了,然後還可以根據資料庫的目前負載采取有效的均衡政策,來調整每次連接配接到哪個資料庫。 實作多據庫資料同步:對于負載均衡,最重要的就是所有伺服器的資料都是實時同步的。這是一個叢集所必需的,因為,如果數不據實時、不同步,那麼使用者從一台伺服器讀出的資料,就有别于從另一台伺服器讀出的資料,這是不能允許的。是以必須實作資料庫的資料同步。這樣,在查詢的時候就可以有多個資源,實作均衡。比較常用的方法是Moebius for SQL Server叢集,Moebius for SQL Server叢集采用将核心程式駐留在每個機器的資料庫中的辦法,這個核心程式稱為Moebius for SQL Server 中間件,主要作用是監測資料庫内資料的變化并将變化的資料同步到其他資料庫中。資料同步完成後用戶端才會得到響應,同步過程是并發完成的,是以同步到多個資料庫和同步到一個資料庫的時間基本相等;另外同步的過程是在事務的環境下完成的,保證了多份資料在任何時刻資料的一緻性。正因為Moebius 中間件宿主在資料庫中的創新,讓中間件不但能知道資料的變化,而且知道引起資料變化的SQL語句,根據SQL語句的類型智能的采取不同的資料同步的政策以保證資料同步成本的最小化。 * 資料條數很少,資料内容也不大,則直接同步資料。 * 資料條數很少,但是裡面包含大資料類型,比如文本,二進制資料等,則先對資料進行壓縮然後再同步,進而減少網絡帶寬的占用和傳輸所用的時間。 * 資料條數很多,此時中間件會拿到造成資料變化的SQL語句, 然後對SQL語句進行解析,分析其執行計劃和執行成本,并選擇是同步資料還是同步SQL語句到其他的資料庫中。此種情況應用在對表結構進行調整或者批量更改資料的時候非常有用。 優點: 1. 擴充性強:當系統要更高資料庫處理速度時,隻要簡單地增加資料庫伺服器就 可以得到擴充。 2. 可維護性:當某節點發生故障時,系統會自動檢測故障并轉移故障節點的應用,保證資料庫的持續工作。 3. 安全性:因為資料會同步的多台伺服器上,可以實作資料集的備援,通過多份資料來保證安全性。另外它成功地将資料庫放到了内網之中,更好地保護了資料庫的安全性。 4. 易用性:對應用來說完全透明,叢集暴露出來的就是一個IP。 缺點: 1. 不能夠按照Web伺服器的處理能力配置設定負載。 2. 負載均衡器(控制端)故障,會導緻整個資料庫系統癱瘓。 資料庫的讀寫分離 實作原理:讀寫分離簡單的說是把對資料庫讀和寫的操作分開對應不同的資料庫伺服器,這樣能有效地減輕資料庫壓力,也能減輕io壓力。主資料庫提供寫操作,從資料庫提供讀操作,其實在很多系統中,主要是讀的操作。當主資料庫進行寫操作時,資料要同步到從的資料庫,這樣才能有效保證資料庫完整性。 實作方法:在MS Sql server中可以使用釋出定義的方式實作資料庫複制,實作讀寫分離,複制是将一組資料從一個資料源拷貝到多個資料源的技術,是将一份資料釋出到多個存儲站點上的有效方式。使用複制技術,使用者可以将一份資料釋出到多台伺服器上。複制技術可以確定分布在不同地點的資料自動同步更新,進而保證資料的一緻性。 SQL SERVER複制技術類型有三種,分别是:快照複制、事務複制、合并複制。SQL SERVER 主要采用出版物、訂閱的方式來處理複制。源資料所在的伺服器是出版伺服器,負責發表資料。出版伺服器把要發表的資料的所有改變情況的拷貝複制到分發伺服器,分發伺服器包含有一個分發資料庫,可接收資料的所有改變,并儲存這些改變,再把這些改變分發給訂閱伺服器。 優點: 1. 資料的實時性差:資料不是實時同步到自讀伺服器上的,當資料寫入主伺服器後,要在下次同步後才能查詢到。 2. 資料量大時同步效率差:單表資料量過大時插入和更新因索引,磁盤IO等問題,性能會變的很差。 3. 同時連接配接多個(至少兩個)資料庫:至少要連接配接到兩個資料資料庫,實際的讀寫操作是在程式代碼中完成的,容易引起混亂。 4. 讀具有高性能高可靠性和可伸縮:隻讀伺服器,因為沒有寫操作,會大大減輕磁盤IO等性能問題,大大提高效率;隻讀伺服器可以采用負載均衡,主資料庫釋出到多個隻讀伺服器上實作讀操作的可伸縮性。 資料庫拆分(分布式) 通過某種特定的條件,将存放在同一個資料庫中的資料分散存放到多個資料庫上,實作分布存儲,通過路由規則路由通路特定的資料庫,這樣一來每次通路面對的就不是單台伺服器了,而是N台伺服器,這樣就可以降低單台機器的負載壓力。 垂直(縱向)拆分:是指按功能子產品拆分,比如分為訂單庫、商品庫、使用者庫...這種方式多個資料庫之間的表結構不同。 水準(橫向)拆分:将同一個表的資料進行分塊儲存到不同的資料庫中,這些資料庫中的表結構完全相同。 實作原理:使用垂直拆分,主要要看應用類型是否合适這種拆分方式,如系統可以分為,訂單系統,商品管理系統,使用者管理系統業務系統比較明的,垂直拆分能很好的起到分散資料庫壓力的作用。業務子產品不明晰,耦合(表關聯)度比較高的系統不适合使用這種拆分方式。但是垂直拆分方式并不能徹底解決所有壓力問題,例如 有一個5000w的訂單表,操作起來訂單庫的壓力仍然很大,如我們需要在這個表中增加(insert)一條新的資料,insert完畢後,資料庫會針對這張表重建立立索引,5000w行資料建立索引的系統開銷還是不容忽視的,反過來,假如我們将這個表分成100個table呢,從table_001一直到 table_100,5000w行資料平均下來,每個子表裡邊就隻有50萬行資料,這時候我們向一張隻有50w行資料的table中insert資料後建立索引的時間就會呈數量級的下降,極大了提高了DB的運作時效率,提高了DB的并發量,這種拆分就是橫向拆分。 實作方法:垂直拆分,拆分方式實作起來比較簡單,根據表名通路不同的資料庫就可以了。橫向拆分的規則很多,這裡總結前人的幾點: 1. 順序拆分:如可以按訂單的日前按年份才分,2003年的放在db1中,2004年的db2,以此類推。當然也可以按主鍵标準拆分。 優點:可部分遷移 缺點:資料分布不均,可能2003年的訂單有100W,2008年的有500W。 2. hash 取模分: 對user_id進行hash(或者如果user_id是數值型的話直接使用user_id的值也可),然後用一個特定的數字,比如應用中需要将一個資料庫切分成4個資料庫的話,我們就用4這個數字對user_id的hash值進行取模運算,也就是user_id%4,這樣的話每次運算就有四種可能:結果為1的時候對應DB1;結果為2的時候對應DB2;結果為3的時候對應DB3;結果為0的時候對應DB4,這樣一來就非常均勻的将資料配置設定到4個DB中。 優點:資料分布均勻 缺點:資料遷移的時候麻煩;不能按照機器性能分攤資料 。 3. 在認證庫中儲存資料庫配置 就是建立一個DB,這個DB單獨儲存user_id到DB的映射關系,每次通路資料庫的時候都要先查詢一次這個資料庫,以得到具體的DB資訊,然後才能進行我們需要的查詢操作。 優點:靈活性強,一對一關系 缺點:每次查詢之前都要多一次查詢,會造成一定的性能損失。