RHEL 6.7搭建MySQL-Cluster集群架构

实验需求:部署MySQL集群,减少数据库单点故障。

1. 参考文档
http://www.linuxidc.com/Linux/2016-04/130100.htm

2. 简介
   MySQL-Cluster是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的簇。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件都有自己的内存和磁盘,所以不存在单点故障。
   MySQL簇将标准的MySQL服务器与名为NDB的“内存中”的簇式存储引擎集成了起来。术语NDB指的是与存储引擎相关的设置部分,而术语“MySQL簇”指的是MySQL和NDB存储引擎的组合。
   MySQL簇由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB簇的数据节点,管理服务器(MGM),以及(可能)专门的数据访问程序。关于簇中组件的关系,如下图:
       RHEL 6.7搭建MySQL-Cluster集群架构_第1张图片

所有这些程序一起构成了MySQL簇。将数据保存到NBD簇引擎中时,表将保存在数据节点内。能够从簇中所有其他MySQL服务器直接访问这些表。因此,假如在将数据保存在簇内的工资应用程序中,如果某一应用程序更新了一位雇员的工资,所有查询该数据的其他MySQL 服务器能立刻发现这种变化。
   对于MySQL簇,保存在数据节点的数据可被映射,簇能够处理单独数据节点的故障,除了少数事物将因事物状态丢失而被放弃外,不会产生其他影响。由于事物性应用程序能够处理失败事宜,因而它不是问题源。

3. MySQL簇的基本概念
   NDB是一种“内存中”存储引擎,它具有可用性高和数据一致性好的特点。能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但以簇层面上的存储引擎开始最简单。MySQL簇的NDB存储引擎包含完整的数据集,仅取决于簇本身内的其他数据。

下面介绍设置由NDB存储引擎和一些MySQL服务器构成的MySQL簇的设置方法。
目前,MySQL簇的部分可以独立于MySQL服务器进行配置。在MySQL簇中,簇的每个部分被视为一个节点。
   注释:在很多情况下,术语“节点”用于指计算机,但在讨论MySQL簇时,它表示的是进程。在单台计算机上可以有任意数目的节点,所以我们才有可能将多个不同功能的节点配置在同一台计算机上,为此,我们采用术语簇主机。

有三类簇节点,在最低的MySQL簇配置中,至少有三个节点,这三类节点分别是:
管理节点(MGM):这类节点的作用是管理MySQL簇内的其他节点,如提供配置数据,启动并停止节点,运行备份等。由于这类节点负责管理其他节点的配置,所以管理节点应在其他节点之前先启动。MGM节点是用命令ndb_mgm启动的。
数据节点(NDB):这类节点用于保存簇的数据。数据集点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本又两个片段,那么就有4个数据节点。没有必要有一个以上的副本。。数据节点是用命令ndbd来启动的。

SQL节点:这类节点是用来访问簇数据的节点。对于MySQL簇,客户端节点是使用NDB 簇存储引擎的传统MySQL服务器。典型情况下,SQL节点是使用命令mysql -ndbcluster来启动的,或将ndbcluster添加到my.cnf后面使用mysqld启动。

   簇配置包括对簇中单独节点的配置,以及设置节点之间的单独通信链路。对于目前设计的MySQL簇,其意图在于,从处理器的能力,内存空间和宽带来讲,存储节点是同质的,此外,为了提供单一的配置点,作为整体,簇的所有配置均位于一个文件中。
   管理服务器(MGM节点)负责管理簇配置文件和簇日志。簇中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在的位置的方式。当数据节点内出现有趣的事件时,节点将关于这类事件的信息传输到管理服务器,然后,经这类信息写入簇日志。

目标:
1.安装MySQL-Cluster相关软件包。
2.依次配置管理/数据/SQL节点。
3.启动并测试MySQL-Cluster集群架构。

实验方案:
使用6台RHEL 6.5虚拟机。其中sqlA和sqlB作为SQL节点,ndbA和ndbB作为数据节点,mgmd作为管理节点,这5个构成MySQL集群体系的5个节点应安装Cluster版的MySQL相关软件包;测试用的Linux客户机只需安装普通版的MySQL-client即可。
mgmd(192.168.100.1)作为管理节点,
sqlA(192.168.100.2)作为SQL节点,
sqlB(192.168.100.3)作为SQL节点,
ndbA(192.168.100.4)作为数据节点,
ndbB(192.168.100.5)作为数据节点,
client (192.168.100.7)作为客户端

这6个节点构成MySQL Cluster体系。
MySQL Cluster 备份与恢复 http://www.linuxidc.com/Linux/2013-06/85295.htm
MySQL Cluster安装配置 http://www.linuxidc.com/Linux/2013-07/87705.htm
MySQL Cluster 3台机器搭建集群环境 DOC http://www.linuxidc.com/Linux/2013-01/78249.htm
MySQL Cluster7.2在线增加数据节点存在重大弊端 http://www.linuxidc.com/Linux/2012-08/67605.htm

准备工作:
1)确认各节点服务器的IP地址,使各节点能互通,防火墙和selinux处于关闭状态。
关闭防火墙:
# iptables -F                      //清空防火墙条目
# service iptables stop      //关闭防火墙
# chkconfig iptables off    //开机不自启

关闭selinux:
vim打开 /etc/selinux/config修改SELINUX=disabled 
# getenforce 0

