实验需求:部署MySQL集群,减少数据库单点故障。
实验方案:准备5台服务器,mgmd(192.168.100.1)作为管理节点,sqlA(192.168.100.2)和sqlB(192.168.100.3)作为SQL节点,ndbA(192.168.100.4)和ndbB(192.168.100.5)作为数据节点,这5个节点构成MySQL Cluster体系
实施过程:
一.公共配置
1.所有节点上安装MySQL集群软件
1.1所有节点卸载冲突包
官方提供的MySQL-Cluster相关软件包已集成数据库服务端/客户端程序,因此可直接用来替换普通的MySQL服务端/客户端程序。如果已安装有普通版的mysql-server、mysql、MySQL-server、MySQL-client包,请先将其卸载(若没有则忽略):
# service mysql stop
# chkconfig mysql off
# rpm -e --nodeps MySQL-server MySQL-client MySQL-shared MySQL-embedded MySQL-test MySQL-devel
1.2清理残余配置文件
mv /etc/my.cnf /etc/my.cnf.bak
useradd mysql
1.3 所有节点安装MySQL-Cluster相关软件包
# tar xvf MySQL-Cluster-gpl-7.3.3-1.el6.x86_64.rpm-bundle.tar
MySQL-Cluster-shared-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-shared-compat-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-server-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-client-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-test-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-devel-gpl-7.3.3-1.el6.x86_64.rpm
MySQL-Cluster-embedded-gpl-7.3.3-1.el6.x86_64.rpm
rpm -Uvh MySQL-Cluster-*.rpm
2.在SQL节点(sqlA、sqlB)服务器上,修改MySQL数据库的root密码
3.SQL节点添加授权数据库用户,方便客户端访问
mysql>grant all on*.*to'root'@'192.168.100.%'identifiedby'123456';
二.配置管理节点 mgmd (192.168.100.1)
1.创建工作文件夹
# mkdir -p /var/log/mysql-cluster
2.创建配置文件
[ndbd default]:为所有的数据节点指定默认配置。
[ndbd]:指定某一个数据节点的配置。
[ndb_mgmd default]:为所有的管理节点指定默认配置。
[ndb_mgmd]:指定某一个管理节点的配置。
[mysqld default]:为所有的SQL节点指定默认配置。
[mysqld]:指定某一个SQL节点的配置。
# vim /etc/config.ini
[ndbd default]
NoOfReplicas=2//保留2份数据拷贝
DataMemory=80M //数据缓存大小
IndexMemory=18M //索引缓存大小
[ndb_mgmd]
nodeid=1//第1个管理节点的ID号
hostname=192.168.100.1//此管理节点的地址
datadir=/var/log/mysql-cluster //此管理节点的工作目录
[mysqld]
nodeid=2//第1个SQL节点的ID号
hostname=192.168.100.2 //第1个SQL节点的地址
[mysqld]
nodeid=3//第2个SQL节点的ID号
hostname=192.168.100.3 //第2个SQL节点的地址
[ndbd]
nodeid=4//第1个数据节点的ID号
hostname=192.168.100.4 //第1个数据节点的地址
datadir=/mysql-cluster/data //第1个数据节点的工作目录,需创建
[ndbd]
nodeid=5//第2个数据节点的ID号
hostname=192.168.100.5//第2个数据节点的地址
datadir=/mysql-cluster/data //第2个数据节点的工作目录,需创建
三.配置数据节点 ndbA(192.168.100.4) 、ndbB (192.168.100.5)
1.创建工作文件夹
# mkdir -p /mysql-cluster/data
2.创建配置文件
# vim /etc/my.cnf
[mysqld]
datadir=/mysql-cluster/data //指定数据存储目录
ndb-connectstring=192.168.100.1 //要连接的管理服务器的IP地址
ndbcluster //指定运行的存储引擎
[mysql_cluster] //集群连接配置段
ndb-connectstring=192.168.100.1
四.配置SQL节点sqlA(192.168.100.2) 、sqlB (192.168.100.3)
在MySQL-Cluster集群环境中,若某个数据库未采用ndbcluster引擎(而是InnoDB、MyISAM等其他引擎),则当更新数据库表时,可能无法同步到其他节点。
# vim /etc/my.cnf
ndbcluster //指定运行的存储引擎
default-storage-engine=ndbcluster //设置默认存储引擎
[mysql_cluster] //集群连接配置段
ndb-connectstring=192.168.100.1
五.启动MySQL集群
正确的启动顺序:管理节点 --> 数据节点 --> SQL节点。
关闭顺序:SQL节点 --> 数据节点 --> 管理节点。
数据节点、SQL节点都正常运行后,理论上管理节点可关闭(无监控等任务的话)。
1.启动管理节点mgmd
# ndb_mgmd -f /etc/config.ini //启动管理节点,-f指定集群配置文件
关于管理节点的启动,有以下几个需要注意的地方:
ndb_mgmd默认以后台模式运行(--daemon),调试过程中可添加选项--nodaemon来禁用后台模式。
ndb_mgmd初次启动成功以后,会自动保存集群配置,以后再启动时会忽略-f指定的配置文件,除非添加--inital选项(比如向集群中添加新的节点时,就应该重新初始化)。
若希望每次开机后自动运行ndb_mgmd,可将上述启动操作写入到/etc/rc.local配置文件内,例如:
# vim /etc/rc.local
....
ndb_mgmd -f /etc/config.ini
启动完成后可查看监听状态:
# netstat -tuanlp | grep ndb
确认自动保存的集群配置数据:
# ls -lh /usr/mysql-cluster/ndb_1_config.bin.1
-rw-r--r--.1 root root 4.1K 12月 2417:52/usr/mysql-cluster/ndb_1_config.bin.1
查看日志文件相关数据:
# ls /var/log/mysql-cluster/
ndb_1_cluster.log ndb_1_out.log ndb_1.pid
2.启动数据节点ndbA、ndbB
MySQL Cluster数据节点的对应服务程序为ndbd(单线程的)、ndbmtd(多线程的),首次启动或重新初始化时加 --initial选项,以后不用加。
# ndbd --initial //启动数据节点
在ndbA和ndbB服务器上,修改/etc/rc.local配置文件,以便每次开机后能自动启动数据节点服务:
# vim /etc/rc.local
....
ndbd
3.启动SQL节点sqlA、sqlB
对于MySQL Cluster的SQL节点来说,对应的服务程序就是mysqld,正常通过mysql脚本重新启动服务就可以了。
# service mysql restart
# chkconfig mysql on
4.在管理节点mgmd上查看群集状态
直接执行ndb_mgm可进入群集管理环境:
# ndb_mgm
ndb_mgm>
进入ndb_mgm> 环境后,执行SHOW可查看当前各节点的状态,确保本例中的5个节点都已经成功连接;
ndb_mgm> SHOW
六.MySQL集群的高可用性测试
1.数据同步测试
从客户机访问sqlA,执行写数据库、表相关操作:
# mysql -u root -p -h 192.168.100.2
mysql> create database mycluster;
mysql> create table mycluster.a(id int(3));
mysql> insert into mycluster.a values(123),(456); //插入测试记录
然后从客户机访问sqlB,确认结果(能看到从sqlA上所建的库、表、表记录):
# mysql -u root -p -h 192.168.100.3
mysql> select * from mycluster.a; //查看表记录也一致
2.高可用性测试(关闭一台数据节点)
关闭数据节点ndbA上的ndbd进程:
# killall -9 ndbd //暴力结束ndbd进程
# netstat -tulanp | grep ndbd //确认已结束
此时从管理节点上查看集群状态,会发现ndbA已断开连接:
ndb_mgm> show
然后从客户机访问sqlA或sqlB,仍然可读、写数据库。比如可向mycluster.a表中再添加一条记录:
mysql> insert into mycluster.a values(789); //添加一条表记录
以上测试成立说明:只要还有一台数据节点可用,MYSQL数据库整体就仍然可用。
接下来可进一步验证故障恢复过程 —— 重新启动ndbA上的ndbd服务进程,稍待片刻后强制关闭ndbB上的ndbd服务进程。然后再次访问sqlA或sqlB节点,查询mycluster.a表的记录,发现与前面添加的结果一致:
mysql> select * from mycluster.a; //确认结果
以上测试成立说明:因故障中断的数据节点(ndbA)恢复后,会立即从正常的数据节点(ndbB)同步数据,确保数据一致性。
3.高可用性测试(关闭一台SQL节点)
当MySQL集群内有多个SQL节点时,只要有一台SQL节点可用,就可以通过它来访问MySQL数据库中保存的表数据。
关闭sqlA、sqlB中的任何一台以后,还可以通过另外一台来访问mycluster库。