MySQL NDB Cluster 8.0 分布式集群搭建实战

MySQL NDB Cluster 是一个基于NDB存储引擎的分布式数据库集群,它采用 Shared-Nothing 架构,由SQL节点、数据节点和管理节点组成,数据自动在多台数据节点间同步复制,无单点故障,支持自动故障转移,支持数据节点的横向扩展以提升读写性能,且数据既可存储在内存中(追求极速),也可落盘(应对大数据量),同时保持ACID事务和JOIN等关系型数据库特性。适合高并发、低延迟的实时应用,如电信、金融、游戏等对可用性和吞吐量要求极高的场景。

搭建 NDB Cluster 集群

  • 资源规划:
ip地址 主机名 os版本 mysql版本 服务端口 角色
192.168.31.101 ndb101 Oracle Linux 8.9 - 1186(默认) 管理节点
192.168.31.102 ndb102 Oracle Linux 8.9 - 2202(自定义) 数据节点
192.168.31.103 ndb103 Oracle Linux 8.9 - 2202(自定义) 数据节点
192.168.31.104 ndb104 Oracle Linux 8.9 8.0.47 3306 SQL节点
192.168.31.105 ndb105 Oracle Linux 8.9 8.0.47 3306 SQL节点
  • 网络拓扑图:

1.准备工作

  • 第1步,所有节点:初始化工作
#.配置DNS和时区
cat /etc/resolv.conf | grep "^nameserver" || echo "nameserver 223.5.5.5" > /etc/resolv.conf
timedatectl set-timezone Asia/Shanghai

#.配置阿里云的yum源
curl -sL 'http://iso.sqlfans.cn/config/linux_change_repo.sh' | bash

#.时间同步
yum install -y -q chrony
systemctl start chronyd
systemctl enable chronyd
chronyc -a makestep
date

#.关闭iptables及防火墙
iptables -F
systemctl stop firewalld.service
systemctl disable firewalld.service

#.更改机器名
newhost=`ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tail -1|awk -F'.' '{print "ndb"$4}'`
hostnamectl set-hostname $newhost

#.修改hosts
cat /etc/hosts | grep "192.168.31.101" > /dev/null || echo "192.168.31.101 ndb101" >> /etc/hosts
cat /etc/hosts | grep "192.168.31.102" > /dev/null || echo "192.168.31.102 ndb102" >> /etc/hosts
cat /etc/hosts | grep "192.168.31.103" > /dev/null || echo "192.168.31.103 ndb103" >> /etc/hosts
cat /etc/hosts | grep "192.168.31.104" > /dev/null || echo "192.168.31.104 ndb104" >> /etc/hosts
cat /etc/hosts | grep "192.168.31.105" > /dev/null || echo "192.168.31.105 ndb105" >> /etc/hosts
cat /etc/hosts | grep "ndb"

#.关闭SELinux
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0
  • 第2步,所有节点:卸载系统默认安装的mysql与mariadb(如果有)以避免冲突
rpm -qa | egrep "(mariadb|mysql)"

注:请按照顺序安装,安装过程会创建 mysql 用户

#.开始下载
cd /opt/
wget -c https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-icu-data-files-8.0.47-1.el8.x86_64.rpm
wget -c https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-common-8.0.47-1.el8.x86_64.rpm
wget -c https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-client-plugins-8.0.47-1.el8.x86_64.rpm
wget -c https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-libs-8.0.47-1.el8.x86_64.rpm
wget -c https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-client-8.0.47-1.el8.x86_64.rpm
wget -c https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-server-8.0.47-1.el8.x86_64.rpm

#.开始安装
yum install -y -q perl
rpm -ivh mysql-cluster-community-icu-data-files-8.0.47-1.el8.x86_64.rpm
rpm -ivh mysql-cluster-community-common-8.0.47-1.el8.x86_64.rpm
rpm -ivh mysql-cluster-community-client-plugins-8.0.47-1.el8.x86_64.rpm
rpm -ivh mysql-cluster-community-libs-8.0.47-1.el8.x86_64.rpm
rpm -ivh mysql-cluster-community-client-8.0.47-1.el8.x86_64.rpm
rpm -ivh mysql-cluster-community-server-8.0.47-1.el8.x86_64.rpm

#.创建目录
mkdir -p /data/mysql_cluster/data

2.配置管理节点

  • 第4步,管理节点(ndb101):特别安装如下组件
cd /opt/
wget -c https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-management-server-8.0.47-1.el8.x86_64.rpm
rpm -ivh mysql-cluster-community-management-server-8.0.47-1.el8.x86_64.rpm
  • 第5步,管理节点(ndb101):修改配置文件

注:请根据实际情况调整副本数、内存大小等

cat > /data/mysql_cluster/config.ini <<EOF
[ndbd default]
NoOfReplicas=2                     #.副本数,有几个数据节点就配置几份
DataMemory=2048M                   #.数据节点给数据分配的内存

[ndb_mgmd]
NodeId=1
Hostname=192.168.31.101            #.管理节点的IP地址
DataDir=/data/mysql_cluster/data   #.管理节点的数据及日志目录

[ndbd]
NodeId=2
Hostname=192.168.31.102            #.数据节点的IP地址
ServerPort=2202                    #.数据节点的默认连接端口
IndexMemory=2048M                  #.数据节点给索引分配的内存
DataDir=/data/mysql_cluster/data   #.数据节点的数据目录

[ndbd]
NodeId=3
Hostname=192.168.31.103            #.数据节点的IP地址
ServerPort=2202                    #.数据节点的默认连接端口
IndexMemory=2048M                  #.数据节点给索引分配的内存
DataDir=/data/mysql_cluster/data   #.数据节点的数据目录

[mysqld]
NodeId=4
Hostname=192.168.31.104            #.SQL节点的IP地址

[mysqld]
NodeId=5
Hostname=192.168.31.105            #.SQL节点的IP地址
EOF
  • 第6步,管理节点(ndb101):启动服务

注:管理节点只需要3个文件:ndb_mgmd、ndb_mgm、配置文件

#.启动服务
/usr/sbin/ndb_mgmd -f /data/mysql_cluster/config.ini

#.确认端口已监听
netstat -lnpt | grep ndb_mgmd

#.加入开机启动
cat /etc/rc.local | grep ndb_mgmd || echo "/usr/sbin/ndb_mgmd -f /data/mysql_cluster/config.ini" >> /etc/rc.local

#.查看集群状态, 此时其他节点状态 accepting
[root@ndb101 ~]# /usr/bin/ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2 (not connected, accepting connect from 192.168.31.102)
id=3 (not connected, accepting connect from 192.168.31.103)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.31.101  (mysql-8.0.47 ndb-8.0.47)

[mysqld(API)]   2 node(s)
id=4 (not connected, accepting connect from 192.168.31.104)
id=5 (not connected, accepting connect from 192.168.31.105)

#.持续查看日志
tail -f /data/mysql_cluster/data/ndb_1_cluster.log

3.配置数据节点

  • 第7步,数据节点(ndb102/ndb103):特别安装如下组件
cd /opt/
wget -c https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-data-node-8.0.47-1.el8.x86_64.rpm
rpm -ivh mysql-cluster-community-data-node-8.0.47-1.el8.x86_64.rpm
  • 第8步,数据节点(ndb102/ndb103):修改配置文件

注:如果有多个管理节点则用逗号分割,比如:ndb-connectstring=192.168.31.101:1186, 192.168.32.101:1186

cat > /etc/my.cnf <<EOF
[mysqld]
datadir=/data/mysql_cluster/data
socket=/data/mysql_cluster/data/mysql.sock
log-error=/data/mysql_cluster/data/mysqld.log
pid-file=/data/mysql_cluster/data/mysqld.pid

ndbcluster                                       #.启用NDB存储引擎
ndb-connectstring=192.168.31.101:1186            #.SQL节点连接的管理节点

[mysql_cluster]
ndb-connectstring=192.168.31.101:1186            #.客户端工具连接的管理节点
EOF
  • 第9步,数据节点(ndb102/ndb103):启动服务
#.启动服务
/usr/sbin/ndbd

#.确认端口已监听
netstat -lnpt | grep ndbd

#.加入开机启动
cat /etc/rc.local | grep ndbd || echo "/usr/sbin/ndbd" >> /etc/rc.local

#.查看日志
tail -n 200 /data/mysql_cluster/data/ndb_*_out.log

4.配置SQL节点

  • 第10步,SQL节点(ndb104/ndb105):修改配置文件

注:如下示例只配置了几个核心的参数,更多参数请自行完善并优化

cat > /etc/my.cnf <<EOF
[mysqld]
port=3306
datadir=/data/mysql_cluster/data
socket=/data/mysql_cluster/data/mysql.sock
log-error=/data/mysql_cluster/data/mysqld.log
pid-file=/data/mysql_cluster/data/mysqld.pid

ndbcluster                                       #.启用NDB存储引擎
default_storage_engine=ndbcluster                #.指定默认的存储引擎
ndb-connectstring=192.168.31.101:1186            #.SQL节点连接的管理节点

[mysql_cluster]
ndb-connectstring=192.168.31.101:1186            #.客户端工具连接的管理节点
EOF
  • 第11步,SQL节点(ndb104/ndb105):启动服务
#.启动服务
systemctl restart mysqld
systemctl status mysqld

#.确认端口已监听
netstat -lnpt | grep mysqld

#.查看日志
tail -n 200 /data/mysql_cluster/data/mysqld.log

5.客户端管理

  • 第12步,管理节点(ndb101):查看集群状态
#.查看集群状态
[root@ndb101 ~]# /usr/bin/ndb_mgm -e show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.31.102  (mysql-8.0.47 ndb-8.0.47, Nodegroup: 0, *)
id=3    @192.168.31.103  (mysql-8.0.47 ndb-8.0.47, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.31.101  (mysql-8.0.47 ndb-8.0.47)

[mysqld(API)]   2 node(s)
id=4    @192.168.31.104  (mysql-8.0.47 ndb-8.0.47)
id=5    @192.168.31.105  (mysql-8.0.47 ndb-8.0.47)

测试验证

  • 第1步,SQL节点(ndb104/ndb105):登录任一节点,新建管理员账号,示例 dba_admin 密码 cf_rB1NKCzbaQuPH

注:在任一SQL节点新建的管理员账号,会自动同步到其他SQL节点(其他SQL节点不用再执行下面这一段)

passwd=`cat /data/mysql_cluster/data/mysqld.log |grep "temporary password"|tail -1|cut -d' ' -f13`
echo $passwd
mysql --connect-expired-password -uroot --socket=/data/mysql_cluster/data/mysql.sock -p$passwd -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin_147';"
mysql --connect-expired-password -uroot --socket=/data/mysql_cluster/data/mysql.sock -pAdmin_147 -e"CREATE USER 'dba_admin'@'%' IDENTIFIED with mysql_native_password BY 'cf_rB1NKCzbaQuPH';"
mysql --connect-expired-password -uroot --socket=/data/mysql_cluster/data/mysql.sock -pAdmin_147 -e"GRANT ALL PRIVILEGES ON *.* TO 'dba_admin'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h127.0.0.1 -e"select user,host from mysql.user;"
  • 第2步,登录任一节点,验证分布式NDB引擎,确认 ndbcluster 引擎表在所有SQL节点都存在
#.登录SQL节点1:验证ndbcluster引擎
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.104 -e"create database if not exists xxx_001;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.104 -e"create table if not exists xxx_001.tab_001(id int) ENGINE=NDBCLUSTER;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.104 -e"insert into xxx_001.tab_001(id) values (1);"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.104 -e"select * from xxx_001.tab_001;"

#.登录SQL节点2:若数据已同步, 则表示NDB表数据存在在2个数据节点上
[root@ndb102 ~]# mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.105 -e"select * from xxx_001.tab_001;"
+------+
| id   |
+------+
|    1 |
+------+
  • 第3步,登录任一节点,验证InnoDB引擎,确认 InnoDB 引擎表只存在原始创建的SQL节点,另外一个SQL节点不存在
#.登录SQL节点2:创建库,创建innodb表
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.105 -e"create database if not exists xxx_002;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.105 -e"create table if not exists xxx_002.tab_002(id int) ENGINE=INNODB;"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.105 -e"insert into xxx_002.tab_002(id) values (2);"
mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.105 -e"select * from xxx_002.tab_002;"

#.登录SQL节点1:库存在,但表不存在
[root@ndb102 ~]# mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.104 -e"show databases like 'xxx%';" --skip-column-names
+-----------------+
| xxx_001         |
| xxx_002         |
+-----------------+
[root@ndb102 ~]# mysql -udba_admin -pcf_rB1NKCzbaQuPH -h192.168.31.104 -e"select * from xxx_002.tab_002;"
ERROR 1146 (42S02) at line 1: Table 'xxx_002.tab_002' doesn't exist

附录

  • MySQL Cluster 集群的停止顺序,参考如下:
#.管理节点:执行shutdown会停止管理节点和数据节点的服务, 但SQL节点不会关闭, 需手工关闭
/usr/bin/ndb_mgm -e shutdown
netstat -lnpt | grep ndb_mgmd

#.SQL节点:停止mysql服务
systemctl stop mysqld
netstat -lnpt | grep mysqld
  • MySQL Cluster 集群的启动顺序:管理节点 -> 数据节点 -> SQL节点
#.管理节点
/usr/sbin/ndb_mgmd -f /data/mysql_cluster/config.ini
netstat -lnpt | grep ndb_mgmd

#.数据节点
/usr/sbin/ndbd
netstat -lnpt | grep ndbd

#.SQL节点
systemctl start mysqld
netstat -lnpt | grep mysqld

#.确认集群状态
/usr/bin/ndb_mgm -e show
  • 对整个NDB Cluster发起一次在线热备份
#.管理节点
[root@ndb101 ~]# ndb_mgm
ndb_mgm> start backup;
ndb_mgm> exit
Copyright © www.sqlfans.cn 2021 - 2026 All Right Reserved更新时间: 2026-07-24 16:20:12

results matching ""

    No results matching ""