MySQL Cluster实战
MySQL Cluster技术在分布式系统中为MySQL提供了冗余特性,增强了安全性,可以大大的提高系统的可靠性和数据的有效性。MySQL集群需要一组计算机,每台计算机可以理解为一个节点,这些节点的功能各不相同。MySQL Cluster按照功能来分,可以分为三种节点:管理节点、数据节点和SQL节点。集群中的某台计算机可以是某一个节点,也可以是两种或者三种节点的集合,这些节点组合在一起,为应用提供具有高可靠性、高性能的Cluster数据管理;
目前企业数据量越来越大,所以对MySQL的要求进一步提高,以前的大部分高可用方案通常存在一定的缺陷,例如MySQL Replication方案,Master是否存活检测需要一定的时间,如果需要主从切换也需要一定的时间,因此高可用很大的程度上依赖于监控软件和自动化管理工具。随着MySQL Cluster的不断发展,终于在性能和高可用上得到了很大的提高;
MySQL Cluster简单地讲是一种MySQL集群的技术,是由一组计算机构成,每台计算机可以存放一个或者多个节点,其中包括MySQL服务器,DNB Cluster的数据节点,管理其他节点,以及专门的数据访问程序,这些节点组合在一起,就可以为应用提高可高性能、高可用性和可缩放性的Cluster数据管理;
MySQL Cluster的访问过程大致是这样的,应用通常使用一定的负载均衡算法将对数据访问分散到不同的SQL节点,SQL节点对数据节点进行数据访问并从数据节点返回数据结果,管理节点仅仅只是对SQL节点和数据节点进行配置管理;
MySQL Cluster按照节点类型可以分为3种类型的节点,分别是管理节点、SQL节点、数据节点,所有的这些节点构成了一个完整的MySQL集群体系,事实上,数据保存在NDB存储服务器的存储引擎中,表结构则保存在MySQL服务器中,应用程序通过MySQL服务器访问数据,而集群管理服务器则通过管理工具ndb_mgmd来管理NDB存储服务器;
【1.管理节点】
管理节点主要是用来对其他的节点进行管理。通常通过配置config.ini文件来配置集群中有多少需要维护的副本、配置每个数据节点上为数据和索引分配多少内存、IP地址、以及在每个数据节点上保存数据的磁盘路径;
管理节点通常管理Cluster配置文件和Cluster日志。Cluster中的每个节点从管理服务器检索配置信息,并请求确定管理服务器所在位置的方式。如果节点内出现新的事件的时候,节点将这类事件的信息传输到管理服务器,将这类信息写入到Cluster日志中;
一般在MySQL Cluster体系中至少需要一个管理节点,另外值得注意的是,因为数据节点和SQL节点在启动之前需要读取Cluster的配置信息,所以通常管理节点是最先启动的;
【2.SQL节点】
SQL节点简单地讲就是mysqld服务器,应用不能直接访问数据节点,只能通过SQL节点访问数据节点来返回数据。任何一个SQL节点都是连接到所有的存储节点的,所以当人任何一个存储节点发生故障的时候,SQL节点都可以把请求转移到另一个存储节点执行。通常来讲,SQL节点越多越好,SQL节点越多,分配到每个SQL节点的负载就越小,系统的整体性能就越好;
【3.数据节点】
数据节点用来存放Cluster里面的数据,MySQL Cluster在各个数据节点之间复制数据,任何一个节点发生了故障,始终会有另外的数据节点存储数据;
通常这3种不同逻辑的节点可以分布在不同的计算机上面,集群最少有3台计算机,为了保证能够正常维护集群服务,通常将管理节点放在一个单独的主机上;
节点配置说明
节点 | 对应的IP地址和端口 |
管理节点(1个) | 192.168.0.100 |
SQL节点(2个) | 192.168.0.101:3331 |
192.168.0.100:3331 | |
数据节点(2个) | 192.168.0.101 |
192.168.0.102 |
MySQL Cluster 7.2.8之前所需要的准备工作,需要将3台普通的PC机器的网络IP地址配置起来,具体的操作步骤如下:
第一步:
系统默认的网卡端口是eth0,这里使用的是eth2,首先编辑eth2的配置文件,设置IP地址、子网掩码和网关的配置信息;
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vi ifcfg-eth2
第二步:
使用ifconfig命令查看eth2端口IP地址是否成功设置,然后重新启动网络;
[root@localhost network-scripts]# ifconfig eth2
[root@localhost network-scripts]# service network restart
第三步:
使用chkconfig命令设置网卡进入系统的时候启动。想要每次开机的时候就可以自动的获取IP地址,此时需要开启服务,使用chkconfig命令是让网络服务在系统启动级别是2345的时候默认启动;
[root@localhost network-scripts]# chkconfig --level 2345 network on
[root@localhost network-scripts]# service network start
[root@localhost network-scripts]# clear
说明:
使用service network start 或者service network restart 命令,提示出错,主要的原因是Fedora除了有个network网卡信息之外,还有一个NetManager来管理,可以将NetWorkManager关闭掉;
第四步:
将NetworkManager服务关闭掉,然后重启网络服务;
[root@localhost network-scripts]# chkconfig --level 0123456 NetworkManager off
[root@localhost network-scripts]# Service NetworkManager stop
[root@localhost network-scripts]# service network stop
[root@localhost network-scripts]# service network start
下面接着采用相同的方法配置IP地址为192.168.0.101和IP地址为192.168.0.102的网络地址,配置完成之后我们使用PING命令检测下网络是否可以成功的连接;
[root@localhost ~]# ifconfig
[root@localhost ~]# ping 192.168.0.101
安装MySQL Cluster 7.2.8软件
MySQL Cluster安装之前需要将MySQL Server卸载掉,如果MySQL Server已经卸载掉的话,则直接安装MySQL Cluster。安装MySQL Cluster的具体操作步骤如下:
第一步:
直接把之前安装的MySQL安装的程序删除掉:
[root@localhost mysql]# cd /usr/local
[root@localhost local]# ls
[root@localhost local]# rm -rf mysql
第二步:
登陆 http://dev.mysql.com/downloads/cluster/#downloads 网址,下载 MySQL Cluster
第三步:
下载好mysql-cluster-gpl-7.2.8-linux2.6-i686.tar.gz文件之后,先对其进行解压缩
[root@localhost ~]# gunzip mysql-cluster-gpl-7.2.8-linux2.6-i686.tar.gz
[root@localhost ~]# tar -xvf mysql-cluster-gpl-7.2.8-linux2.6-i686.tar
第四步:
假设每个节点计算机上都采用mysql用户来运行MySQL Cluster,首先添加mysql组,然后添加mysql用户:
[root@localhost ~]#groupadd mysql
[root@localhost ~]#useradd mysql -g mysql
第五步:开始安装MySQL Cluster
[root@localhost ~]#mkdir /usr/local/mysql-cluster
[root@localhost ~]#mv mysql-cluster-gpl-7.2.8-linux2.6-i686/* /usr/local/mysql-cluster
[root@localhost ~]# cd /usr/local/mysql-cluster
[root@localhost mysql-cluster]# chown -R root .
[root@localhost mysql-cluster]# ls
[root@localhost mysql-cluster]# chown -R mysql ./dat a
[root@localhost mysql-cluster]# chown -R mysql .
[root@localhost mysql-cluster]# ./scripts/mysql_install_db --user=mysql
安装过程中可能会提示错误信息:由于安装过程中缺少libaio 安装文件而导致的问题,接下来,安装该程序,操作步骤如下:
[root@localhost ~]# ls
[root@localhost ~]# rpm -ivh libaio-0.3.96-3.i368.rpm
安装成功之后,然后开始初始化MySQL Server服务;
[root@localhost ~]# cd /usr/local/mysql-cluster/
[root@localhost mysql-cluster]# ./scripts/mysql_install_db --usre=mysql
第六步:
接下来,首先创建my.cnf文件,并且开始初始化数据库,接着需要配置mysql服务,然后启动服务;
[root@localhost mysql-cluster]# cp ./support-files/my-medium.cnf /etc/my.cnf
[root@localhost mysql-cluster]# cd /etc/init.d
[root@localhost init.d]# ln -s
第七步:设置MySQL服务为自动启动服务
[root@localhost ~]# cd /usr/local
[root@localhost local]# ln -s mysql-cluster mysql
接下来编辑/etc/profile环境配置文件,在该文件的最后加上如下两句配置信息;
[root@localhost ~]# vi /etc/profile
PATH=$PATH:/usr/local/mysql-cluster/bin
export PATH
第八步:
使用chkconfig增加新的一项服务,系统从其之后服务自动运行。
[root@localhost ~]# cd /etc/rc.d/init.d/
[root@localhost init.d]# ls -al |grep mysql
[root@localhost init.d]# chkconfig --add mysql.server
[root@localhost local]# server mysql.server start
第九步:
简单的测试下当前的MySQL版本是否支持Cluster
[root@localhost init.d]# mysql
mysql > show variables like ‘%ndb%’;
MySQL Cluster 管理节点的配置时Cluster配置中最关键的一步,下面我们通过详细的步骤来描述下如何配置管理节点:
第一步:
复制/usr/local/mysql-cluster/bin/ndb_mgm,ndb_mgmd两个文件到/usr/local/bin目录下面去;
[root@localhost ~]# cd /usr/local/mysql-cluster/bin/
[root@localhost bin]# cp ./ndb_mgm* /usr/local/bin
第二步:
在管理节点服务器192.168.0.10的/var/lib/下创建目录mysql-cluster,并在该目录下面创建配置文件config.ini
[root@localhost ~]# cd /var/lib
[root@localhost lib]# mkdir mysql-cluster
[root@localhost lib]# cd mysql-cluster
[root@localhost mysql-cluster]# touch config.ini
第三步:
配置集群的测试环境,config.ini文件的配置信息如下
管理节点通过config.ini文件来配置管理节点,SQL节点和数据的信息,通常最关心的这3类节点的配置,分别定义如下:
[NDBD DEFAULT]:
表示每个数据节点的默认配置,在具体的每个节点[NDBD]中不用再写这些选项;
[NDB_MGMD]:
表示配置管理节点信息;
[NDBD]:
表示每个数据节点的配置信息,可以配置多个数据节点信息;
[MYSQLD]:
表示SQL节点的配置信息,可以有多个,此节点的个数说明了可以用来连接数据节点的SQL节点总数;
SQL节点和数据节点的配置比较简单,只需要在MySQL Server的配置文件(my.cnf)中增加内容即可;
在IP地址为192.168.0.101和192.168.0.102的机器上配置数据节点和SQL节点信息,
[mysql_cluster]配置数据节点的内容
[mysqld]配置SQL节点选项的内容
MySQL Cluster需要将集群的各个节点都启动之后才能正常的运行,节点的启动顺序依次是管理节点——》数据节点——》SQL节点。
第一步:在管理节点上使用ndb_mgmd命令启动管理节点进程:
[root@localhost ~]# cd /var/lib/mysql-cluster/
[root@localhost mysql-cluster]# ndb_mgmd -f ./config.ini
启动管理节点需要使用ndb_mgmd命令,-f 参数后面是管理节点的配置文件,ndb_mgmd命令实际上就是启动MySQL Cluster管理服务器,可以通过-f 参数或者--config=config_filename来指定MySQL Cluster的参数文件,其他的选项可以使用ndb_mgmd -help命令来查看,下面查看下进程,判断集群管理进程是否成功开启;
[root@localhost mysql-cluster]# ps -ef | grep ndb
提示使用ps进程查看命令;
第二步:
启动IP为192.168.0.101和192.168.0.102的数据节点服务器服务,如果是第一次启动,则需要添加--initial参数,以便进行ndb节点的初始化工作。值的注意的是,在以后的启动过程中,是不能添加--initial参数的,苟泽ndbd程序会清除之前建立的所有用于恢复数据文件和日志文件;
[root@localhost bin]# ndbd --initial
启动数据节点发生问题,连接不上,尝试关闭系统防火墙
[root@localhost ~]# /etc/init.d/iptables stop
[root@localhost ~]# /sbin/chkconfig --level 2345 iptables off
提示:/etc/init.d/iptables stop 命令可以讲系统的防火墙暂时的关闭掉,而sbin/chkconfig --level 2345 iptables off 命令可以让系统启动的时候不启动iptables服务;
关闭防火墙之后,重新启动数据节点:
[root@localhost~]# ndbd --initial
第三步:
启动IP地址为192.168.0.101 和192.168.0.102的SQL节点服务器,如下所示:
[root@localhost local]# service mysql.server start
第四步:
节点全部启动之后,用ndb_mgm工具查看集群状态;
[root@localhost ~]# ndb_mgm
ndb_mgm > show
说明:ndb_mgmd工具是ndb_mgmd的客户管理工具,通过该工具可以很方便的检测Cluster的状态,启动备份、关闭Cluster等功能。可以通过ndb_mgm -help命令来查看。
MySQL Cluster成功启动之后,下面来测试Cluster的功能。对于NDB存储引擎的数据是会同步的,而其他类型的存储引擎的数据是不会同步到其他的节点中的。
【1.测试NDB数据引擎】
第一步:在其中一个IP为192.168.0.101的SQL节点的test库中创建存储引擎为NDB的表t,然后插入两条数据;
第二步:在其中一个IP地址为192.168.0.102中查询test库中的t表,看下两个SQL节点的数据是否是一致的;
结果表明:对于MySQL Cluster会将存储引擎为NDB的表数据同步,而其他存储引擎不会将数据同步到其他的数据节点;
【2.SQL节点故障测试】
将一个节点服务器上的MySQL服务停止,用ndb_mgmd工具查看集群的状态,然后在另一个节点上进行数据查询工作,可以发现在MySQL Cluster体系中如果SQL节点发生了故障,并没有引起数据查询的问题,对于应用而言,可以对故障节点的访问修改为对没有故障节点的数据查询访问;
MySQL Cluster关闭只需要使用ndb_mgm命令,执行如下:
[root@localhost mysql-cluster]# ndb_mgm -e shutdown
同时也可以使用ndb_mgm工具进入管理界面之后,使用shutdown命令,执行如下的结果:
[root@localhost mysql-cluster]# ndb_mgm
ndb_mgm > shutdown
了解了MySQL Cluster的运行方法之后,下面主要介绍MySQL Cluster的日常维护工作;
进入到MySQL Cluster的命令行管理界面可以做大量的维护工作;
可以通过ndb控制界面执行help命令查看很多其他的维护管理命令:
ndb_mgm > help
也可以通过在help后面接命令的名称,获取该命令的相关信息;
ndb_mgm > help status
通过在管理节点上执行restart、stop、shutdown等命令来重启某个节点,或者关闭某个节点,此外,可以通过管理节点对整个Cluster环境进行备份,以及通过日志命令进行日志的相关管理;
MySQL Cluster提供了两种日志,集群日志(clusterlog)主要是用来记录所有的Cluster节点生成的日志,节点日志(node log)记录了数据节点的本地时间。通常采用集群日志,集群日志记录了所有的节点的数据,更方便的进行管理。集群日志记录在config.ini同一个目录下,测试环境是在/var/lib/mysql-cluster/目录的下面,文件格式为ndb_<nodeid>_cluster.log
[root@localhost mysql-cluster]# cd /var/lib/mysql-cluster/
[root@localhost mysql-cluster]# ls
[root@localhost mysql-cluster]#cat ndb_1_cluster.log
通常可以使用ndb_mgmd客户端管理日志信息,如下所示:
(1)在终端执行ndb_mgmd命令,输入clusterlog info 命令查看当前日志状态。
[root@localhost ~]# cd /var/lib/mysql-cluster/
[root@localhost mysql-cluster]# ndb_mgm
ndb_mgm > clusterlog info
(2)执行clusterlog off,命令关闭日志;
(3)执行clusterlog on命令开启日志;
使用mysqldump 工具对MySQL数据库进行逻辑备份。此阿勇这种备份的方法同样地适用于MySQL Cluster数据备份,在对MySQL Cluster接点进行数据备份的时候,可以选取任意一个节点进行备份;
通常使用MySQL Cluster备份指的是在给定的时间对数据库的快照,备份包含3个部分。
使用管理服务器进行Cluster物理备份,首先需要启动管理服务器(ndb_mgm)并执行“start backup”命令启动备份,具体执行如下所示:
ndb_mgm > start backup;
如果在备份的过程中想要终止备份可以使用如下的命令:
[root@localhost mysql-cluster]#ndb_mgm
ndb_mgm > abort backup node_id
对于大量数据的备份,MySQL Cluster提供了几个参数供调整,这些参数需要在config.ini文件的[ndbd]或者[ndbd default]组中,对各个参数的解释如下;
将数据写入磁盘之前用于对数据进行缓冲处理的内存量;
将日志记录写入磁盘之前用于对其进行缓冲处理的内存量;
在数据库节点中为备份分配的总内存。它应该是分配给备份数据缓冲的内存和分配给备份日志缓冲的内存之和;
写入磁盘的块大小,它适用于备份数据缓冲和备份日志缓冲;
最大写入磁盘的块大小;
上面的备份例子在两个数据节点之下都可以看到备份的数据,在IP地址为192.168.0.101的数据节点之下,可以看到一下的数据文件;
[root@localhost ~]# cd /usr/local/mysql/data/BACKUP/BACKUP-1
[root@ localhost BACKUP-1]#ls
使用START BACKUP 进行MySQL Cluster备份,使用ndb_restore工具进行数据恢复,下面使用命令ndb_restore进行恢复;
先在管理节点上执行start backup进行数据的备份:
ndb_mgm > start backup;
在数据节点上进行如下的数据恢复的命令
[root@localhost mysql-cluster]# ndb_restore -b 3 -n 2 -c
host=192.168.0.100:1186 -m -r /usr/mysql/data/BACKUP/BACKUP-3
相关参数如下表所示:
参数 | 说明 |
-b | 备份id |
-n | 节点id |
-m | 恢复表定义 |
-r | 恢复路径 |
-c | Cluster管理器连接IP地址和端口 |
配置集群需要使MySQL Cluster满足集群要求,MySQL Cluster的下载地址
http://www.mysql.com/downloads/cluster
管理节点安装在C盘下,在c盘下创建c:/mysql/bin、c:/mysql/mysql-cluster和c:/mysql/bin/cluster-logs目录,然后将安装包解压后的目录中的ndb_mgmd.exe和ndb_mgm.exe复制到c:/mysql/bin目录下;
然后配置my.ini和config.ini文件
在my.ini文件中配置config-file的目录
在config-ini文件中配置SQL数据节点和数据节点:
[ndbd_mgmd]
HostName=192.168.0.208 管理节点的IP地址
DataDir=C:/mysql/bin/cluster-logs 管理节点日志文件目录
[ndbd]
HostName= 配置数据节点
[mysqld]
HostName= 作为主机节点
在数据节点的主机下创建以下的目录:
D:/Program Files/mysqlcluster/datanode/mysql/bin
D:/Program Files/mysqlcluster/datanode/mysql/cluster-data
D:/Program Files/mysqlcluster/datanode/mysql/bin/cluster-data
此时需要在下载的目录解压之后的文件mysql/bin中将ndbd.exe复制到D:/Program Files/mysqlcluster/datanode/mysql/bin目录下。接下来需要在该目录下创建my.ini文件,
my.ini文件中配置:
[mysql_cluster]
ndb-connectstring=192.168.0.208 #定位管理节点
另外一个数据节点的位置同上;
在IP地址为192.168.0.206的计算机上创建D:/Program Files/mysqlcluster/sqlnode目录,然后将下载解压之后的文件夹mysql直接复制到D:/Program Files/mysqlcluster/sqlnode目录下面,然后在D:/Program Files/mysqlcluster/sqlnode/mysql下面创建my.ini文件,my.ini的配置信息如下:
[mysqld]
ndbcluster #运行NDB存储引擎
ndb-connectstring=192.168.0.208 #定位管理节点
对于其他的SQL节点的做法相同;
启动各个节点是有顺序的,先是Management node,然后是Data Nodes,最后是SQL nodes。
首先在IP地址为192.168.0.208的主机上打开命令窗口,切换到C:\mysql\bin目录下面;
在命令行中进入到C:\mysql\bin下面;
C:\mysql\bin > ndb_mgmd -f config.ini --configdir =c:\mysql\mysql-cluster
提示:此时命令窗口不能关闭,否则服务会停止;
在IP地址为192.168.0.206的主机上打开一个新的命令行窗口,切换到目录D:/Program Files/mysqlcluster/datanode/mysql/bin ,输入如下命令:
D:/Program Files/mysqlcluster/datanode/mysql/bin > ndbd -c 192.168.0.208
同时,登陆在IP地址为192.168.0.102的主机中打开一个新的命令行窗口,输入如下的命令:
D:/Program Files/mysqlcluster/datanode/mysql/bin > ndbd -c 192.168.0.102
下面在IP地址为192.168.0.208的主机上使用ndb_mgm命令测试有没有成功连接,如下命令:
C:\mysql\bin>ndb_mgm
ndb_mgm > all status
在IP地址为192.168.0.206的主机上打开一个新的命令行窗口,切换到目录D:Program Files/mysqlcluster/sqlnode/mysql/bin,输入以下的命令:
D:\Program Files\mysqlcluster\sqlnode\mysql\bin > mysqld --console
在管理节点上打开输入以下命令来检测数据节点是否成功连接,如下所示:
C:\mysql\bin>ndb_mgm
ndb_mgm > show
首先在IP地址为192.168.0.102机器上面登陆MySQL Server,然后创建数据引擎为ndb的测试表t,并添加一条记录;
然后登陆到另一个数据节点上,查看节点数据是否同步;