大型电子商务网站架构之--分布式可扩展数据库架构
http://liriguang.iteye.com/blog/714728
近幾年分布式成為熱門的話題,也成為大型系統必備良藥,而在數據庫方面應用更加廣泛。通過采用普通廉價的設備構建出高可用性和高擴展的集群目的。從而擺脫了大型設備的依賴,一個好的分布式數據庫架構可以比較方便達到高可用性有可以達到向外擴展的能力。傳統的數據庫系統一般是通過高端設備,例如小型機或者高端存儲來保證數據庫完整性,或者通過增加內存cpu來提高數據庫處理能力。這種集中式的的的數據庫架構越來越不適合海里數據庫處理,而且也得付出高額的費用。分布式的架構也就成了商家探索的技術。
?
數據庫集群
?
oracle集群
Oracle RAC是業界最流行的產品。其架構的最大特點是共享存儲架構(Shared-disk),整個RAC集群是建立在一個共享的存儲設備之上的,節點之間采用 高速網絡互連。在 Oracle RAC 環境中,每個 Oracle 數據塊都被賦予一個(且只有一個)“主”Oracle RAC 節點。該 Oracle RAC 節點的全局緩存服務 (GCS) 負責管理對這些數據塊集的訪問。當其中一個 Oracle 節點需要訪問某個 Oracle 數據塊時,它必須首先與該數據塊協商。然后,該主節點的 GCS 或者指示請求的 Oracle 節點從磁盤中獲取該數據塊,或者指示該Oracle 數據塊的當前持有者將被請求的數據塊發送到請求節點。Oracle 嘗試跨所有 RAC 節點統一分發該數據塊的所有權。在 Oracle RAC 環境中,數據塊大致相等的所有節點都將被指定為主節點。(如果 Oracle RAC 節點數是 Oracle 數據塊數的約數,則所有 RAC 節點都是具有同樣數量的數據塊的主節點。)
?
mysql集群
MySQL cluster和Oracle RAC完全不同,它采用Shared-nothing架構。整個集群由管理節點(ndb_mgmd),處理節點(mysqld)和存儲節點(ndbd)組 成,不存在一個共享的存儲設備。MySQL cluster主要利用了NDB存儲引擎來實現,NDB存儲引擎是一個內存式存儲引擎,要求數據必須全部加載到內存之中。數據被自動分布在集群中的不同存 儲節點上,每個存儲節點只保存完整數據的一個分片(fragment)。同時,用戶可以設置同一份數據保存在多個不同的存儲節點上,以保證單點故障不會造成數據丟失。
MySQL cluster的優點在于其是一個分布式的數據庫集群,處理節點和存儲節點都可以線性增加,整個集群沒有單點故障,可用性和擴展性都可以做到很高,更適合 OLTP應用。但是它的問題在于:1.NDB存儲引擎必須要求數據全部加載到內存之中,限制比較大,但是目前NDB新版本對此做了改進,允許只在內存中加 載索引數據,數據可以保存在磁盤上。2.目前的MySQL cluster的性能還不理想,因為數據是按照主鍵hash分布到不同的存儲節點上,如果應用不是通過主鍵去獲取數據的話,必須在所有的存儲節點上掃描, 返回結果到處理節點上去處理。而且,寫操作需要同時寫多份數據到不同的存儲節點上,對節點間的網絡要求很高。
?
分布式數據庫拆分
?
數據庫分片
Sharding 不是一個某個特定數據庫軟件附屬的功能,而是在具體技術細節之上的抽象處理,是水平擴展(Scale Out,亦或橫向擴展、向外擴展)的解決方案,其主要目的是為突破單節點數據庫服務器的 I/O 能力限制,解決數據庫擴展性問題。
- 把熱度高的數據劃分開來,使用配置剛好的硬件,提高訪問速度,增強用戶體驗
- 把不同的用戶的數據根據用戶的id放到不同的數據庫中,不同用戶對應的交易數據也跟著到不同的數據庫;之后可以把交易完成和正在交易的數據庫分開。
- 一個全國經濟信息系統,可以按照不同地區把不同數據放到不同數據庫中,隨著時間增加數據也會越來越大,到時還可以工具年份在重新劃分數據庫。
- 一個大中型的電子商的電子商務網站一定會遇到數據量巨大的問題,可以根據用戶對象或者使用和被使用的數據進行分片。這樣避免了在一個庫中數據膨脹而帶來的瓶頸。
- 在數據庫分片時最好分到不同的服務器中,或者不同的存儲中,避免磁盤競爭?
數據庫分片存在比較大問題就是人查詢或者統計涉及到跨庫就比較麻煩。特別是join時如果涉及到多個節點,將非常困難,應該盡量避免。
?
數據庫水平分片
?
讀寫分離
讀寫分離架構利用了數據庫的復制技術,將讀和寫分布在不同的處理節點上,從而達到提高可用性和擴展性的目的。
讀寫分離簡單的說是把對數據庫讀和寫的操作分開對應不同的數據庫服務器,這樣能有效地減輕數據庫壓力,也能減輕io壓力。主數據庫提供寫操作,從數據庫提供讀操作,其實在很多系統中,主要是讀的操作。當主數據庫進行寫操作時,數據要同步到從的數據庫,這樣才能有效保證數據庫完整性。Quest SharePlex就是比較牛的同步數據工具,聽說比oracle本身的流復制還好,mysql也有自己的同步數據技術。mysql只要是通過二進制日志來復制數據。通過日志在從數據庫重復主數據庫的操作達到復制數據目的。這個復制比較好的就是通過異步方法,把數據同步到從數據庫。
主數據庫同步到從數據庫后,從數據庫一般由多臺數據庫組成這樣才能達到減輕壓力的目的。讀的操作怎么樣分配到從數據庫上?應該根據服務器的壓力把讀的操作分配到服務器,而不是簡單的隨機分配。mysql提供了MySQL-Proxy實現讀寫分離操作。不過MySQL-Proxy好像很久不更新了。oracle可以通過F5有效分配讀從數據庫的壓力。
??上面說的數據庫同步復制,都是在從同一種數據庫中,如果我要把oracle的數據同步到mysql中,其實要實現這種方案的理由很簡單,mysql免費,oracle太貴。好像Quest SharePlex也實現不了改功能吧。好像現在市面還沒有這個工具吧。那樣應該怎么實現數據同步?其實我們可以考慮自己開發一套同步數據組件,通過消息,實現異步復制數據。其實這個實現起來要考慮很多方面問題,高并發的問題,失敗記錄等。其實這種方法也可以同步數據到memcache中。聽說oracle的Stream也能實現,不過沒有試過。
?
?
上圖是ebay讀寫分離的結構圖,通過Share Plex?近乎實時的復制數據到其他數據庫節點,再通過F5特定的模塊檢查數據庫狀態,并進行負載均衡,IO?成功的做到了分布,讀寫分離,而且極大的提高了可用性。目前讀寫分離技術比較多,比較有名的為amoeba,有興趣的同學可以研究下。
?
數據庫緩存
讀寫分離現在應用非常廣泛,特別是時國內外大型網站,都使用的非常多,很多都是自己研發緩存系統,淘寶還開源了Tair系統,有興趣的可以研究下。比較有名的是memcached使用memcached最好的可能算facebook了。通過memcached分擔讀的操作,把常用的對象數據存儲到memcached中,當有讀操作過來時先訪問memcached如果memcached沒有該數據再從數據庫獲取,同時把數據放到memcached中,下次訪問就可以直接訪問memcached了。
?
有一次在和一個朋友聊天時他們正在著手在線文檔系統架構設計,由于文檔訪問壓力非常大,每次請求數據庫也非常大,由于大量的的文檔數據在服務端和客戶端傳輸,會經常造成網絡堵塞。我建議他可以把文檔分片,減少一次性大文件傳輸。再根據文檔熱度把一些文檔保持到緩存中。其實文檔也好,數據庫也好,很多方法只要根據業務要求也可以達到異曲同工的之效。
轉載于:https://www.cnblogs.com/bluejoe/p/5115997.html
總結
以上是生活随笔為你收集整理的大型电子商务网站架构之--分布式可扩展数据库架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cxf restful
- 下一篇: WebService开发笔记 1 --