构建MySQL-Cluster集群
MySQL集群作用:解决MySQL代理服务器的缺点单点故障和数据备份
结构图如下:
使用6台RHEL6.4虚拟机,如图所示sqlA和sqlB作为SQL节点,ndbA和ndbB作为数据节点,mgmd作为管理节点,这5个节点构成MySQLCluster体系;而另一台虚拟机192.168.4.120作为MySQL测试客户机。
角色说明:
客户端(client) :访问集群主机
管理集群的主机(mgmd):管理集群中所有主机,加载自己的主配置文件,设置集群中所有主机的角色
SQL结点(sql) :供用户访问和执行SQL语句,存储表结构(2台以上)
数据结点(ndbd节点) :存储表中的记录(2台以上)
MySQL集群提供三进程:
mgmd 管理进程 运行在管理机上 config.ini
mysqld 数据库服务 运行在sql节点上 /etc/my.cnf
ndbd 数据存储服务 运行在ndbd节点 /etc/my.cnf
1、公共配置(要保留RHEL自带的mysql-libs包)
A、关闭防火墙、selinux,停止mysql数据库服务,移走配置文件/etc/my.cnf
B、卸载冲突的软件包(所有节点)
# rpm -qa | grep -i mysql //查看原有的mysql包
# yum -y remove .....
C、安装集群软件(所有节点)
# tar -xf MySQL-Cluster-gpl-7.3.3-1.el6.x86_64.rpm-bundle.tar
# rpm -Uvh MySQL-Cluster-*.rpm //默认路径/var/lib/mysql
# rpm -qa | grep MySQL-Cluster
D、修改密码
# cat /root/.mysql_secret
# the root user at Tue Dec24 15:24:50 2013 (local time): Z3Qw2OWJ
# mysql -u root -p Z3Qw2OWJ
mysql> SET PASSWORD FOR 'root'@'localhost'=PASSWORD('123');
2、配置管理主机mgm
启动管理进程时,调用配置文件/etc/my-cluster.ini,知道集群中主机的角色(配置文件要自己编辑,不允许有空行)
# mkdir -p /var/log/mysql-cluster //创建工作文件夹
# vim /etc/my-cluster.ini
[ndbd default] //定义数据结点的公共配置 NoOfReplicas=2 //指定一份数据备份几份(数据结点数或能被数据节点数整除)
DataMemory=80M //数据内存(保存用户执行过的SQL语句和查询结果,通常是物理内存的1/3) IndexMemory=18M //保存索引的内存 [ndb_mgmd] //指定管理主机 nodeid=1 //指定编号(管理标识),值不允许重复 hostname=192.168.4.100 //管理主机的IP datadir=/var/log/mysql-cluster //路径在mgm上,用于存放集群中主机的信息,路径需自己创建 [ndbd] //指定数据结点1
nodeid =30 hostname=192.168.4.30 //数据结点的IP Datadir=/var/lib/mysql-cluster/data //路径在数据结点上要存在,该目录用于存放表中的记录 [ndbd] //指定数据结点2
nodeid =40 hostname=192.168.4.40 Datadir=/var/lib/mysql-cluster/data [mysqld] //指定sql结点1
nodeid =10 hostname=192.168.4.10 //sql结点的IP [mysqld] //指定sql结点2 nodeid =20 hostname=192.168.4.20
3、配置数据结点ndb(在 .30 .40上操作)
1)创建存储表中记录的目录
# mkdir -p /var/lib/mysql-cluster/data
2)编辑配置文件/etc/my.cnf(与mysqld的主配置文件同名)
若原来已存在my.cnf文件,则先做改名
# mv /etc/my.cnf /etc/my.cnf.bak
# vi /etc/my.cnf [mysqld] //设置数据结点 datadir=/var/lib/mysql-cluster/data //将记录存储在本机的哪个目录下,与管理主机上的设置一致 ndb-connectstring=192.168.4.100 //管理主机的IP
ndbcluster //指定运行的存储引擎
[mysql_cluster] //设置管理集群的主机
ndb-connectstring=192.168.4.100 //管理主机的IP
4、配置SQL结点sql (在.10 .20上操作)
1)编辑配置文件/etc/my.cnf
# mv /etc/my.cnf /etc/my.cnf.bak
# vi /etc/my.cnf [mysqld] //设置sql结点
ndbcluster //指定表的存储引擎
default-storage-engine=ndbcluster
[mysql_cluster] //设置管理集群的主机
ndb-connectstring=192.168.4.100 //管理主机的IP
5、启动(注意启动顺序)
*正确的启动顺序:管理节点 --> 数据节点 --> SQL节点。
*关闭顺序: SQL节点 --> 数据节点 --> 管理节点。
*数据节点、SQL节点都正常运行后,理论上管理节点可关闭(无监控等任务的话)
1)启动管理进程
# ndb_mgmd -f /etc/my-cluster.ini --nodaemon //启动管理进程脚本
# pgrep mgmd //查看进程是否开启,可用pkill -9 mgmd 结束管理进程
# ndb_mgm //执行登录管理界面的脚本 ndb_mgm>show //查看集群信息
# netstat -atunp | grep ndb
tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 4965/ndb_mgmd
设置为开机自启动
#vim /etc/rc.local
ndb_mgmd -f /etc/my-cluster.ini --nodaemon
关于管理节点的启动,有以下几个需要注意的地方:
ndb_mgmd 默认以后台模式运行(--daemon),调试过程中可添加选项--nodaemon来禁用后台模式;
ndb_mgmd 初次启动成功以后,会自动保存集群配置,以后再启动时会忽略-f指定的配置文件,除非添加--inital选项(比如向集群中添加新的节点时,就应该重新初始化)。
2)启动数据结点进程
MySQL Cluster数据节点的对应服务程序为ndbd(单线程的)、ndbmtd(多线程的),首次启动或重新初始化时加 --initial选项,以后不用加。
# ndbd --initial-start //启动数据结点进程
# pgrep ndbd //查看进程,可用pkill -9 ndbd 结束管理进程
# vim /etc/rc.local //设置为开机自启动
ndbd
3)启动sql结点的数据库服务进程
# pgrep mysqld
# pkill -9 mysql
# service mysql start
# chkconfig mysql on
检查sql节点默认存储引擎,确保已支持ndbcluster且作为默认存储引擎:
# mysql -u root -p123456 //本机帐号登录
mysql> show engines\G;
Engine: ndbcluster
Support: DEFAULT
管理节点查看集群状态
#ndb_mgm //进入群集管理环境
ndb_mgm> show //若能看到如下信息就说明集群创建成功
Cluster Configuration
---------------------
[ndbd(NDB)] 2node(s)
id=30 @192.168.4.30 (mysql-5.6.14 ndb-7.3.3, starting, Nodegroup:0)
id=40 @192.168.4.40 (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0, *)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.4.100 (mysql-5.6.14 ndb-7.3.3)
[mysqld(API)] 2node(s)
id=10 @192.168.4.10 (mysql-5.6.14 ndb-7.3.3)
id=20 @192.168.4.20 (mysql-5.6.14 ndb-7.3.3)
6、sql结点授权客户端用户(两点节点都要)
mysql>grant all on *.* to root@'192.168.4.%' identified by '123';
7、MySQL集群的高可用性测试(验证集群)
**如果默认引擎未设为ndbcluster,则建表操作末尾需手工指定存储引擎**
**不能自动切换两个节点→mysql-mmm 解决**
1)数据同步(自动备份)测试
客户端登录 mysql节点.10 和.20 ( .10和.20的数据会同步)
# mysql -h192.168.4.10 -uroot -p123
mysql> create database ndb;
mysql> use ndb;
mysql> create table ndb01(idint);
mysql> insert into ndb01values(100);
mysql> select * from ndb01;
+------+
| id |
+------+
| 100 |
| 100 |
从客户机访问20,确认结果(能看到从10上所建的库、表、表记录)
# mysql -h192.168.4.20 -uroot-p123
2)高可用性测试(单点故障)(关闭一台数据节点)
**只要还有一台数据节点可用,MYSQL数据库整体就仍然可用**
关闭数据节点.30上的ndbd进程:
# pkill -9 ndbd
# netstat -antup | grep ndbd //确认
ndb_mgm> show //此时从管理节点上查看集群状态,会发现ndbA已断开连接
id=30 (not connected, acceptingconnect from 192.168.4.30)
然后从客户机访问sqlA或sqlB,仍然可读、写数据库。
验证故障恢复过程
重新启动.30上的ndbd服务进程,稍待片刻后强制关闭.40上的ndbd服务进程。然后再次访问.30或.40节点,查询ndb01表的记录,发现与前面添加的结果一致:
以上测试成立说明:因故障中断的数据节点(.30)恢复后,会立即从正常的数据节点(.40)同步数据,确保数据一致性。
3)高可用性测试(关闭一台SQL节点)
这个比较好理解:当MySQL集群内有多个SQL节点时,只要有一台SQL节点可用,就可以通过它来访问MySQL数据库中保存的表数据。
比如说,关闭sqlA、sqlB中的任何一台以后,还可以通过另外一台来访问mydb库
完毕!
本文出自 “Dave-技术博客” 博客,请务必保留此出处http://davewang.blog.51cto.com/6974997/1858594
目录 返回
首页