MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障。

Mysql群集(Cluster)简介

MySQL群集需要有一组计算机,每台计算机的角色可能是不一样的。MySQL群集中有三种节点:管理节点、数据节点和SQL节点。群集中的某计算机可能是某一种节点,也可能是两种或三种节点的集合。这三种节点只是在逻辑上的划分,所以它们不一定和物理计算机是一一对应的关系。

管理节点(也可以称管理服务器)主要负责管理数据节点和SQL节点,还有群集配置文件和群集日志文件。它监控其他节点的工作状态,能够启动、关闭或重启某个节点。其他节点从管理节点检索配置数据,当数据节点有新事件时就把事件信息发送给管理节点并写入群集日志。

数据节点用于存储数据。

SQL节点跟一般的MySQL服务器是一样的,我们可以通过它进行SQL操作。

下图中画出了三种群集节点及应用程序间的关系:

说明:http://www.jizhuomi.com/upload/mysql-cluster.png

一、配置环境:

OSLinux CentOS 6.3Bit64

MySQL:mysql-cluster-gpl-7.2.12-linux2.6-x86_64.tar.gz

注意:需用Cluster版本,可在官网上下载

节点配置情况:

hostname      IP地址应用服务

DB1         172.16.10.160     MGM
DB2         172.16.10.161     NDBD1MYSQLD
DB3         172.16.10.162     NDBD2,  MYSQLD
DB4         172.16.10.254     MYSQLD

我这里数据节点和sql节点用相同的2台机器承担,sql节点也可分开,例db4.

二、管理节点:

(一)安装管理节点MGM

#groupadd mysql

 #useradd mysql -g mysql

 #mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz/usr/local/

 #cd /usr/local/

 #tar zxvfmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz

 #rm -fmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz

 #mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23mysql

 #chown -R mysql:mysql mysql        

(二)配置装管理节点MGM

#mkdir/var/lib/mysql-cluster

 #cd /var/lib/mysql-cluster

 #vi config.ini//这里需要手动添加如下内容

[NDBD DEFAULT]

NoOfReplicas=2                         #副本数量,建议使用默认的2

DataMemory=600M                        #每个数据节点中给数据分配的内存

IndexMemory=100M                       #每个数据节点中给索引分配的内存

BackupMemory: 20M

[NDB_MGMD]                            #管理节点配置项

Nodeid= 1

HostName=172.16.10.160                 #管理节点IP

DataDir=/usr/local/mysql/data            #管理节点日志、配置目录

ArbitrationRank: 1                     #该节点的优先级别等级

[NDBD]                                     #数据节点配置项

Nodeid = 2                                #第一个数据节点

HostName=172.16.10.161                    #数据节点IP

DataDir=/usr/local/mysql/data              #数据节点存放数据的目录

[NDBD]

Nodeid = 3                                  #第二个数据节点

HostName=172.16.10.162

DataDir=/usr/local/mysql/data

[mysqld]                                         #SQL节点配置项

Nodeid = 4                                        #第一个SQL节点

HostName=172.16.10.161

[mysqld]

Nodeid = 5                                      #第二个SQL节点

HostName=172.16.10.162

[mysqld]

Nodeid = 6                                        #第三个SQL节点

HostName=172.16.10.254

[mysqld]                                          #建议保留一个SQL节点配置口

()管理节点启动相关服务及测试:

#/usr/local/mysql/bin/ndb_mgmd -f  /var/lib/mysql-cluster/config.ini

#netstat -lntpu

tcp 0 0   0.0.0.0:1186   0.0.0.0:*     LISTEN   22907/ndb_mgmd

看到1186端口开放了说明启动是正常的.

命令行中的ndb_mgmdmysql cluster的管理服务器,后面的-f表示后面的参数是启动的参数配置文件。如果在启动后过了几天又添加了一个数据节点,这时修改了配置文件启动时就必须加上--initial参数,不然添加的节点不会作用在mysql cluster中。

ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial

使用ndb_mgm来监听客户端,如下:

#/usr/local/mysql/bin/ndb_mgm   -e  show

关闭管理节点,如下:

#/usr/local/mysql/bin/ndb_mgm   -e  shutdown

三、数据节点和SQL节点:

(一)安装数据节点和SQL节点(在两个ndbd 节点 DB1,DB2 安装mysql):

#groupadd mysql

 #useradd mysql -g mysql

 #mvmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz /usr/local/

 #cd /usr/local/

 #tar zxvfmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz

 #rm -fmysql-cluster-gpl-7.0.8a-linux-i686-glibc23.tar.gz

 #mv mysql-cluster-gpl-7.0.8a-linux-i686-glibc23mysql

 #chown -R mysql:mysql mysql

 #cd mysql

 #scripts/mysql_install_db --user=mysql

 #cp support-files/my-medium.cnf /etc/my.cnf

 #cp support-files/mysql.server /etc/init.d/mysqld

(二)配置数据节点和SQL节点

#vi/etc/my.cnf         //这里需要手动添加如下的内容

[mysqld]

