溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL中怎么實現(xiàn)海量數(shù)據(jù)分布式存儲

發(fā)布時間:2021-07-26 15:28:32 來源:億速云 閱讀:955 作者:Leah 欄目:數(shù)據(jù)庫

這篇文章將為大家詳細(xì)講解有關(guān)MySQL中怎么實現(xiàn)海量數(shù)據(jù)分布式存儲,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

1、分布式應(yīng)用的概念和優(yōu)勢

分布式數(shù)據(jù)庫是指利用高速網(wǎng)絡(luò)將物理上分散的多個數(shù)據(jù)存儲單元連接起來組成一個邏輯上統(tǒng)一的數(shù)據(jù)庫。分布式數(shù)據(jù)庫的基本思想是將原來集中式數(shù)據(jù)庫中的數(shù)據(jù)分散存儲到多個通過網(wǎng)絡(luò)連接的數(shù)據(jù)存儲節(jié)點上,以獲得更大的存儲容量和更高的并發(fā)訪問量。近年來,隨著數(shù)據(jù)量的增長,分布式數(shù)據(jù)庫技術(shù)也得到了快速的發(fā)展,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫開始從集中式模型向分布式存儲,從集中式計算走向分布式計算。

分布式數(shù)據(jù)庫系統(tǒng)的主要目的是容災(zāi)、異地數(shù)據(jù)備份,并且通過就近訪問原則,用戶可以就近訪問數(shù)據(jù)庫節(jié)點,這樣就實現(xiàn)了異地的負(fù)載均衡。同時,通過數(shù)據(jù)庫之間的數(shù)據(jù)傳輸同步,可以分布式保持?jǐn)?shù)據(jù)的一致性,這個過程完成了數(shù)據(jù)備份,異地存儲數(shù)據(jù)在單點故障的時候不影響服務(wù)的訪問,只需要將訪問流量切換異地鏡像就行。

分布式數(shù)據(jù)庫應(yīng)用的優(yōu)勢如下:

(1)適合分布式數(shù)據(jù)管理,能夠有效提高系統(tǒng)性能。

(2)系統(tǒng)經(jīng)濟(jì)性和靈活性好。

(3)系統(tǒng)的可靠性和可用性強。

MySQL中怎么實現(xiàn)海量數(shù)據(jù)分布式存儲

2、mysql分布式應(yīng)用的主要技術(shù)

(1)mysql數(shù)據(jù)切割

數(shù)據(jù)切割(sharding)是指通過某種特定的條件,將存放在同一數(shù)據(jù)庫中的數(shù)據(jù)分散存放到多個數(shù)據(jù)庫(主機(jī))上面,以達(dá)到分散單臺設(shè)備負(fù)載的效果。數(shù)據(jù)切分還可以提高系統(tǒng)的總體可用性,因為單臺crash之后,只有總體數(shù)據(jù)的某部分不同,而不是所有數(shù)據(jù)。

根據(jù)其切分規(guī)則的類型,可以分為兩種切分模式。一種是按照不同的表(或者schema)來切分到不同的數(shù)據(jù)庫(主機(jī))之上,這種切分成為數(shù)據(jù)的垂直(縱向切分);另一種則是根據(jù)表中數(shù)據(jù)的邏輯關(guān)系,將同一個表中的數(shù)據(jù)按照某種條件拆分到多臺數(shù)據(jù)庫(主機(jī))上面,這種切分稱為數(shù)據(jù)的水平(橫向)切分。垂直切分的***特點就是規(guī)則簡單,實施也更為方便,尤其適合各個業(yè)務(wù)之間耦合度低,相互影響小、業(yè)務(wù)邏輯非常清晰的系統(tǒng)。在這種系統(tǒng)中,可以很容易做到將不同業(yè)務(wù)模塊所使用的表拆分到不同的數(shù)據(jù)庫中。根據(jù)不同的表進(jìn)行拆分,對應(yīng)用程序的影響也更小,拆分規(guī)則也會比較簡單清晰。水平切分比垂直切分更復(fù)雜一點。因為要將同一個表中的不同數(shù)據(jù)拆分到不同的數(shù)據(jù)庫中,對于應(yīng)用程序來說,拆分規(guī)則本身比較復(fù)雜,后期的數(shù)據(jù)維護(hù)也更加復(fù)雜一些。

