一、集成步骤
Mysql群集(Cluster)简介
MySQL群集需要有一组计算机,每台计算机的角色可能是不一样的。MySQL群集中有三种节点:管理节点、数据节点和SQL节点。群集中的某计算机可能是某一种节点,也可能是两种或三种节点的集合。这三种节点只是在逻辑上的划分,所以它们不一定和物理计算机是一一对应的关系。
管理节点(也可以称管理服务器)主要负责管理数据节点和SQL节点,还有群集配置文件和群集日志文件。它监控其他节点的工作状态,能够启动、关闭或重启某个节点。其他节点从管理节点检索配置数据,当数据节点有新事件时就把事件信息发送给管理节点并写入群集日志。
数据节点用于存储数据。
SQL节点跟一般的MySQL服务器是一样的,我们可以通过它进行SQL操作。
下图中画出了三种群集节点及应用程序间的关系:
MySQLCluster的下载
我们使用的MysqlServer已经不能满足群集的要求,配置群集需要使用MySQLCluster。
MySQLCluster支持Linux、Mac OSX、Solaris和Windows操作系统。鸡啄米以Windows系统下的MySQLCluster版本MySQLCluster 7.2.5为例说明MySQLCluster的配置和启动。
MySQLCluster的下载地址是http://dev.mysql.com/downloads/cluster。如果你的操作系统是32位的,就选择Windows(x86, 32-bit), ZIP Archive下载,大小为228.9M,如果是64位的,就下载Windows(x86, 64-bit), ZIP Archive,大小为232.7M。它们都是免安装的二进制版本。
MySQLCluster的配置
首先找三台电脑,或者是开三个虚拟机,管理节点部署在一台机子上,其他两台每台都部署一个数据节点和一个SQL节点。这里以两台机子举例,其中一台机器A(IP为192.168.193.90)部署管理节点、数据节点和SQL节点,另一台机器B(IP为192.168.193.50)部署数据节点和SQL节点。
其实最好不要将管理节点跟数据节点部署到一台机子上,因为如果数据节点宕机会导致管理节点也不可用,整个MySQL群集就都不可用了。所以一个MySQL群集理想情况下至少有三台服务器,将管理节点单独放到一台服务器上。暂以两台举例,只是为了说明三种节点的配置启动方法。
1.将上面下载的安装包解压,并改文件夹名为mysql,因为需要多次在命令行中操作,所以名字改短后更容易输入。
2.配置管理节点
在机器A的C盘中新建文件夹mysql,然后在此文件夹下新建子目录bin和mysql-cluster,再将安装包解压后的mysql\bin中的ndb_mgm.exe和ndb_mgmd.exe拷贝到C:\mysql\bin下。在目录C:\mysql\bin下新建cluster-logs目录、config.ini文件和my.ini文件。
config.ini文件的内容如下:
my.ini中的内容为:
3.配置数据节点
在机器A中新建文件夹C:\mysqlcluster\datanode\mysql,然后在此文件夹中继续新建子目录bin和cluster-data,bin下再建一个子目录也叫cluster-data。
将安装包解压文件夹中mysql\bin中的ndbd.exe拷贝到C:\mysqlcluster\datanode\mysql\bin下,并在C:\mysqlcluster\datanode\mysql中新建my.ini文件,文件内容为:
因为两台主机的数据节点的配置是一样的,所以我们可以直接将机器A中的文件夹C:\mysqlcluster拷贝到机器B的C盘下。
4.配置SQL节点
在机器A的C:\mysqlcluster下新建子目录sqlnode,将安装包解压文件夹mysql整个拷贝到这个子目录下,然后在C:\mysqlcluster\sqlnode\mysql下新建my.ini文件,文件内容为:
之后也把C:\mysqlcluster\sqlnode文件夹整个拷贝到机器B的相同目录下。
MySQLCluster的启动
三种节点服务启动时,一定要按照先启动管理节点,后启动数据节点,再启动SQL节点的顺序进行。
1.启动管理节点
在机器A中打开命令行窗口,切到C:\mysql\bin目录,输入:
ndb_mgmd -f config.ini --configdir=C:\mysql\mysql-cluster
本机截图:
回车,管理节点服务就启动了,命令行上可能没有任何提示信息,可以打开C:\mysql\bin\cluster-logs\ndb_1_cluster.log日志文件查看启动信息。注意,此命令行窗口不能关闭,除非你想停止服务。
注:我们也可以将其做成服务,在命令行中输入:
ndb_mgmd --install=ndb_mgmd -f config.ini --configdir=C:\mysql\mysql-cluster
2.启动数据节点
在机器A中打开一个新的命令行窗口,切到目录C:\mysqlcluster\datanode\mysql\bin,输入:
ndbd
回车,数据节点就启动了。
注:我们也可以将其做成服务,在命令行中输入:
ndbd --install=ndbd
以相同的方法在机器B中启动数据节点服务。
如何查看是否启动成功呢?我们可以在机器A中再新开一个命令行窗口,切到目录C:\mysql\bin,输入:
ndb_mgm
回车,然后再输入:
ALLSTATUS
回车,就可以看到数据节点的连接信息了。
3.启动SQL节点
在机器A中继续打开一个新的命令行窗口,切到目录C:\mysqlcluster\sqlnode\mysql\bin,输入:
mysqld --console
回车,SQL节点启动。
注:我们也可以将其做成服务,输入:
mysqld -install mysql
以相同的方法在机器B中启动SQL节点。
想要查看SQL节点的启动情况可以在机器B中同样打开新命令行,输入:
ndb_mgm
回车,再输入:
SHOW
回车,就可以看到SQL节点的连接情况了。
测试MySQLCluster
我们需要测试三种情况:
1.在任一SQL节点对数据节点进行操作后,各数据节点是否能够实现数据同步。例如,我们在机器A上新创建一个数据库myDB,然后再建一个表student(新建表如下命令:createtable student (id int(2)) engine=ndbcluster),插入若干数据,接着我们到机器B上查看是否能看到新的数据库myDB和新的表student以及插入数据。
2.当关闭任一数据节点后,在所有SQL节点中进行操作是否不受其影响。例如,我们关闭机器A上的数据节点服务,在两台主机上应该能够继续对数据库进行各种操作。
3.关闭某数据节点进行了数据库操作,然后重新启动,所有SQL节点的操作是否正常。
这里要说明的是,通过SQL节点创建新的数据库时,必须在create语句中使用“engine=ndbcluster”选择ndbcluster数据库引擎,否则创建的数据库不会加到MySQL群集系统中,只能作为普通的数据库独立使用。
createdatebase cluster;
create table student (idint(2)) engine=ndbcluster)
二、集成原理
一、Mysqlcluster数据节点组内主从同步采用的是同步复制,来保证组内节点数据的一致性。一般通过两阶段提交协议来实现,一般工作过程如下:
a)Master执行提交语句时,事务被发送到slave,slave开始准备事务的提交。
b)每个slave都要准备事务,然后向master发送OK(或ABORT)消息,表明事务已经准备好(或者无法准备该事务)。
c)Master等待所有Slave发送OK或ABORT消息
如果Master收到所有 Slave的OK消息,它就会向所有Slave发送提交消息,告诉Slave提交该事务;
如果Master收到来自任何一个Slave的ABORT消息,它就向所有 Slave发送ABORT消息,告诉Slave去中止事务。
e)每个Slave等待来自Master的OK或ABORT消息。
如果Slave收到提交请求,它们就会提交事务,并向Master发送事务已提交的确认;
如果Slave收到取消请求,它们就会撤销所有改变并释放所占有的资源,从而中止事务,然后向Masterv送事务已中止的确认。
f) 当Master收到来自所有Slave的确认后,就会报告该事务被提交(或中止),然后继续进行下一个事务处理。
由于同步复制一共需要4次消息传递,故mysql cluster的数据更新速度比单机mysql要慢。所以mysql cluster要求运行在千兆以上的局域网内,节点可以采用双网卡,节点组之间采用直连方式。
二、疑问:对cluster进行扩容增加数据节点组时会不会导致数据更新速度降低?
答:不会,数据更新速度会变快。因为数据是分别处理,每个节点组所保存的数据是不一样的,
也能减少锁定。
三、Mysqlcluster将所有的索引列都保存在主存中,其他非索引列可以存储在内存中或者通过建立表空间存储到磁盘上。如果数据发生改变(insert,update,delete等),mysql 集群将发生改变的记录写入重做日志,然后通过检查点定期将数据定入磁盘。由于重做日志是异步提交的,所以故障期间可能有少量事务丢失。为了减少事务丢失,mysql集群实现延迟写入(默认延迟两秒,可配置),这样就可以在故障发生时完成检查点写入,而不会丢失最后一个检查点。一般单个数据节点故障不会导致任何数据丢失,因为集群内部采用同步数据复制。
四、MySQL集群的横向扩展
1.添加数据节点组来扩展写操作,提高 cluster的存储能力。支持在线扩容,先将新的节点加入到clsuter里,启动后用
ALTER ONLINE TABLE table_name REORGANIZEPARTITION
命令进行数据迁移,把数据平均分配到数据节点上。
2.添加Slave仅仅扩展读,而不能做到写操作的横向扩展。
整个系统的平均负载可以描述为:
AverageLoad=∑readload+ ∑writeload /∑capacity
假设每个服务器每秒有10000的事务量,而Master每秒的写负载为4000个事务,每秒的读负载为6000,结果就是:
AverageLoad=6000+4000/10000=100%
现在,添加3个slave,每秒的事务量增加到40000。因为写操作也会被复制,每个写操作执行4次,这样每个slave的写负载就是每秒4000个事务。那么现在的平均负载为:
AverageLoad=6000+4*4000/ 4*10000=55%
五、MySQL集群的优缺点
优点:
a) 99.999%的高可用性
b)快速的自动失效切换
c)灵活的分布式体系结构,没有单点故障
d)高吞吐量和低延迟
e)可扩展性强,支持在线扩容
缺点:
a)存在很多限制,比如:不支持外键
b)部署、管理、配置很复杂
c)占用磁盘空间大,内存大
d)备份和恢复不方便
e) 重启的时候,数据节点将数据 load 到内存需要很长时间
备注:
参考网址:
http://www.jizhuomi.com/software/168.html
http://wenku.baidu.com/view/812196c25fbfc77da269b1d0.html
使用版本:
mysql-cluster-gpl-7.3.7-win32.zip