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去中止事務。
e)每個Slave等待來自Master的OK或ABORT訊息。
如果Slave收到提交請求,它們就會提交事務,並向Master傳送事務已提交 的確認;
如果Slave收到取消請求,它們就會撤銷所有改變並釋放所佔有的資源,從而中止事務,然後向Masterv送事務已中止的確認。
f) 當Master收到來自所有Slave的確認後,就會報告該事務被提交(或中止),然後繼續進行下一個事務處理。
由於同步複製一共需要4次訊息傳遞,故mysql cluster的資料更新速度比單機mysql要慢。所以mysql cluster要求執行在千兆以上的區域網內,節點可以採用雙網絡卡,節點組之間採用直連方式。
疑問: 對cluster進行擴容增加資料節點組時會不 會導致資料更新速度降低?
答:不會,資料更新速度會變快。因為資料是分別處理,每個節點組所儲存的資料是不一樣的,
也能減少鎖定。
2.Mysqlcluster將所有的索引列都儲存在主存中,其他非索引列可以儲存在記憶體中或者通過建立表空間儲存到磁碟上。如果資料發生改變(insert,update,delete等),mysql 叢集將發生改變的記錄寫入重做日誌,然後通過檢查點定期將資料定入磁碟。由於重做日誌是非同步提交的,所以故障期間可能有少量事務丟失。為了減少事務丟失,mysql叢集實現延遲寫入(預設延遲兩秒,可配置),這樣就可以在故障發生時完成檢查點寫入,而不會丟失最後一個檢查點。一般單個數據節點故障不會導致任何資料丟失,因為叢集內部採用同步資料複製。
四、MySQL叢集的橫向擴充套件