(2)為什么要切分?jǐn)?shù)據(jù)?

1)像Oracle這樣成熟穩(wěn)定的DB可以支撐海量數(shù)據(jù)的存儲和查詢,但是價格不是所有人都承受得起。

2)負(fù)載高點時,Master-Slaver模式中存在瓶頸。現(xiàn)有技術(shù)中,在負(fù)載高點時使用相關(guān)的Replication機(jī)制來實現(xiàn)相關(guān)的讀寫的吞吐性能。這種機(jī)制存在兩個瓶頸:一是有效性依賴于讀操作的比例,這里Master往往會成為瓶頸所在,寫操作時需要一個順序隊列來執(zhí)行,過載時Master會承受不住,Slaver的數(shù)據(jù)同步延遲也會很大,同時還會消耗CPU的計算能力,為write操作在Master上執(zhí)行以后還是需要在每臺slave機(jī)器上都跑一次。而Sharding可以輕松的將計算,存儲,I/O并行分發(fā)到多臺機(jī)器上,這樣可以充分利用多臺機(jī)器各種處理能力,同時可以避免單點失敗,提供系統(tǒng)的可用性,進(jìn)行很好的錯誤隔離。

3)用免費的MySQL和廉價的Server甚至是PC做集群,達(dá)到小型機(jī)+大型商業(yè)DB的效果,減少大量的資金投入,降低運營成本,何樂而不為呢?

Mysql5.1以上的版本都支持?jǐn)?shù)據(jù)表分區(qū)功能。數(shù)據(jù)庫中的數(shù)據(jù)在經(jīng)過垂直或水平切分被存放在不同的數(shù)據(jù)庫主機(jī)中之后,應(yīng)用系統(tǒng)面臨的***問題就是如何讓這些數(shù)據(jù)源得到較好的整合,有以下兩種解決思路。

1)在每個應(yīng)用程序模塊中配置管理自己需要的一個(或者多個)數(shù)據(jù)源,直接訪問各個數(shù)據(jù)庫,在模塊內(nèi)完成數(shù)據(jù)的整合。

2)通過中間代理層來統(tǒng)一管理所有的數(shù)據(jù)源,后端數(shù)據(jù)庫集群對前端應(yīng)用程序透明。

第二種方案,雖然短期內(nèi)需要付出的成本可能會大一些,但是對整個系統(tǒng)的擴(kuò)展性來說,是非常有幫助的。針對第二種方案,可以思路如下:

1)利用mysql proxy實現(xiàn)數(shù)據(jù)切分及整合。

Mysql  proxy是在客戶端請求與mysql服務(wù)器之間建立一個連接池,所有客戶端請求都發(fā)送到mysql proxy,由mysql  proxy進(jìn)行相應(yīng)的分析,判斷是讀操作還是寫操作,然后發(fā)送到相應(yīng)的mysql服務(wù)器上。對于多節(jié)點slave集群,也可以做到負(fù)載均衡的效果。

2)利用amoeba實現(xiàn)數(shù)據(jù)切分及整合。

Amoeba是一個基于java開發(fā)的、專注于解決分布式數(shù)據(jù)庫數(shù)據(jù)源整合proxy程序的開源框架,amoeba已經(jīng)具有query路由,query過濾、讀寫分離、負(fù)載均衡以及HA機(jī)制等相關(guān)內(nèi)容。Amoeba主要解決以下幾個問題:

①數(shù)據(jù)切分后復(fù)雜數(shù)據(jù)源整合

②提供數(shù)據(jù)切分規(guī)則并降低數(shù)據(jù)切分規(guī)則給數(shù)據(jù)庫帶來的影響

③降低數(shù)據(jù)庫與客戶端的連接數(shù)

④讀寫分離路由

3)利用HiveDB實現(xiàn)數(shù)據(jù)切分及整合。

3、mysql讀寫分離

