MySQL NDB Cluster 是共享無架構的記憶體內資料庫叢集,提供 99.999% 高可用、自動分片、線性擴展。本文記錄基於 MySQL Cluster 7.3 (MySQL 5.6 基礎) 的三節點生產級部署全過程。
| 角色 | 進程 | 功能 | 本文節點 |
|---|---|---|---|
| Management Node | ndb_mgmd | 叢集配置、狀態監控、仲裁 | 192.168.9.243 (sqltest03) |
| Data Node | ndbd / ndbmtd | 儲存資料分片、同步複寫、記憶體運算 | 192.168.9.241/242 (sqltest01/02) |
| SQL Node | mysqld | SQL 接口、查詢解析、連接 Data Node | 192.168.9.241/242 (同機部署) |
關鍵概念:
NoOfReplicas 決定組數)ENGINE=NDBCLUSTER 的表才進入叢集共享儲存# 關閉防火牆/開放端口 3306, 1186, 2202, 2203
systemctl stop firewalld; systemctl disable firewalld
# 建立用戶與目錄
groupadd mysql; useradd -r -g mysql mysql
mkdir -p /usr/local/mysql /u01/mysql/data
chown -R mysql.mysql /usr/local/mysql /u01/mysql/data
# 下載 mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64.tar.gz
tar -zxvf mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64.tar.gz
mv mysql-cluster-gpl-7.3.7-linux-glibc2.5-x86_64/* /usr/local/mysql/
chown -R mysql.mysql /usr/local/mysql/
# 環境變數
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
source /etc/profile
# 拷貝啟動腳本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
mkdir -p /var/lib/mysql-cluster
cat > /var/lib/mysql-cluster/config.ini <<'EOF'
[ndbd default]
NoOfReplicas=1
DataMemory=2048M
IndexMemory=512M
[tcp default]
[ndb_mgmd]
hostname=192.168.9.243
datadir=/var/lib/mysql-cluster
NodeId=1
[ndbd]
hostname=192.168.9.241
datadir=/u01/mysql/data
NodeId=2
[ndbd]
hostname=192.168.9.242
datadir=/u01/mysql/data
NodeId=3
[mysqld]
hostname=192.168.9.241
NodeId=4
[mysqld]
hostname=192.168.9.242
NodeId=5
EOF
# 啟動管理服務
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
驗證:ndb_mgm -e show 應顯示 2 個 Data Node、2 個 SQL Node 皆為 not connected, accepting connect。
cat > /etc/my.cnf <<'EOF'
[mysqld]
ndbcluster
basedir=/usr/local/mysql
datadir=/u01/mysql/data
port=3306
[mysql_cluster]
ndb-connectstring=192.168.9.243
EOF
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/u01/mysql/data --user=mysql
ndbd --initial
管理端 ndb_mgm -e show 應顯示對應 NodeId 狀態變為 starting 進而 Nodegroup: 0, *。
mysqld_safe --user=mysql &
管理端再次 show,SQL Node 應顯示 @IP (mysql-5.6.x ndb-7.3.x)。
# sqltest01 建表測試
mysql -uroot -p -e "
CREATE DATABASE mydb1;
USE mydb1;
CREATE TABLE mytb1 (id INT, birthdate DATETIME, pername CHAR(10)) ENGINE=NDBCLUSTER;
INSERT INTO mytb1 VALUES (1,'2013-01-23 09:45:10','pengzitong'),(2,'2007-07-09 09:45:10','pengzixin');
"
# sqltest02 驗證同步
mysql -uroot -p -e "USE mydb1; SELECT * FROM mytb1;"
兩節點資料一致,叢集部署成功。
# 管理節點關閉叢集
ndb_mgm -e shutdown
# 各 SQL Node 關閉 mysqld
mysqladmin -uroot -p shutdown
| 參數 | 建議值 | 說明 |
|---|---|---|
| DataMemory | 物理記憶體 60~70% | 存放資料與索引,預留 OS 與 ndbd 進程記憶體 |
| IndexMemory | DataMemory 10~15% | 哈希索引、有序索引記憶體 |
| MaxNoOfConcurrentOperations | 100000+ | 併發操作上限,防止「Too many active operations」 |
| RedoBuffer | 32M~64M | Redo log 緩衝,大事務需調大 |
| MaxNoOfExecutionThreads | CPU 核心數 (ndbmtd) | 多執行緒 Data Node 進程,利用多核 |
| HeartbeatIntervalDbDb | 1500 | 節點心跳間隔(ms),網路抖動環境可調大 |
| ArbitrationTimeout | 3000 | 仲裁超時(ms),避免腦裂誤判 |
# 線上備份(管理端)
ndb_mgm -e "START BACKUP 1" # 同步快照,備份編號 1
ndb_mgm -e "ABORT BACKUP 1" # 取消備份
# 恢復
ndb_restore -c 192.168.9.243 -n 2 -b 1 -r /u01/mysql/data/BACKUP/BACKUP-1
# -n: 目標 Data Node ID, -b: 備份編號, -r: 恢復路徑
[ndb_mgmd] 區塊)