MySQL叢集---①淺談MySQL叢集原理
本文簡單介紹一下MySQL叢集的基本原理!
一、什麼是MySQL叢集
MySQL叢集是一個無共享的(shared-nothing)、分散式節點架構的儲存方案,其目的是提供容錯性和高效能。
資料更新使用讀已提交隔離級別(read-committedisolation)來保證所有節點資料的一致性,使用兩階段提交機制(two-phasedcommit)保證所有節點都有相同的資料(如果任何一個寫操作失敗,則更新失敗)。
無共享的對等節點使得某臺伺服器上的更新操作在其他伺服器上立即可見。傳播更新使用一種複雜的通訊機制,這一機制專用來提供跨網路的高吞吐量。
通過多個MySQL伺服器分配負載,從而最大程式地達到高效能,通過在不同位置儲存資料保證高可用性和冗餘。二、架構圖
三、如何儲存資料
1.Mysqlcluster資料節點組內主從同步採用的是同步複製,來保證組內節點資料的一致性。一般通過兩階段提交 協議來實現,一般工作過程如下:
a)Master執行提交語句時,事務被髮送到slave,slave開始準備事務的提交。
b)每個slave都要準備事務,然後向master傳送OK(或ABORT)訊息,表明事務已經準備好(或者無法準備該事務)。
c)Master等待所有Slave傳送OK或ABORT訊息
如果Master收到所有 Slave的OK訊息,它就會向所有Slave傳送提交訊息,告訴Slave提交該事務;
如果Master收到來自任何一個Slave的ABORT訊息,它就向所有 Slave傳送ABORT訊息,告訴Slave去中止事務。
d)每個Slave等待來自Master的OK或ABORT訊息。
如果Slave收到提交請求,它們就會提交事務,並向Master傳送事務已提交 的確認;
如果Slave收到取消請求,它們就會撤銷所有改變並釋放所佔有的資源,從而中止事務,然後向Masterv送事務已中止的確認。
e)當Master收到來自所有Slave的確認後,就會報告該事務被提交(或中止),然後繼續進行下一個事務處理。
由於同步複製一共需要4次訊息傳遞,故mysql cluster的資料更新速度比單機mysql要慢。所以mysql cluster要求執行在千兆以上的區域網內,節點可以採用雙網絡卡,節點組之間採用直連方式。
疑問: 對cluster進行擴容增加資料節點組時會不會導致資料更新速度降低?
答:不會,資料更新速度會變快。因為資料是分別處理,每個節點組所儲存的資料是不一樣的,
也能減少鎖定。
2.Mysqlcluster將所有的索引列都儲存在主存中,其他非索引列可以儲存在記憶體中或者通過建立表空間儲存到磁碟上。如果資料發生改變(insert,update,delete等),mysql 叢集將發生改變的記錄寫入重做日誌,然後通過檢查點定期將資料定入磁碟。由於重做日誌是非同步提交的,所以故障期間可能有少量事務丟失。為了減少事務丟失,mysql叢集實現延遲寫入(預設延遲兩秒,可配置),這樣就可以在故障發生時完成檢查點寫入,而不會丟失最後一個檢查點。一般單個數據節點故障不會導致任何資料丟失,因為叢集內部採用同步資料複製。
四、MySQL叢集的橫向擴充套件
1.新增資料節點組來擴充套件寫操作,提高 cluster的儲存能力。支援線上擴容,先將新的節點加入到clsuter裡,啟動後用 ALTER ONLINE TABLE table_name REORGANIZE PARTITION 命令進行資料遷移,把資料平均分配到資料節點上。
2.新增Slave僅僅擴充套件讀,而不能做到寫操作的橫向擴充套件。
整個系統的平均負載可以描述為:
AverageLoad=∑readload+ ∑writeload / ∑capacity
假設每個伺服器每秒有10000的事務量,而Master每秒的寫負載為4000個事務,每秒的讀負載為6000,結果就是:AverageLoad=6000+4000/10000=100%
現在,新增3個slave,每秒的事務量增加到40000。因為寫操作也會被複制,每個寫操作執行4次,這樣每個slave的寫負載就是每秒4000個事務。那麼現在的平均負載為:AverageLoad=6000+4*4000/ 4*10000=55%
五、MySQL叢集的優缺點
優點:
a) 99.999%的高可用性
b)快速的自動失效切換 c)靈活的分散式體系結構,沒有單點故障 d)高吞吐量和低延遲 e)可擴充套件性強,支援線上擴容缺點:
a)存在很多限制,比如:不支援外來鍵 b)部署、管理、配置很複雜 c)佔用磁碟空間大,記憶體大 d)備份和恢復不方便 e)重啟的時候,資料節點將資料load到記憶體需要很長時間 本文簡單介紹了一下MySQL叢集,下面的部落格會介紹如何搭建MySQL叢集!