讀寫分離是利用數(shù)據(jù)庫的復(fù)制技術(shù),將讀和寫分布在不同的處理節(jié)點上,從而達(dá)到提高可用性和擴(kuò)展性的目的。主數(shù)據(jù)庫提供寫操作,從數(shù)據(jù)庫提供讀操作,在很多系統(tǒng)中,更多地是讀操作。當(dāng)主數(shù)據(jù)庫進(jìn)行寫操作時,數(shù)據(jù)要同步到從數(shù)據(jù)庫,這樣才能有效保證數(shù)據(jù)庫完整性。Mysql也有自己的同步數(shù)據(jù)技術(shù)。Mysql通過二進(jìn)制日志來復(fù)制數(shù)據(jù),主數(shù)據(jù)庫同步到從數(shù)據(jù)庫后,從數(shù)據(jù)庫一般由多臺數(shù)據(jù)庫組成,這樣才能達(dá)到減輕壓力的目的。讀操作應(yīng)根據(jù)服務(wù)器的壓力分配到不同的服務(wù)器,而不是簡單的隨機(jī)分配。Mysql提供了mysql  proxy實現(xiàn)讀寫分離操作。

目前較為常見的mysql讀寫分離分為以下兩種。

①基于程序代碼內(nèi)部實現(xiàn)

在代碼中根據(jù)select、insert進(jìn)行路由分類,這類方法也是目前生產(chǎn)環(huán)境中應(yīng)用最廣泛的。

②基于中間代理層實現(xiàn)

代理位于客戶端和服務(wù)器之間,代理服務(wù)器收到客戶端請求后通過判斷轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫。下圖是ebay讀寫分離的結(jié)構(gòu)圖,通過share plex近乎實時的復(fù)制數(shù)據(jù)到其他數(shù)據(jù)節(jié)點,再通過特定的模塊檢查數(shù)據(jù)庫狀態(tài),并進(jìn)行負(fù)載均衡、讀寫分離,極大地提高了系統(tǒng)可用性。

4、mysql集群

Mysql cluster技術(shù)在分布式系統(tǒng)中為mysql數(shù)據(jù)提供了冗余特性,增強了安全性,使得單個mysql服務(wù)器故障不會對系統(tǒng)產(chǎn)生巨大的負(fù)面效應(yīng),系統(tǒng)的穩(wěn)定性得到保障。

Mysql  cluster采用shared-nothing(無共享)架構(gòu)。Mysql  custer主要利用了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需要一組計算機(jī),每臺計算機(jī)的角色可能是不一樣的。Mysql  cluster按照節(jié)點類型可以分為3類:管理節(jié)點(對其他節(jié)點進(jìn)行管理)、數(shù)據(jù)節(jié)點(存放cluster中的數(shù)據(jù),可以有多個)和mysql節(jié)點(存放表結(jié)構(gòu),可以有多個)。Cluster中的某計算機(jī)可以是某一種節(jié)點,也可以是2種或3種節(jié)點的集合。這3種節(jié)點只是在邏輯上劃分,所以他們不一定和物理計算機(jī)是一一對應(yīng)的關(guān)系。多個節(jié)點之間可以分布在不同的地理位置,因此也是一個實現(xiàn)分布式數(shù)據(jù)庫的方案。

Mysql集群的出現(xiàn)很好的實現(xiàn)了數(shù)據(jù)庫的負(fù)載均衡,減少了數(shù)據(jù)中心節(jié)點的壓力和大數(shù)據(jù)處理,當(dāng)數(shù)據(jù)庫中心節(jié)點出現(xiàn)故障時,集群會采用一定的策略切換到其他備份節(jié)點上,有效的屏蔽了故障問題,單節(jié)點的失效不會影響整個數(shù)據(jù)庫對外提供服務(wù)。而且通過采用數(shù)據(jù)庫集群架構(gòu),主從數(shù)據(jù)庫之間時刻都在進(jìn)行數(shù)據(jù)的同步冗余,數(shù)據(jù)庫是多點的、分布式的,良好的完成了數(shù)據(jù)庫數(shù)據(jù)的備份,避免了數(shù)據(jù)損失。

關(guān)于MySQL中怎么實現(xiàn)海量數(shù)據(jù)分布式存儲就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI