之前也聽過人人網曾使用過代替普通MC緩衝的方案,然後自己看了下相關的文檔,這裡記錄一下。
MysqlCluster主要分為三個核心部分:cluster manager 、 sql node 、 ndb node
cluster manager : 類似一個管理節點,負責管理sql node 和 ndb node , 同時也會儲存中繼資料資訊,這個對高可用要求不高,掛了不影響服務.
sql node : 其實就是一個裝了NDB engine 的Mysql Server,負責提供服務,但是不做資料存放區。
ndb node : 主要做資料存放區用,預設全記憶體的,也可以指定為磁碟的檔案,也叫做data node。
安全配置就不說了,網上很多,文檔也有介紹。
HA , 高可用:
ndb node 有group 的概念,比如有兩個ndb node : node1 , node2 。這兩個做一個group , 那麼這個group 會存兩份資料,這樣有一份壞掉,資料的完整性也能保證,如果有四個節點,可以做兩個group , group 之間做資料分區,group 之內做資料冗餘,目前一台機器只能啟一個ndb node .一個Group之間的Node也有主和從的概念,只能有一個主,主掛了會從從節點中選主。
sql node 的高可用官方就是啟動多個sql node ,但是我覺得這樣沒啥用,因為程式只能連一個sql node ,前端可以做LVS或者用keepalive,對多個SQLNode做高可用。
mysql cluster 最大的優點就是可以動態增加節點,因為資料是存記憶體的,所以加節點就類似於擴容,加節點需要一台一台的重啟ndb manager 、 sql node 、ndb node,因為資料有多份,所以可以做到線上的變更,當節點加入叢集,資料需要重新分配,這個也是線上的。
mysql cluster 也能做到備份和恢複,類似於在每個資料節點上做一個快照,每個資料節點目錄下都會有一份備份檔案,恢複也靠這個恢複。
mysql cluster 也是能支援事務的,也有自己的redo 和undo , redo統一存在磁碟,Undo則是看情況,記憶體表在記憶體,磁碟表在磁碟。
Mysql cluster 之間也能做複製,就是說兩個叢集之間也能做複製,有個前提:binlog 格式必須是ROW Based,寫binlog是有一個injector thread來完成的,為什麼不同MysqlServer來寫Binlog呢?因為如果是MysqlServer寫Binlog,如果程式直接通過NDB的API操作資料Binlog就會少很多,所以又新啟了一個線程。
Mysql cluster 資料切分,Mysql cluster 預設的切分方法是根據主鍵做Hash,如果沒主鍵則用唯一建,如果連唯一建都沒有則採用Innodb的Rowid。
至於效能倒是沒測試,資料全存記憶體應該不會差。mysql cluster算是目前Mysql主推的一個產品,但是貌似大家對這種全記憶體的方案不是太感冒,應用到生產環境還需要更多的嘗試和測試。