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