datadir=/usr/local/mysql/data/       //这里要与管理节点的config.ini相同

 ndbcluster                                 #运行NDB存储引擎
 ndb-connectstring=172.16.10.160:1186        
#指定管理节点,这两行声明其为SQL节点

 [mysql_cluster]
 ndb-connectstring=172.16.10.160:1186     #指定管理节点, 这两行声明其为数据节点
 [ndb_mgm]
 connect-string=172.16.10.160
 [ndb_mgmd]
 config-file=/var/lib/mysql-cluster/config.ini
//这里要指定管理节点配置文件路径

(三)数据节点和SQL节点服务

启动数据节点

#/usr/local/mysql/bin/ndbd –initial        #/usr/local/mysql/bin/ndbd

可以把/usr/local/mysql/bin/ndbd加到/etc/rc.local中实现开机启动。

注意:只有在第一次启动ndbd时或者对管理节点的config.ini进行改动后才需要使用–initial参数!这很重要。原因在于,该参数会使节点删启动SQL节点除由早期ndbd实例创建的、用于恢复的任何文件,包括恢复用日志文件。

启动SQL节点

Service mysqld start

完成配置后,启动集群并不很困难。必须在数据节点所在的主机上分别启动每个集群节点进程。尽管能够按任何顺序启动节点,但我们建议,首先启动管理节点,然后启动存储节点,最后启动SQL节点

四、功能测试:

到管理节点查看下相关服务状态

ndb_mgm> show

Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @10.10.1.65  (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0, Master)
id=3    @10.10.1.58  (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)

id=1    @10.10.1.151  (mysql-5.1.37 ndb-7.0.8)

[mysqld(API)]   2 node(s)

id=4    @10.10.1.65  (mysql-5.1.37 ndb-7.0.8)
id=5    @10.10.1.58  (mysql-5.1.37 ndb-7.0.8)

可以看到这里的数据节点、管理节点、sql节点都是正常的.

现在我们在其中一个数据节点上进行相关数据库的创建,然后到另外一个数据节点上看看数据是否同步

# /usr/local/mysql/bin/mysql -u root -p

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
|mysql             |
| ndb_2_fs           |
|test              |
+--------------------+
mysql> create database aa;
mysql> use aa
mysql> CREATE TABLE ctest2 (i INT) ENGINE=NDB;

//这里必须指定数据库表的引擎为NDB,否则同步失败

mysql> INSERT INTO ctest2 () VALUES(1);
mysql> SELECT * FROM ctest2;
+------+
| i    |
+------+
|    1 |
+------+

现在到另外一个数据节点查看下aa数据库是否同步过来了.

#/usr/local/mysql/bin/mysql -u root -p

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
|aa                |
|bb                |
|mysql             |
| ndb_3_fs           |
|test              |
+--------------------+
mysql> use aa
mysql> select * from ctest2;
+------+
| i    |
+------+
|    1 |
+------+

从上面可以看到数据已经同步了,mysql集群环境已经搭建完成.

五、破坏性测试:

在上面可以看到10.10.1.65作为主的数据节点,我现在把10.10.1.65这台机器关闭,看下有什么结果

 ndb_mgm> show

 Cluster Configuration
 ---------------------
 [ndbd(NDB)]     2 node(s)
 id=2 (not connected, accepting connect from 10.10.1.65)
 id=3    @10.10.1.58  (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0, Master)

 [ndb_mgmd(MGM)] 1 node(s)

 id=1    @10.10.1.151  (mysql-5.1.37 ndb-7.0.8)

 [mysqld(API)]   2 node(s)

 id=4 (not connected, accepting connect from any host)
 id=5    @10.10.1.58  (mysql-5.1.37 ndb-7.0.8)

从上面可以发现现在10.10.1.65这台机器的数据节点和sql节点已经连接不上了,10.10.1.58成为了主数

据节点,我们现在在10.10.1.58数据节点上创建一个表,然后恢复10.10.1.65的数据节点,看下它是否

把数据同步过来了.

先在10.10.1.58数据节点做如下操作:

 mysql> create table ctest3(idint(11)) engine=NDB;

 mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| ctest2       |
| ctest3       |
+--------------+
mysql> insert into ctest3 values(1);
mysql> select * from ctest3;
+------+
| id   |
+------+
|    1 |
+------+

然后我们恢复10.10.1.65数据节点,查看下ctest3数据是否同步过来了.

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
|aa                |
|bb                |
|mysql             |
| ndb_2_fs           |
|test              |
+--------------------+
mysql> use aa
mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| ctest        |
| ctest2       |
| ctest3       |
+--------------+
mysql> select * from ctest3;
+------+
| id   |
+------+
|    1 |
+------+

可以看到10.10.1.65数据节点已经把10.10.1.58数据节点的数据同步过来了,说明mysql集群是没有问题的了.随后做下mysql性能相关的测试.

六、sql更密码及远程访问:

开启Mysql数据库的远程连接权限,密码改为123456

# /usr/local/mysql/bin/mysql -u root  -p

use mysql

grant all privileges on *.* to 'root' @'%'identified by '123456';
flush privileges;FLUSH PRIVILEGES;

7

http://xylonwang.iteye.com/blog/563063