实验需求:部署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库。