特性 | InnoDB Cluster | NDB Cluster |
---|---|---|
存储引擎 | InnoDB | NDB (内存优先) |
架构设计 | 基于Group Replication | 分布式架构(数据节点+管理节点+SQL节点) |
一致性模型 | 最终一致性/强一致性 | 强一致性 |
数据持久化 | 磁盘存储为主 | 内存存储为主,定期快照 |
适用场景 | 通用OLTP | 高吞吐实时处理 |
扩展性 | 垂直扩展为主 | 水平线性扩展 |
延迟 | 中等 | 极低 |
SQL功能支持 | 完整SQL支持 | 部分SQL功能限制 |
# 安装MySQL Server 8.0+
sudo apt-get install mysql-server mysql-shell -y
# 启动MySQL
sudo systemctl start mysql
# 编辑配置文件 /etc/mysql/my.cnf
[mysqld]
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=OFF
group_replication_local_address= "当前节点IP:33061"
group_replication_group_seeds= "节点1IP:33061,节点2IP:33061,节点3IP:33061"
server_id=1 # 每个节点唯一
log_bin=mysql-bin
binlog_format=ROW
mysqlsh
\connect root@节点1IP:3306
# 在MySQL Shell中
dba.configureInstance('root@节点1IP:3306')
var cluster = dba.createCluster('myCluster')
// 在MySQL Shell中
cluster.addInstance('root@节点2IP:3306')
cluster.addInstance('root@节点3IP:3306')
sudo apt-get install mysql-router -y
mysqlrouter --bootstrap root@集群任一节点IP:3306 --directory /opt/mysqlrouter
/opt/mysqlrouter/start.sh
# 在所有节点安装
sudo apt-get install mysql-cluster -y
[ndb_mgmd]
hostname=管理节点IP
datadir=/var/lib/mysql-cluster
[ndbd default]
noofreplicas=2
datadir=/var/lib/mysql-cluster
[ndbd]
hostname=数据节点1IP
[ndbd]
hostname=数据节点2IP
[mysqld]
hostname=SQL节点1IP
[mysqld]
hostname=SQL节点2IP
ndb_mgmd -f /etc/mysql-cluster/config.ini
ndbd --initial
systemctl start mysql
ndb_mgm
show
docker network create mysql-cluster-net
docker run -d --name=mysql1 --net=mysql-cluster-net \
-e MYSQL_ROOT_PASSWORD=rootpass \
-v mysql1-data:/var/lib/mysql \
mysql:8.0 \
--server-id=1 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--gtid-mode=ON \
--enforce-gtid-consistency=ON \
--plugin-load=group_replication.so \
--group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" \
--group_replication_start_on_boot=OFF \
--group_replication_local_address="mysql1:33061" \
--group_replication_group_seeds="mysql1:33061,mysql2:33061,mysql3:33061"
docker exec -it mysql1 mysqlsh --uri root@localhost:3306
// 在MySQL Shell中
dba.configureInstance('root@localhost:3306', {password: 'rootpass'})
dba.createCluster('myCluster')
docker run -d --name=mysql2 --net=mysql-cluster-net \
-e MYSQL_ROOT_PASSWORD=rootpass \
-v mysql2-data:/var/lib/mysql \
mysql:8.0 \
--server-id=2 \
--log-bin=mysql-bin \
--binlog-format=ROW \
--gtid-mode=ON \
--enforce-gtid-consistency=ON \
--plugin-load=group_replication.so \
--group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" \
--group_replication_start_on_boot=OFF \
--group_replication_local_address="mysql2:33061" \
--group_replication_group_seeds="mysql1:33061,mysql2:33061,mysql3:33061"
// 在MySQL Shell中
cluster.addInstance('root@mysql2:3306', {password: 'rootpass'})
docker network create ndb-cluster-net
docker run -d --name=ndb-mgmd --net=ndb-cluster-net \
-v ./config.ini:/etc/mysql-cluster/config.ini \
mysql/mysql-cluster ndb_mgmd
docker run -d --name=ndb1 --net=ndb-cluster-net \
mysql/mysql-cluster ndbd
docker run -d --name=mysql1 --net=ndb-cluster-net \
-e MYSQL_ROOT_PASSWORD=rootpass \
mysql/mysql-cluster mysqld
docker exec -it ndb-mgmd ndb_mgm
show
InnoDB Cluster:
NDB Cluster:
Docker部署:
# 查看集群状态
mysqlsh -e "dba.getCluster().status()"
# 故障转移
mysqlsh -e "dba.getCluster().forceQuorumUsingPartitionOf('root@主节点:3306')"
# 备份集群
ndb_mgm -e "start backup"
# 查看内存使用
ndb_mgm -e "all report memoryusage"
两种集群解决方案各有优势,InnoDB Cluster更适合传统OLTP场景,而NDB Cluster适合需要极高吞吐量和低延迟的特殊场景。