Mysql-15-mysql分佈式應用

1.分佈式應用的概念和優點前端

  分佈式數據庫是指利用高速網絡將物理上分散的多個數據存儲單元鏈接起來組成一個邏輯上統一的數據庫。分佈式數據庫的基本思想是將原來集中式數據庫中的數據分散存儲到多個經過網絡鏈接的數據存儲節點上,以得到更大的存儲容量和更高的併發訪問量。近年來,隨着數據量的增加,分佈式數據庫技術也獲得了快速的發展,傳統的關係型數據庫開始從集中式模型向分佈式存儲,從集中式計算走向分佈式計算。java

  分佈式數據庫系統的主要目的是容災、異地數據備份,而且經過就近訪問原則,用戶能夠就近訪問數據庫節點,這樣就實現了異地的負載均衡。同時,經過數據庫之間的數據傳輸同步,能夠分佈式保持數據的一致性,這個過程完成了數據備份,異地存儲數據在單點故障的時候不影響服務的訪問,只須要將訪問流量切換異地鏡像就行。mysql

  分佈式數據庫應用的優點以下:sql

(1)適合分佈式數據管理,可以有效提升系統性能。數據庫

(2)系統經濟性和靈活性好。後端

(3)系統的可靠性和可用性強。安全

 

2.mysql分佈式應用的主要技術服務器

(1)mysql數據切割網絡

  數據切割(sharding)是指經過某種特定的條件,將存放在同一數據庫中的數據分散存放到多個數據庫(主機)上面,以達到分散單臺設備負載的效果。數據切分還能夠提升系統的整體可用性,由於單臺crash以後,只有整體數據的某部分不一樣,而不是全部數據。架構

  

  根據其切分規則的類型,能夠分爲兩種切分模式。一種是按照不一樣的表(或者schema)來切分到不一樣的數據庫(主機)之上,這種切分紅爲數據的垂直(縱向切分);另外一種則是根據表中數據的邏輯關係,將同一個表中的數據按照某種條件拆分到多臺數據庫(主機)上面,這種切分稱爲數據的水平(橫向)切分。垂直切分的最大特色就是規則簡單,實施也更爲方便,尤爲適合各個業務之間耦合度低,相互影響小、業務邏輯很是清晰的系統。在這種系統中,能夠很容易作到將不一樣業務模塊所使用的表拆分到不一樣的數據庫中。。根據不一樣的表進行拆分,對應用程序的影響也更小,拆分規則也會比較簡單清晰。水平切分比垂直切分更復雜一點。由於要將同一個表中的不一樣數據拆分到不一樣的數據庫中,對於應用程序來講,拆分規則自己比較複雜,後期的數據維護也更加複雜一些。

  Mysql5.1以上的版本都支持數據表分區功能。數據庫中的數據在通過垂直或水平切分被存放在不一樣的數據庫主機中以後,應用系統面臨的最大問題就是如何讓這些數據源獲得較好的整合,有如下兩種解決思路。

 

(1)在每一個應用程序模塊中配置管理本身須要的一個(或者多個)數據源,直接訪問各個數據庫,在模塊內完成數據的整合。

 

(2)經過中間代理層來統一管理全部的數據源,後端數據庫集羣對前端應用程序透明。

 

第二種方案,雖然短時間內須要付出的成本可能會大一些,可是對整個系統的擴展性來講,是很是有幫助的。針對第二種方案,能夠思路以下:

 

(1)利用mysql proxy實現數據切分及整合。

 

Mysql proxy是在客戶端請求與mysql服務器之間創建一個鏈接池,全部客戶端請求都發送到mysql proxy,由mysql proxy進行相應的分析,判斷是讀操做仍是寫操做,而後發送到相應的mysql服務器上。對於多節點slave集羣,也能夠作到負載均衡的效果。

 

(2)利用amoeba實現數據切分及整合。

 

Amoeba是一個基於java開發的、專一於解決分佈式數據庫數據源整合proxy程序的開源框架,amoeba已經具備query路由,query過濾、讀寫分離、負載均衡以及HA機制等相關內容。Amoeba主要解決如下幾個問題:

 

①數據切分後複雜數據源整合

 

②提供數據切分規則並下降數據切分規則給數據庫帶來的影響

 

③下降數據庫與客戶端的鏈接數

 

④讀寫分離路由

 

(3)利用HiveDB實現數據切分及整合。

 

3.mysql讀寫分離

  

  讀寫分離架構是利用數據庫的複製技術(詳見13章),將讀和寫分佈在不一樣的處理節點上,從而達到提升可用性和擴展性的目的。主數據庫提供寫操做,從數據庫提供讀操做,在不少系統中,更多地是讀操做。當主數據庫進行寫操做時,數據要同步到從數據庫,這樣纔能有效保證數據庫完整性。Mysql也有本身的同步數據技術。Mysql經過二進制日誌來複制數據,主數據庫同步到從數據庫後,從數據庫通常由多臺數據庫組成,這樣才能達到減輕壓力的目的。讀操做應根據服務器的壓力分配到不一樣的服務器,而不是簡單的隨機分配。Mysql提供了mysql proxy實現讀寫分離操做。

 

  目前較爲常見的mysql讀寫分離分爲如下兩種。

 

①基於程序代碼內部實現

 

在代碼中根據selectinsert進行路由分類,這類方法也是目前生產環境中應用最普遍的。

 

②基於中間代理層實現

 

代理位於客戶端和服務器之間,代理服務器收到客戶端請求後經過判斷轉發到後端數據庫。下圖是ebay讀寫分離的結構圖,經過share plex近乎實時的複製數據到其餘數據節點,再經過特定的模塊檢查數據庫狀態,並進行負載均衡、讀寫分離,極大地提升了系統可用性。

 

4.mysql集羣

  

  Mysql cluster技術在分佈式系統中爲mysql數據提供了冗餘特性,加強了安全性,使得單個mysql服務器故障不會對系統產生巨大的負面效應,系統的穩定性獲得保障。

  Mysql cluster採用shared-nothing(無共享)架構。Mysql custer主要利用了NDB存儲引擎來實現,NDB存儲引擎是一個內存式存儲引擎,要求數據必須所有加載到內存之中。數據被自動分佈在集羣中的不一樣存儲節點上,每一個存儲節點只保存完整數據的一個分片(fragment)。同時,用戶能夠設置同一份數據保存在多個不一樣的存儲節點上,以保證單點故障不會形成數據丟失。

  Mysql cluster須要一組計算機,每臺計算機的角色多是不同的。Mysql cluster按照節點類型能夠分爲3類:管理節點(對其餘節點進行管理)、數據節點(存放cluster中的數據,能夠有多個)和mysql節點(存放表結構,能夠有多個)。Cluster中的某計算機能夠是某一種節點,也能夠是2種或3種節點的集合。這3種節點只是在邏輯上劃分,因此他們不必定和物理計算機是一一對應的關係。多個節點之間能夠分佈在不一樣的地理位置,所以也是一個實現分佈式數據庫的方案。

  Mysql集羣的出現很好的實現了數據庫的負載均衡,減小了數據中心節點的壓力和大數據處理,當數據庫中心節點出現故障時,集羣會採用必定的策略切換到其餘備份節點上,有效的屏蔽了故障問題,單節點的失效不會影響整個數據庫對外提供服務。並且經過採用數據庫集羣架構,主從數據庫之間時刻都在進行數據的同步冗餘,數據庫是多點的、分佈式的,良好的完成了數據庫數據的備份,避免了數據損失。

相關文章
相關標籤/搜索