InnoDB Cluster 与 NDB Cluster 对比及部署指南

InnoDB Cluster 与 NDB Cluster 对比及部署指南

一、核心区别对比

特性 InnoDB Cluster NDB Cluster
存储引擎 InnoDB NDB (内存优先)
架构设计 基于Group Replication 分布式架构(数据节点+管理节点+SQL节点)
一致性模型 最终一致性/强一致性 强一致性
数据持久化 磁盘存储为主 内存存储为主,定期快照
适用场景 通用OLTP 高吞吐实时处理
扩展性 垂直扩展为主 水平线性扩展
延迟 中等 极低
SQL功能支持 完整SQL支持 部分SQL功能限制

二、服务器部署步骤

InnoDB Cluster 部署

1. 环境准备(所有节点)
bash 复制代码
# 安装MySQL Server 8.0+
sudo apt-get install mysql-server mysql-shell -y

# 启动MySQL
sudo systemctl start mysql
2. 配置节点(所有节点)
bash 复制代码
# 编辑配置文件 /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
3. 初始化集群(第一个节点)
bash 复制代码
mysqlsh
\connect root@节点1IP:3306

# 在MySQL Shell中
dba.configureInstance('root@节点1IP:3306')
var cluster = dba.createCluster('myCluster')
4. 添加其他节点
javascript 复制代码
// 在MySQL Shell中
cluster.addInstance('root@节点2IP:3306')
cluster.addInstance('root@节点3IP:3306')
5. 部署MySQL Router(可选)
bash 复制代码
sudo apt-get install mysql-router -y
mysqlrouter --bootstrap root@集群任一节点IP:3306 --directory /opt/mysqlrouter
/opt/mysqlrouter/start.sh

NDB Cluster 部署

1. 环境准备
bash 复制代码
# 在所有节点安装
sudo apt-get install mysql-cluster -y
2. 管理节点配置(/etc/mysql-cluster/config.ini)
ini 复制代码
[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
3. 启动管理节点
bash 复制代码
ndb_mgmd -f /etc/mysql-cluster/config.ini
4. 启动数据节点
bash 复制代码
ndbd --initial
5. 启动SQL节点
bash 复制代码
systemctl start mysql
6. 验证集群
bash 复制代码
ndb_mgm
show

三、Docker部署步骤

InnoDB Cluster (Docker)

1. 创建网络
bash 复制代码
docker network create mysql-cluster-net
2. 启动第一个节点
bash 复制代码
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"
3. 初始化集群
bash 复制代码
docker exec -it mysql1 mysqlsh --uri root@localhost:3306
javascript 复制代码
// 在MySQL Shell中
dba.configureInstance('root@localhost:3306', {password: 'rootpass'})
dba.createCluster('myCluster')
4. 添加其他节点
bash 复制代码
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"
javascript 复制代码
// 在MySQL Shell中
cluster.addInstance('root@mysql2:3306', {password: 'rootpass'})

NDB Cluster (Docker)

1. 创建网络
bash 复制代码
docker network create ndb-cluster-net
2. 启动管理节点
bash 复制代码
docker run -d --name=ndb-mgmd --net=ndb-cluster-net \
  -v ./config.ini:/etc/mysql-cluster/config.ini \
  mysql/mysql-cluster ndb_mgmd
3. 启动数据节点
bash 复制代码
docker run -d --name=ndb1 --net=ndb-cluster-net \
  mysql/mysql-cluster ndbd
4. 启动SQL节点
bash 复制代码
docker run -d --name=mysql1 --net=ndb-cluster-net \
  -e MYSQL_ROOT_PASSWORD=rootpass \
  mysql/mysql-cluster mysqld
5. 验证集群
bash 复制代码
docker exec -it ndb-mgmd ndb_mgm
show

四、关键注意事项

  1. InnoDB Cluster:

    • 至少需要3个节点实现高可用
    • 确保节点间时间同步(NTP)
    • 生产环境建议配置MySQL Router
  2. NDB Cluster:

    • 需要至少2个数据节点实现冗余
    • 数据节点内存配置很关键(DataMemory参数)
    • 对网络延迟非常敏感
  3. Docker部署:

    • 生产环境建议使用固定IP或DNS名称
    • 数据卷应持久化到宿主机
    • 考虑资源限制(CPU/内存)

五、常用管理命令

InnoDB Cluster

bash 复制代码
# 查看集群状态
mysqlsh -e "dba.getCluster().status()"

# 故障转移
mysqlsh -e "dba.getCluster().forceQuorumUsingPartitionOf('root@主节点:3306')"

NDB Cluster

bash 复制代码
# 备份集群
ndb_mgm -e "start backup"

# 查看内存使用
ndb_mgm -e "all report memoryusage"

两种集群解决方案各有优势,InnoDB Cluster更适合传统OLTP场景,而NDB Cluster适合需要极高吞吐量和低延迟的特殊场景。

相关推荐
银发控、3 小时前
MySQL联合索引
数据库·mysql
予枫的编程笔记3 小时前
【MySQL修炼篇】从踩坑到精通:事务隔离级别的3大异常(脏读/幻读/不可重复读)解决方案
数据库·mysql·后端开发·数据库事务·事务隔离级别·rr级别·脏读幻读不可重复读
霖霖总总6 小时前
[小技巧60]深入解析 MySQL Online DDL:MySQL Online DDL、pt-osc 与 gh-ost 机制与最佳实践
数据库·mysql
怣508 小时前
[特殊字符] MySQL数据表操作完全指南:增删改查的艺术
数据库·mysql·adb
安然无虞9 小时前
「MongoDB数据库」初见
数据库·mysql·mongodb
Mr_Xuhhh9 小时前
MySQL视图详解:虚拟表的创建、使用与实战
数据库·mysql
AI_56789 小时前
MySQL索引优化全景指南:从慢查询诊断到智能调优
数据库·mysql
定偶10 小时前
MySQL多表连接查询详解
c语言·数据库·mysql
bamboolm10 小时前
java mysql 权限状态、流程问题
数据库·mysql
怣5010 小时前
MySQL排序分组限制:零基础速成语法(零基础入门版)
数据库·mysql