MySQL Cluster是一个基于NDB Cluster存储引擎的完整的分布式数据库系统。不仅仅具有高可用性,而且可以自动切分数据,冗余数据等高级功能。和Oracle Real Cluster Application不太一样的是,MySQL Cluster 是一个Share Nothing的架构,各个MySQL Server之间并不共享任何数据,高度可扩展以及高度可用方面的突出表现是其最大的特色。虽然目前还只是MySQL家族中的一个新兴产品,但是已经有不少企业正在积极的尝试使用了。但是好像还不是很多,我常常听见人家问这玩意,包括一些企业,虽然该产品还不是很成熟,还有很多缺陷,但是我还是打算学习学习^_^
MySQL Cluster 介绍
简单的说,MySQL Cluster 实际上是在无共享存储设备的情况下实现的一种完全分布式数据库系统,其主要通过 NDB Cluster(简称 NDB)存储引擎来实现。MySQL Cluster 刚刚诞生的时候可以说是一个可以对数据进行持久化的内存数据库,所有数据和索引都必须装载在内存中才能够正常运行,但是最新的 MySQL Cluster 版本已经可以做到仅仅将所有索引装载在内存中即可,实际的数据可以不用全部装载到内存中。
一个 MySQL Cluster 的环境主要由以下三部分组成:
(1)SQL 层的 SQL 服务器节点(后面简称为 SQL 节点);也就是我们常说的MySQL Server。主要负责实现一个数据库在存储层之上的所有事情,比如连接管理,Query 优化和响应 ,Cache 管理等等,只有存储层的工作交给了NDB 数据节点去处理了。也就是说,在纯粹的MySQL Cluster 环境中的SQL 节点,可以被认为是一个不需要提供任何存储引擎的MySQL服务器,因为他的存储引擎有Cluster 环境中的NDB 节点来担任。所以,SQL 层各MySQL服务器的启动与普通的MySQL Server 启动也有一定的区别,必须要添加ndbcluster参数选项才行。我们可以添加在my.cnf配置文件中,也可以通过启动命令行来指定。
(2)Storage 层的 NDB 数据节点;也就是上面说的NDB Cluster。最初的NDB是一个内存式存储引擎,当然也会将数据持久化到存储设备上。但是最新的NDB Cluster存储引擎已经改进了这一点,可以选择数据是全部加载到内存中还是仅仅加载索引数据。NDB 节点主要是实现底层数据存储功能,来保存Cluster 的数据。每一个Cluster节点保存完整数据的一个fragment,也就是一个数据分片(或者一份完整的数据,视节点数目和配置而定),所以只要配置得当,MySQL Cluster在存储层不会出现单点的问题。一般来说,NDB 节点被组织成一个一个的NDB Group,一个 NDB Group实际上就是一组存有完全相同的物理数据的NDB节点群。
上面提到了NDB 各个节点对数据的组织,可能每个节点都存有全部的数据也可能只保存一部分数据,主要是受节点数目和参数来控制的。首先在 MySQL Cluster主配置文件(在管理节点上面,一般为 config.ini)中,有一个非常重要的参数叫NoOfReplicas,这个参数指定了每一份数据被冗余存储在不同节点上面的份数,该参数一般至少应该被设置成2,也只需要设置成2就可以了。因为正常来说,两个互为冗余的节点同时出现故障的概率还是非常小的,当然如果机器和内存足够多的话,也可以继续增大来更进一步减小出现故障的概率。此外,一个节点上面是保存所有的数据还是一部分数据还受到存储节点数目的限制。NDB 存储引擎首先保证NoOfReplicas参数配置的要求来使用存储节点,对数据进行冗余,然后再根据节点数目将数据分段来继续使用多余的NDB节点。分段的数目为节点总数除以NoOfReplicas 所得。
(3)负责管理各个节点的 Manage 节点主机;管理节点负责整个Cluster集群中各个节点的管理工作,包括集群的配置,启动关闭各节点,对各个节点进行常规维护,以及实施数据的备份恢复等。管理节点会获取整个Cluster环境中各节点的状态和错误信息,并且将各 Cluster 集群中各个节点的信息反馈给整个集群中其他的所有节点。由于管理节点上保存了整个Cluster 环境的配置,同时担任了集群中各节点的基本沟通工作,所以他必须是最先被启动的节点。
下面是一幅 MySQL Cluster 的基本架构图(出自 MySQL 官方文档手册):
通过图中我们可以更清晰的了解整个 MySQL Cluster 环境各个节点以及客户端应用之间的关系。
MySQL Cluster 环境搭建
搭建 MySQL Cluster首先需要至少一个管理节点主机来实现管理功能,一个SQL节点主机来实现MySQL server功能和两个ndb节点主机实现NDB Cluster的功能。我在这里测试使用双SQL节点来搭建测试环境,具体信息如下:
1、服务器准备
a) MySQL节点1 192.168.0.70 b) MySQL节点2 192.168.0.60 c) ndb节点1 192.168.0.50 d) ndb节点2 192.168.0.40 e) 管理节点 192.168.0.30
2、软件安装
测试环境(5台服务器均一样,不是必须的,所以服务器均已关闭iptables和selinux,生产环境请自行开放相关端口)
[root@localhost ~]# uname -a Linux localhost.localdomain 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
安装 MySQL 节点:
sql节点1: 192.168.0.70
sql节点2: 192.168.0.60
下载安装包:mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz,我这里使用二进制编译好了的,同学们可以自己下载源码包编译。这里操作一台SQL节点服务器,另外一台SQL节点服务器也是相同的,都执行如下安装步骤。
[root@192.168.0.70 ~]# wget https://downloads.skysql.com/archives/mysql-cluster-gpl-7.2/mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz
[root@192.168.0.70 ~]# groupadd mysql [root@192.168.0.70 ~]# useradd -r -g mysql mysql [root@192.168.0.70 ~]# tar xf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz -C /usr/local/ [root@192.168.0.70 ~]# cd /usr/local/ [root@192.168.0.70 local]# ln -s mysql-cluster-gpl-7.2.4-linux2.6-x86_64 mysql [root@192.168.0.70 local]# cd mysql [root@192.168.0.70 mysql]# chown -R mysql . [root@192.168.0.70 mysql]# chgrp -R mysql . [root@192.168.0.70 mysql]# mkdir /data/mysql [root@192.168.0.70 mysql]# chown -R mysql.mysql /data/mysql/ [root@192.168.