一、什么是MySQL集群
MySQL集群是一個無共享的(shared-nothing)、分布式節點架構的存儲方案,其目的是提供容錯性和高性能。
數據更新使用讀已提交隔離級別(read-committedisolation)來保證所有節點數據的一致性,使用兩階段提交機制(two-phasedcommit)保證所有節點都有相同的數據(如果任何一個寫操作失敗,則更新失敗)。
無共享的對等節點使得某台服務器上的更新操作在其他服務器上立即可見。傳播更新使用一種復雜的通信機制,這一機制專用來提供跨網絡的高吞吐量。
通過多個MySQL服務器分配負載,從而最大程序地達到高性能,通過在不同位置存儲數據保證高可用性和冗余。二、架構圖
三、如何存儲數據
1.Mysqlcluster數據節點組內主從同步采用的是同步復制,來保證組內節點數據的一致性。一般通過兩階段提交 協議來實現,一般工作過程如下:
如果Master收到所有 Slave的OK消息,它就會向所有Slave發送提交消息,告訴Slave提交該事務;
如果Master收到來自任何一個Slave的ABORT消息,它就向所有 Slave發送ABORT消息,告訴Slave去中止事務。
如果Slave收到提交請求,它們就會提交事務,並向Master發送事務已提交 的確認;
如果Slave收到取消請求,它們就會撤銷所有改變並釋放所占有的資源,從而中止事務,然后向Masterv送事務已中止的確認。
f) 當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%的高可用性
缺點: