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)"
- 第3步,所有节点:下载安装 mysql-cluster 8.0.47
注:请按照顺序安装,安装过程会创建 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
