前陣子架設了一套 MySQL Cluster 叢集的架構,終於在最近補上了實作過程,叢集的概念就是把一台式架構拆分為多台式架構,並且可以提供 HA 高可用性與負載均衡的需求,更不需要擔心延展性的問題,若是 Loading 加大了只需要增加 node 去分擔 Loading
MySQL Cluster Nodes:
- Manage Nodes:負責監控叢集所有 Nodes 的狀態,並且由此控制所有 Nodes 的替換。
- Data Nodes:負責所有 SQL Data 的 Nodes,單純儲存資料,將資料寫在 RAM & Disk。
- SQL Nodes:負責 SQL 的 Table schema 和 Client 連接的空間。
MySQL Cluster architecture :
本次 LAB 的實驗架構:
- Manage Node:172.10.0.140
- SQL Node1:172.10.0.141
- SQL Node2:172.10.0.142
- Data Node1:172.10.0.143
- Data Node2:172.10.0.144
MySQL Cluster 實作
所有的 nodes 都需要安裝 mysql-cluster
$ wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-7.4/mysql-cluster-gpl-7.4.11-linux-glibc2.5-i686.tar.gz $ tar zxvf mysql-cluster-gpl-7.4.11-linux-glibc2.5-i686.tar.gz $ mkdir /usr/local/mysql && mv mysql-cluster-gpl-7.4.11-linux-glibc2.5-i686 !$
建立 Manage node
$ mkdir /var/lib/mysql-cluster $ vim /var/lib/mysql-cluster/config.ini [NDBD DEFAULT] NoOfReplicas=2 DataMemory=1024M IndexMemory=256M [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] DataDir=/var/lib/mysql-cluster [TCP DEFAULT] [NDB_MGMD] NodeId=1 HostName=172.10.0.140 [MYSQLD] NodeId=2 HostName=172.10.0.141 [MYSQLD] NodeId=3 HostName=172.10.0.142 [NDBD] NodeId=4 HostName=172.10.0.143 DataDir=/var/lib/mysql-cluster [NDBD] NodeId=5 HostName=172.10.0.144 DataDir=/var/lib/mysql-cluster
NoOfReplicas=2:是 Cluster 非常重要的參數,代表著存在 2 份一樣的資料在 Data node,所以你的 Data node 允許著 1 台的故障容錯還有另一份資料可以正常運行,在本篇因為 Data node 只有 2 台,所以設定 2 就可以了,再多也沒有意義只是增加 write loading
DataMemory & IndexMemory:代表著資料和索引可以儲存的記憶體容量有多大。
NodeId:每一個 nodes 都必須擁有獨一無二的 id 值
這邊記錄著所有 nodes 的訊息,才能進行容錯移轉
把 ndb_mgm 和 ndb_mgmd 等工具放到 /usr/local/bin 方便使用
$ cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/
建立 Data node
$ vim /etc/my.cnf [mysqld] # enable cluster service ndbcluster # with connect manage node ndb-connectstring=172.10.0.140:1186 # defaulte database engine default-storage-engine=NDBCLUSTER # setting character skip-character-set-client-handshake character-set-server = utf8 collation-server = utf8_general_ci init-connect = SET NAMES utf8 [mysql_cluster] # cluster management node ndb-connectstring=172.10.0.140:1186
建立 SQL node
# check permissions $ adduser mysql -d /usr/local/mysql $ chmod -R root.mysql /usr/local/mysql $ chmod -R mysql /usr/local/mysql/data $ vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 ndbcluster default_storage_engine=ndbcluster ndb-connectstring=172.10.0.140:1186 [mysql_cluster] ndb-connectstring=172.10.0.140:1186 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [client] socket=/usr/local/mysql/data/mysql.sock $ /usr/local/mysql/scripts/mysql_install_db --user=mysql $ cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server
啟動 Cluster 環境
啟動順序 Manager node > Data node > SQL node。
如果是第一次啟動 SQL node 請使用 –initial 初始化,如果已經有資料請絕對不要使用 –initial 否則此 node 的資料全毀
# in Manage node $ ndb_mgmd -v -f /var/lib/mysql-cluster/config.ini # in Data node , first use --initial $ /usr/local/mysql/bin/ndbd --defaults-file=/etc/my.cnf -v # in SQL node $ /etc/init.d/mysql.server start
匯入資料庫(ndbcluster)
cluster 的資料庫類型都必須為 ndbcluster,在匯入資料庫前必須改為 NDBCLUSTER
# Type=InnoDB $ mysqldump -uroot -p db | sed 's/ENGINE=InnoDB/ENGINE=NDBCLUSTER/g' > db.sql or # Type=MyISAM $ mysqldump -uroot -p db | sed 's/ENGINE=MyISAM/ENGINE=NDBCLUSTER/g' > db.sql
Cluster 確認
從 Manage node 確認所有 node 狀態
# in Manage node $ ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=3 @172.10.0.143 (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0) id=4 @172.10.0.144 (mysql-5.6.29 ndb-7.4.11, Nodegroup: 0, *) [ndb_mgmd(MGM)] 1 node(s) id=1 @172.10.0.140 (mysql-5.6.29 ndb-7.4.11) [mysqld(API)] 2 node(s) id=2 @172.10.0.141 (mysql-5.6.29 ndb-7.4.11) id=3 @172.10.0.142 (mysql-5.6.29 ndb-7.4.11)
容錯測試
- Data node1 中斷,服務正常
- SQL node1 中斷,服務正常
- Manage node 中斷,服務正常
- Data node1 > SQL node1 順序中斷,服務正常
- Data node1 > SQL node1 > Manage node 順序中斷,服務正常
- Manage node > Data node1 順序中斷,服務異常
- Manage node > SQL node1 順序中斷,服務異常
從上面測試可以理解,由於 Manage node 是所有 node 的管理者,一旦管理者掛了又觸發了容錯事件,就會無法處理而造成 cluster 中斷
這篇到結尾,如果你要基本的容錯機制可以允許一台故障的話,至少要 3 台才能建立起 MySQL Cluster 架構
- Node1 (SQL + Data node)
- Node2 (SQL + Data node)
- Node3 (Manage node)
必須注意只擁有一台 Manage node 不能與其他的 node 共用,否則會同時觸發 Manage + node 異常而造成無法容錯的狀況。
這樣的架構還可以在無限延伸,包含 Manage node 也可以擁有多台進行容錯。
有個疑問,要存取db應該是要透過Manage node吧
如果Manage node中斷要如何正常運作?
Hi max,
Manage node 是用來管理叢集的,只要不是 Manage node 和 Data node / SQL node 同時兩台中斷的話都不影響整個 Cluster 運作。
請問一下 是不是mysql cluster 如要load balance 要另外再用硬體或類似 HA Proxy 來達到是嗎?
此外,如中途有一台 SQL NODE 或DATA NODE 掛點,
是復恢服務後 有缺的資料( DB SCHEMA or Data )會就自動SYNC好嗎?
還有如要再多擴充一台 SQL NODE 或 DATA NODE 是否整套機制要先停機? 還是直接加入設定後 reload Manage node 的config就好?
1. Yes
2. Cluster 會自動 SYNC
3. 加 Node 只要從 Manage 設定後 reload 即可
謝謝你的分享 這樣我大致清楚了 感謝