Mysql集群与调优
实验背景:
1.安装MySQL-Cluster相关软件包。
2.依次配置管理/数据/SQL节点。
3.启动并测试MySQL-Cluster集群架构。
实验方案:
使用6台RHEL 6.4虚拟机,其中sqlA和sqlB作为SQL节点,ndbA和ndbB作为数据节点,
mgmd作为管理节点,这5个节点构成MySQL Cluster体系;而另一台虚拟机192.168.4.20作为MySQL测试客户机。
构成MySQL集群体系的5个节点应安装Cluster版的MySQL相关软件包,具体操作见“实现”部分的安排;测试用的Linux客户机只需安装普通版的MySQL-client即可。
实验实现:
1.前期准备工作
1)确认各节点服务器的主机名、IP地址
为5个节点建立统一的hosts文件,提高本地解析速度,相关操作如下:
[root@sqlA ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
.. ..
192.168.4.10 sqlA.tarena.com sqlA
192.168.4.20 sqlB.tarena.com sqlB
192.168.4.30 ndbA.tarena.com ndbA
192.168.4.40 ndbB.tarena.com ndbB
192.168.4.100 mgmsvr.tarena.com mgmsvr
参考上述hosts文件为各节点设置好主机名、IP地址(具体过程略)。
卸载冲突包【所有节点】
官方提供的MySQL-Cluster相关软件包已集成数据库服务端/客户端程序,因此可直接用
来替换普通的MySQL服务端/客户端程序。如果已安装有普通版的mysql-server、mysql、
MySQL-server、MySQL-client包,请先将其卸载(若没有则忽略):
[root@sqlA ~]# yum -y remove mysql-server mysql
Setting up Remove Process
对于RHEL自带的mysql-libs暂时保留(如果直接卸载会因为依赖关系删除许多重要的包
,比如crontab、postfix等),但在安装MySQl-Cluster相关包的时候采用“-U”升级的
方式执行替换。
如果有残留的/etc/my.cnf文件,确保已转移备用或直接删除。
[root@sqlA ~]# mv /etc/my.cnf /etc/my.cnf.old
3)安装MySQL-Cluster相关软件包【所有节点】
在所有节点上,解压下载的MySQL-Cluster集合包:
[root@sqlA ~]# cd /var/ftp/pub/
[root@sqlA pub]# 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
在所有节点上,安装MySQL-Cluster-server、MySQL-Cluster-client软件包:
[root@sqlA pub]# rpm -Uvh MySQL-Cluster-shared-*.rpm
在SQL节点(sqlA、sqlB)服务器上,修改MySQL数据库的root密码:
[root@sqlA ~]# cat /root/.mysql_secret
# The random password set for the root user at Tue Dec 24 15:24:50 2013 (local time): Z3Qw2OWJ //查看默认的密码
[root@sqlA ~]# service mysql start //启动MySQL服务程序
Starting MySQL... [确定]
[root@sqlA ~]# mysql –u root –p //以上述默认密码登录
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> SET PASSWORD FOR 'root'@'localhost'=PASSWORD('1234567');
Query OK, 0 rows affected (0.10 sec) //重设root口令
在数据节点(ndbA、ndbB)和管理节点(mgmsvr)上,实际上并不需要启动MySQL服务程序
,因此建议将mysql服务的自启状态设为关闭,root密码可改可不改:
[root@ndbA ~]# chkconfig mysql off
[root@ndbA ~]# chkconfig --list mysql
mysql 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
4)添加授权数据库用户【SQL节点】
在SQL节点(sqlA、sqlB)服务器上,添加相应的授权数据库用户,以方便客户端使用数据
库服务。以用户root为例,允许其从192.168.4.0/24网段访问:
mysql> GRANT all ON *.* TO 'root'@'192.168.4.%' IDENTIFIED BY '1234567';
Query OK, 0 rows affected (0.10 sec) //授权用户及客户机
mysql> exit //退出 mysql> 环境
Bye
2.配置管理节点 mgmd (192.168.4.100)
1)创建工作文件夹
为管理节点提供一个工作目录,方便记录MySQL集群相关的日志消息:
[root@mgmsvr ~]# mkdir -p /var/log/mysql-cluster
2)创建配置文件
针对本节的案例,管理节点的配置操作参考如下:
[root@mgmsvr ~]# vim /etc/my-cluster.ini
[ndbd default]
NoOfReplicas=2 //保留2份数据拷贝
DataMemory=80M //数据缓存大小
IndexMemory=18M //索引缓存大小
[ndb_mgmd]
nodeid=1 //第1个管理节点的ID号
hostname=192.168.4.100 //此管理节点的地址
datadir=/var/log/mysql-cluster //此管理节点的工作目录
[mysqld]
nodeid=10 //第1个SQL节点的ID号
hostname=192.168.4.10 //第1个SQL节点的地址
[mysqld]
nodeid=20 //第2个SQL节点的ID号
hostname=192.168.4.20 //第2个SQL节点的地址
[ndbd]
nodeid=30 //第1个数据节点的ID号
hostname=192.168.4.30 //第1个数据节点的地址
datadir=/var/lib/mysql-cluster/data //第1个数据节点的工作目录
[ndbd]
nodeid=40 //第2个数据节点的ID号
hostname=192.168.4.40 //第2个数据节点的地址
datadir=/var/lib/mysql-cluster/data //第2个数据节点的工作目录
3.配置数据节点 ndbA(192.168.4.30) 、ndbB (192.168.4.40)
1)创建工作文件夹
为各数据节点提供一个工作目录,用来存放实际的数据库表记录等相关数据:
1.[root@ndbA ~]# mkdir -p /var/lib/mysql-cluster/data
2)创建配置文件
指定工作目录(数据存储目录)、管理服务器的IP地址、采用ndbcluster存储引擎,以
便支持集群特性;并添加[mysql_cluster]配置段,同样指定管理地址。
针对本节的案例,2个数据节点的配置操作参考如下:
[root@ndbA ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql-cluster/ndbdata //指定数据存储目录
ndb-connectstring=192.168.4.100 //要连接的管理服务器的IP地址
ndbcluster //指定运行的存储引擎
[mysql_cluster] //集群连接配置段
ndb-connectstring=192.168.4.100
4.配置SQL节点sqlA(192.168.4.10) 、sqlB (192.168.4.20)
主要是调整my.cnf配置,指定运行的存储引擎、默认存储引擎,并通过[mysql_cluster]配置段指定管理地址。在MySQL-Cluster集群环境中,若某个数据库未采用ndbcluster引擎(而是InnoDB、MyISAM等其他引擎),则当更新数据库表时,可能无法同步到其他节点。
[root@sqlA ~]# vim /etc/my.cnf
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
explicit_defaults_for_timestamp=1
.. ..
ndbcluster //指定运行的存储引擎
default-storage-engine=ndbcluster //设置默认存储引擎
[mysql_cluster] //集群连接配置段
ndb-connectstring=192.168.4.100
5.启动MySQL集群
正确的启动顺序:管理节点 --> 数据节点 --> SQL节点。
关闭顺序:SQL节点 --> 数据节点 --> 管理节点。
数据节点、SQL节点都正常运行后,理论上管理节点可关闭(无监控等任务的话)。
1)启动管理节点mgmd
MySQL Cluster管理节点的对应服务程序为ndb_mgmd,通过选项-f指定建立的集群配置文件。
[root@mgmsvr ~]# ndb_mgmd -f /etc/my-cluster.ini //启动管理节点,-f 指定配置文件路径
若希望每次开机后自动运行ndb_mgmd,可将上述启动操作写入到/etc/rc.local配置文件内,例如:
[root@mgmsvr ~]# vim /etc/rc.local
.. ..
ndb_mgmd -f /etc/my-cluster.ini
启动完成后可查看监听状态:
[root@mgmsvr ~]# netstat -anpt | grep ndb
tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 4656/ndb_mgmd
tcp 0 0 127.0.0.1:1186 127.0.0.1:38567 ESTABLISHED 4656/ndb_mgmd
tcp 0 0 127.0.0.1:38567 127.0.0.1:1186 ESTABLISHED 4656/ndb_mgmd
查看日志文件相关数据:
[root@mgmsvr ~]# ls /var/log/mysql-cluster/
ndb_1_cluster.log ndb_1_out.log ndb_1.pid
2)启动数据节点ndbA、ndbB
MySQL Cluster数据节点的对应服务程序为ndbd(单线程的)、ndbmtd(多线程的),首次启动或重新初始化时加 --initial选项,以后不用加。
启动ndbA:
[root@ndbA ~]# ndbd --initial //启动数据节点
.2013-12-24 17:55:55 [ndbd] INFO -- Angel connected to '192.168.4.100:1186'
2013-12-24 17:55:55 [ndbd] INFO -- Angel allocated nodeid: 30
启动ndbB:
[root@ndbA ~]# ndbd --initial //启动数据节点
2013-12-24 17:55:55 [ndbd] INFO -- Angel connected to '192.168.4.100:1186'
2013-12-24 17:55:55 [ndbd] INFO -- Angel allocated nodeid: 40
在ndbA和ndbB服务器上,修改/etc/rc.local配置文件,以便每次开机后能自动启动数据节点服务:
[root@ndbA ~]# vim /etc/rc.local
.. ..
ndbd
3)启动SQL节点sqlA、sqlB
对于MySQL Cluster的SQL节点来说,对应的服务程序就是mysqld,正常通过mysql脚本重新启动服务就可以了。
启动sqlA:
[root@sqlA ~]# service mysql restart
.Shutting down MySQL..... [确定]
Starting MySQL.... [确定]
启动sqlB:
[root@sqlB ~]# service mysql restart
Shutting down MySQL..... [确定]
Starting MySQL.... [确定]
在sqlA和sqlB服务器上,建议将mysql服务的自动状态设为“启用”:
[root@sqlA ~]# chkconfig mysql on
[root@sqlA ~]# chkconfig --list mysql
mysql 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
成功启动后,可在本机登入mysql>环境,检查默认的存储引擎,确保已支持ndbcluster且作为默认存储引擎:
[root@sqlA ~]# mysql -u root -p
Enter password:
.. ..
mysql> SHOW ENGINES\G
*************************** 1. row ***************************
Engine: ndbcluster //已支持NDB集群存储
Support: DEFAULT //且已作为默认
Comment: Clustered, fault-tolerant tables
Transactions: YES
XA: NO
Savepoints: NO
*************************** 2. row ***************************
... ...
4)在管理节点mgmd上查看群集状态
直接执行ndb_mgm可进入群集管理环境:
[root@mgmsvr ~]# ndb_mgm //进入集群管理环境
-- NDB Cluster -- Management Client --
ndb_mgm>
进入ndb_mgm> 环境后,执行SHOW可查看当前各节点的状态,确保本例中的5个节点都已经成功连接;
ndb_mgm> SHOW //查看管理状态
Connected to Management Server at: localhost:1186
.Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s) //两个数据节点
id=30 @192.168.4.30 (mysql-5.6.14 ndb-7.3.3, 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)] 2 node(s) //两个SQL节点
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)
ndb_mgm>
6.MySQL集群的高可用性测试
1)数据同步测试
从客户机访问sqlA,执行写数据库、表相关操作:
然后从客户机访问sqlB,确认结果(能看到从sqlA上所建的库、表、表记录):
反过来从sqlB上所作的数据库表操作,从sqlA上也能获得相同的结果。
2)高可用性测试(关闭一台数据节点)
关闭数据节点ndbA上的ndbd进程:
[root@ndbA ~]# killall -9 ndbd //暴力结束ndbd进程
[root@ndbA ~]# netstat -anpt | grep ndbd //确认已结束
此时从管理节点上查看集群状态,会发现ndbA已断开连接:
ndb_mgm> show
然后从客户机访问sqlA或sqlB,仍然可读、写数据库。比如可向mydb.mytb表中再添加一条记录:
以上测试成立说明:只要还有一台数据节点可用,MYSQL数据库整体就仍然可用。
实验总结:
1、实验开始之前的环境准备不要忘记卸载冲突包
2、在管理节点的ini配置文件中,应涵盖所有节点的设置,主要包括各节点的ID号、主机
名或IP地址、工作目录等信息。相关配置区段的作用如下:
?[ndbd default]:为所有的数据节点指定默认配置。
?[ndbd]:指定某一个数据节点的配置。
?[ndb_mgmd default]:为所有的管理节点指定默认配置。
?[ndb_mgmd]:指定某一个管理节点的配置。
?[mysqld default]:为所有的SQL节点指定默认配置。
?[mysqld]:指定某一个SQL节点的配置。
3、关于管理节点的启动,有以下几个需要注意的地方:
?ndb_mgmd默认以后台模式运行(--daemon),调试过程中可添加选项--nodaemon来禁用后台模式。
?ndb_mgmd初次启动成功以后,会自动保存集群配置,以后再启动时会忽略-f指定的配置文件,除非添加--inital选项(比如向集群中添加新的节点时,就应该重新初始化)。
4、