实施过程:
一.公共配置
1.所有节点上安装MySQL集群软件
1.1所有节点卸载冲突包
官方提供的MySQL-Cluster相关软件包已集成数据库服务端/客户端程序,因此可直接用来替换普通的MySQL服务端/客户端程序。如果已安装有普通版的mysql-server、mysql、MySQL-server、MySQL-client包,请先将其卸载(若没有则忽略):
# service  mysql  stop
# chkconfig  mysql  off
# rpm -qa | grep -i mysql        //检查有没有安装普通版的mysql软件

# rpm -e --nodeps MySQL-server MySQL-client MySQL-shared MySQL-embedded MySQL-test MySQL-devel mysql
对于RHEL自带的mysql-libs暂时保留(如果直接卸载会因为依赖关系删除许多重要的包,比如crontab、postfix等),但在安装MySQl-Cluster相关包的时候采用“-U”升级的方式执行替换。

1.2清理残余配置文件
如果有残留的/etc/my.cnf文件,确保已转移备用或直接删除。

mv -v /etc/my.cnf  /etc/my.cnf.bak
useradd -M -s /sbin/nologin mysql

1.3 所有节点安装MySQL-Cluster相关软件包
MySQL-Cluster最新下载包:
http://cdn.mysql.com//Downloads/MySQL-Cluster-7.4/MySQL-Cluster-gpl-7.4.11-1.el6.x86_64.rpm-bundle.tar

# 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密码
[root@sql1 ~]# service mysql start        //启动MySQL服务程序
Starting MySQL... [确定]
[root@sql1 ~]# cat /root/.mysql_secret
# The random password set for the root user at Wed Sep  3 21:04:20 2014 (local time): msA7Bq2B
[root@sql1 ~]# mysql –u root –pmsA7Bq2B            //以上述默认密码登录
mysql> set password=password("123456");
Query OK, 0 rows affected (0.17 sec)

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个数据节点的工作目录,需创建
在管理节点(mgmsvr)上,实际上并不需要启动MySQL服务程序,因此建议将mysql服务的自启状态设为关闭
[root@ndb1 ~]# chkconfig mysql off


三.配置数据节点 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
在数据节点(ndb1、ndb2)上,实际上并不需要启动MySQL服务程序,因此建议将mysql服务的自启状态设为关闭
[root@ndb1 ~]# chkconfig mysql off


四.配置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
成功启动后,可在本机登入mysql>环境,检查默认的存储引擎,确保已支持ndbcluster且作为默认存储引擎:
[root@sql1 ~]# mysql -uuser -p123456
... ...
mysql> show engines\G;
*************************** 1. row ***************************
Engine: ndbcluster
Support: DEFAULT
Comment: Clustered, fault-tolerant tables
Transactions: YES
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
... ...

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库。

七、问题和经验总结
   测试的过程中会出现各种问题,要耐心调试才行。所有问题的出现都是有原因的,出现问题后看报错,找日志可以快速定位造成问题的地方,然后根据提示信息,找到原因。不看日志,盲目地重启服务,重启电脑,即使偶尔解决了,也不会从中得到什么。

下面是测试过程中,收集的一些问题:
问题1:
[root@sql2 ~]# /etc/init.d/mysql restart
MySQL server PID file could not be found!                  [失败]
Starting MySQL...................................................................^C //实在等不下去按了ctrl+c中断
这个问题经常出现,而且造成这种情况的原因比较多,在强制杀掉mysqld进程的时候会出现,在没有关闭mysql服务的情况下修改hostname的时候也会出现,等等情况。我做法是先查看是否有mysqld的残留进程,然后统统杀掉,再重启服务,一般的情况下会奏效,不奏效只能去看错误日志了。

问题2
如果管理节点上显示下面的数据节点后面两个都没有“*”,有可能是数据节点的selinux没有关掉。
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]2 node(s)
[email protected]  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)
[email protected]  (mysql-5.6.14 ndb-7.3.3, Nodegroup: 0)

问题3
出现数据节点连接不上管理节点,如下
[root@ndb1 mysql]# ndbd --initial
2014-09-05 22:59:29 [ndbd] INFO    -- Angel connected to '192.168.4.3:1186'
2014-09-05 23:00:00 [ndbd] ERROR    -- Failed to allocate nodeid, error: 'Error: Could not alloc node id at 192.168.4.3 port 1186: No free node id found for ndbd(NDB).'
这是可能是因为你的ndbd进程已经在运行,在管理节点上已经没有可以供分配的节点id了。
在数据节点上查看进程正常就可以了,这个错误可以忽略。

八、总结
Mysql cluster是一个统一的共享集群;
多mysql同时共享;
一个值多份存储,不是像redis那样根据一致性hash分布存储;
高并发、高可用、高伸缩性;
share nothing架构;
通过增加数据节点扩展:通过32个数据节点实现每秒2亿条NoSQL查询,以及通过16个数据节点每秒查询近250万SQL语句;
推荐使用lvs + keepalived + mysql cluster 实现集群mysql,MySQL Cluster是一个实时可扩展且符合ACID的事务型内存数据库。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9034054/viewspace-2097706/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9034054/viewspace-2097706/

你可能感兴趣的:(RHEL 6.7搭建MySQL-Cluster集群架构)