[toc]
1、简介
MySQL Cluster(MySQL集群)是一个高性能、可扩展、集群化数据库产品,其研发设计的初衷就是要满足许多行业里的最严酷应用要求。这些应用中经常要求数据库运行的可靠性要达到99.999%。
自从2004年开始MySQL Cluster发布以来,其新特性的变化就不断的被更新增强。这增加了MySQL Cluster在新的应用领域、市场、行业中的需求量。MySQL Cluster目前已经不仅仅应用于传统的传统的电信业务中,如HLR(Home Locator Registry)或 SLR( Subscriber Locator Registry),它还被广泛的应用在VOIP、网络计费、会议管理、电子商务网站、搜索引擎,甚至是传统的后台应用中。
c?o;kd&5YLDT
vTw8&01niyek
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
alter user user() identified by “123456789”;
特点:
- 高可用性:主服务器故障后可自动切换到后备服务器
- 可伸缩性:可方便通过脚本增加DB服务器
- 负载均衡:支持手动把某公司的数据请求切换到另外的服务器,可配置哪些公司的数据服务访问哪个服务器

2、搭建Mysql Cluster(基于阿里云内网部署,相同实例地区)
主要参考^2
MySQL结构,由3类节点(计算机或进程)组成,分别是:
- 管理节点:用于给整个集群其他节点提供配置、管理、仲裁等功能。
- 数据节点:MySQL Cluster的核心,存储数据、日志,提供数据的各种管理服务。
- SQL节点(API):用于访问MySQL Cluster数据,提供对外应用服务。
各个节点中安装路径必须相同,配置环境一直!!!
如果机器上安装了mysql-server,先卸载掉
首先删除mysql-server:
1
sudo apt-get remove mysql-*
然后清理残留的数据
1
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
它会跳出一个对话框,你选择yes就好了
服务器上搭建时,同一个区域中的服务器(配置使用内网搭建,速度快)
修改 vi /etc/hosts 的文件,使用内网的ip
1 | 172.16.184.33 slave1 |
- 在相应的主机中修改名称(或者是修改hosts的文件的名称,为了便于后期使用,建议修改名称)
1 | hostnamectl set-hostname master |
设置主机之间的相互免密登录(设置公钥)
下载安装包,下载网址^1

将压缩包移动到
/usr/local/mysql下,解压完成后,修改路径,每个节点都位于相同的路径下
集群默认端口为1186
2.1 安装配置管理节点(GMG)
- 上传并解压文件
1 | mkdir -p /usr/local/mysql (创建mysql目录) |
- 创建管理目录
1 | mkdir -p /var/log/mysql-cluster |
- 配置目录
1 | vi /etc/mysql-cluster/config.ini |
1 | [ndbd default] |
- 初始化管理节点
1 | /usr/local/mysql/mysql-cluster/bin/ndb_mgmd -f /etc/mysql-cluster/config.ini |
- 查看集群的状态
1 | /usr/local/mysql/mysql-cluster/bin/ndb_mgm |

发现管理节点已经启动,当数据节点以及SQL节点未启动时显示的是not connected
2.2 安装配置数据节点(NDB)
将下面配置同步到其余的配置数据节点中
- 上传并解压文件
1 | mkdir -p /usr/local/mysql (创建mysql目录) |
- 创建mysql用户并运行
1 | useradd -M -s /sbin/nologin mysql |
- 创建mysql目录并授权
1 | mkdir -p /etc/mysql |
- 配置数据节点
1 | vi /etc/mysql/my.cnf |
- 启动数据节点
1 | #只有当第一次的时候才有加 --intital 否则数据会丢 |
- 查看状态



2.3 安装配置SQL节点(NDB)
将下面配置同步到其余的安装配置SQL节点中
- 上传并解压文件
1 | mkdir -p /usr/local/mysql (创建mysql目录) |
- 创建mysql目录并授权
1 | mkdir -p /etc/mysql |
- 创建SQL节点配置文件
1 | vi /etc/mysql/my.cnf |
1 | [mysqld] |
- 配置mysql服务
1 | cp /usr/local/mysql/mysql-cluster/support-files/mysql.server /etc/init.d/mysqld |
- 编辑mysqld服务
1 | vi /etc/init.d/mysqld |

1 | basedir=/usr/local/mysql/mysql-cluster |
- 初始化mysql数据库
进入到 /usr/local/mysql/mysql-cluster/bin
1 | #执行完命令 记得保存一下随机产生的密码 |
Slave3(保存随机产生的密码)

Slave4(保存随机产生的密码)

- 启动mysql服务
1 | systemctl daemon-reload |
Slave3,发现已经启动了mysql的3306端口,出现红色的警告,可以使用systemctl daemon-reload尝试解决下,下面的截图是没有加systemctl daemon-reload的,但是还是可以正常启动

Slave4,发现已经启动了mysql的3306端口

2.4 集群状态
进入到
1 | cd /usr/local/mysql/mysql-cluster/bin |
进入下面界面使用show可查看到5个节点全部启动,说明搭建完成!!!

3、操作Mysql Cluster
- 在SQL节点(slave3,slave4)中使用操作数据库,输入前面保存的随机密码进入数据库中
1 | cd /usr/local/mysql/mysql-cluster/bin |
操作数据库
在使用命令之前需要先修改数据库的密码后进行操作,否则将会出现下面的错误

使用下面命令修改密码为123456789
1
alter user user() identified by "123456789";

创建数据库
在slave3中创建
mytest数据库
登录slave4中的数据库同时也修改密码,然后查看数据库时发现
mytest数据库同步创建
创建数据表并添加数据
添加 ==engine=ndbcluster 或者是 engine=ndb(mysql cluster集群只能同步ndb引擎的表==)
1
2create table sys_myfirst(id varchar(36) primary key, name varchar(100), memo varchar(255)) ENGINE=innodb DEFAULT CHARSET=utf8 engine=ndbcluster;
Query OK, 0 rows affected, 1 warning (0.42 sec)slave3中创建数据表,并添加两条数据

slave4中可查看到slave3中创建的表与数据

4、MySQL Cluster的关闭顺序与单点故障测试
关闭顺序:SQL节点->数据节点->管理节点(在MySQL Cluster环境中,NDB节点和管理节点的关闭都可以在管理节点的管理程序中完成,也可以分节点关闭,但是SQL节点却没办法。所以,在关闭整个MySQL Cluster环境或者关闭某个SQL节点的时候,首先必须到SQL节点主机上来关闭SQL节点程序。关闭方法和MySQL Server的关闭一样。)
SQL节点关闭
systemctl stop mysqld1
2
3
4
5
6
7
8
9
10root@slave3:/usr/local/mysql/mysql-cluster/bin# lsof -i:3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 1319 mysql 40u IPv6 24436 0t0 TCP *:mysql (LISTEN)
root@slave3:/usr/local/mysql/mysql-cluster/bin# systemctl stop mysqld
Warning: The unit file, source configuration file or drop-ins of mysqld.service changed on disk. Run 'systemctl daemon-reload' to reload units.
root@slave3:/usr/local/mysql/mysql-cluster/bin# lsof -i:3306
root@slave3:/usr/local/mysql/mysql-cluster/bin# systemctl start mysqld
Warning: The unit file, source configuration file or drop-ins of mysqld.service changed on disk. Run 'systemctl daemon-reload' to reload units.
###或者在/etc/init.d中使用
root@slave4:/etc/init.d# ./mysqld stop数据节点(NDB)关闭

1
2
3
4
5
6
7cd /usr/local/mysql/mysql-cluster/bin
./ndbd stop
2018-01-16 18:30:51 [ndbd] INFO -- Angel connected to '192.168.0.30:1186'
2018-01-16 18:30:51 [ndbd] INFO -- Angel allocated nodeid: 2
#或者使用pkill -9 ndbd
#启动使用(不需要加--initial)
./ndbd管理节点关闭(关闭管理节点后会一起关闭数据节点)

1
2
3
4
5
6
7
8
9ndb_mgm> shutdown
Node 2: Cluster shutdown initiated
Node 3: Cluster shutdown initiated
3 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
Node 3: Node shutdown completed.
ndb_mgm>
#或者使用
/usr/local/mysql/mysql-cluster/bin# ./ndb_mgm -e shutdown
5、Mysql Cluster 远程连接
该表法
1
2
3
4
5use mysql;
select host, user from user;
update user set host = '%' where user = 'root';
select host, user from user;
#修改完以后重启mysql
授权法
1
2GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456789' WITH GRANT OPTION;
FLUSH PRIVILEGES #使修改生效,就可以了
6、测试单点故障(高可用)
- 当停止掉两台数据节点中的一台节点时,使用SQL节点进行操作,可以正常操作
- 当停止掉两台SQL节点中的一台节点时,使用另一台SQL节点进行操作,也可以正常操作
- 当分别停止掉两台数据节点和两台SQL节点中的一台节点时,只留一台SQL节点与一台数据节点,同样可以正常服务
7、SpringBoot中使用
springboot jpa连接mysql数据库集群(NDBCLUSTER)引擎设置^6
主要参考:Spring Boot MyBatis 数据库集群访问实现 ^7
