MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,加强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性获得保障。html
Mysql群集(Cluster)简介node
MySQL群集须要有一组计算机,每台计算机的角色多是不同的。MySQL群集中有三种节点:管理节点、数据节点和SQL节点。群集中的某计算机多是某一种节点,也多是两种或三种节点的集合。这三种节点只是在逻辑上的划分,因此它们不必定和物理计算机是一一对应的关系。mysql
管理节点(也能够称管理服务器)主要负责管理数据节点和SQL节点,还有群集配置文件和群集日志文件。它监控其余节点的工做状态,可以启动、关闭或重启某个节点。其余节点从管理节点检索配置数据,当数据节点有新事件时就把事件信息发送给管理节点并写入群集日志。linux
数据节点用于存储数据。sql
SQL节点跟通常的MySQL服务器是同样的,咱们能够经过它进行SQL操做。数据库
下图中画出了三种群集节点及应用程序间的关系:安全
1、配置环境:服务器
OS:Linux CentOS 6.3Bit64tcp
MySQL:mysql-cluster-gpl-7.2.12-linux2.6-x86_64.tar.gz分布式
(注意:需用Cluster版本,可在官网上下载http://dev.mysql.com/downloads/cluster/#downloads)
节点配置状况:
hostname IP地址应用服务
DB1 172.16.10.160 MGM
DB2 172.16.10.161 NDBD1,MYSQLD
DB3 172.16.10.162 NDBD2, MYSQLD
DB4 172.16.10.254 MYSQLD
我这里数据节点和sql节点用相同的2台机器承担,sql节点也可分开,例db4.
2、管理节点:
(一)安装管理节点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_mgmd是mysql 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
3、数据节点和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节点。
4、功能测试:
到管理节点查看下相关服务状态
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集群环境已经搭建完成.
5、破坏性测试:
在上面能够看到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性能相关的测试.
6、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;
http://xylonwang.iteye.com/blog/563063