MySQL 簇是 MySQL 适合于分布式计算环境的高实用、高冗余版本。它采用了 NDB 簇存
储引擎,允许在 1 个簇中运行多个 MySQL 服务器。NDB 是一种“内存中”存储引擎,它具
有可用性高和数据一致性好的特点。
能够使用多种故障切换和负载平衡选项配置 NDB 存储引擎,但以簇层面上的存储引擎
开始最简单。MySQL 簇的 NDB 存储引擎包含完整的数据集,仅取决于簇本身内的其他数据。



簇的概念
mysql簇是一种技术,
MySQL 簇将标准的 MySQL 服务器与名为 NDB 的“内存中”簇式存储引擎集成了起来。
术语 NDB 指的是与存储引擎相关的设置部分,而术语“MySQL 簇”指的是 MySQL 和 NDB 存
储引擎的组合。
MySQL 簇由一组计算机构成,每台计算机上均运行着多种进程,包括 MySQL 服务器,
NDB 簇的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于簇中这些组件的
关系,请参见下图:
所有这些程序一起构成了 MySQL 簇。将数据保存到 NDB 簇存储引擎中时,表将保存在
数据节点内。能够从簇中所有其他 MySQL 服务器直接访问这些表。因此,在将数据保存在
簇内的工资表应用程序中,如果某一应用程序更新了 1 位雇员的工资,所有查询该数据的其
他 MySQL 服务器能立刻发现这种变化。
对于 MySQL 簇,保存在数据节点内的数据可被映射,簇能够处理单独数据节点的故障,
除了少数事务将因事务状态丢失而被放弃外,不会产生其他影响。由于事务性应用程序能够
处理事务失败事宜,因而它不是问题源。



目前,MySQL 簇的簇部分可独立于 MySQL 服务器进行配置。在 MySQL 簇中,簇的每个
部分被视为 1 个节点。
有三类簇节点,在最低的 MySQL 簇配置中,至少有三个节点,这三类节点分别是:
  ·管理(MGM)节点:这类节点的作用是管理 MySQL 簇内的其他节点,如提供配置数
据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他
节点之前首先启动这类节点。MGM 节点是用命令 ndb_mgmd 启动的。
  ·数据节点:这类节点用于保存簇的数据。数据节点的数目与副本的数目相关,是
片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有 4 个数据节点。没有必
要有一个以上的副本。数据节点是用命令 ndbd 启动的。
  ·SQL 节点:这是用来访问簇数据的节点。对于 MySQL 簇,客户端节点是使用 NDB
簇存储引擎的传统 MySQL 服务器。典型情况下,SQL 节点是使用命令 mysqld –
ndbcluster 启动的,或将 ndbcluster 添加到 my.cnf 后使用 mysqld 启动。


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

 ·标准 MySQL 客户端:对于 MySQL 簇,它们与标准的(非簇类)MySQL 没有区别。
换句话讲,能够从用 PHP、Perl、C、C++、Java、Python、Ruby 等编写的现有 MySQL
应用程序访问 MySQL 簇。
·管理客户端:这类客户端与管理服务器相连,并提供了优雅地启动和停止节点、启动
和停止消息跟踪(仅对调试版本)、显示节点版本和状态、启动和停止备份等的命令。
 以上摘录自 mysql 文档
详细请登录
http://dev.mysql.com/doc/refman/5.1/zh/ndbcluster.html

mysql簇实验
下载必须软件
wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.2/mysql-cluster-gpl-7.2.4-linux2.6-i686.tar.gz/from/http://mysql.ntu.edu.tw/
环境一览
192.168.3.128 MGM
192.168.3.129 NDBD1
192.168.3.130 NDBD2
192.168.3.131 SQL
安装管理节点,
创建管理节点配置文件

[root@localhost opt]# cat /var/lib/mysql-cluster/config.ini
[NDBD DEFAULT]
 NoOfReplicas=2
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Managment Server
[NDB_MGMD]
HostName=192.168.3.128
# Storage Engines
[NDBD]
HostName=192.168.3.129
DataDir= /usr/local/mysql/data
[NDBD]
HostName=192.168.3.130
DataDir=/usr/local/mysql/data

[MYSQLD]
[MYSQLD]
安装管理节点不需要mysqld二进制文件,只需要mysql cluster 服务端程序 ndb_mgmd ndb_mgm

tar -xf mysql-cluster-gpl-7.2.4-linux2.6-i686.tar.gz
cp bin/ndb_mgm* /usr/local/bin/
chmod +x /usr/local/bin/ndb_mgm*
启动MGM
ndb_mgmd -f /var/lib/mysql-cluster/config.ini
查看mgm状态
[root@localhost opt]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.3.129  (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master)
id=3    @192.168.3.130  (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.3.128  (mysql-5.5.19 ndb-7.2.4)

[mysqld(API)]   2 node(s)
id=4    @192.168.3.131  (mysql-5.5.19 ndb-7.2.4)
id=5 (not connected, accepting connect from any host)



ndbd和sql节点上
创建/etc/my.cnf文件
[root@localhost ~]# cat /etc/my.cnf
[client]
socket=/usr/local/mysql/sock/mysql.sock
[mysqld]
ndbcluster
datadir=/usr/local/mysql
socket=/usr/local/mysql/sock/mysql.sock
ndb-connectstring=192.168.3.128
old_passwords=1
[mysql_cluster]
ndb-connectstring=192.168.3.128

完成后cp一份给192.168.3.130,192.168.3.131
for i in 192.168.3.131 192.168.3.130 ; do scp /etc/my.cnf root@$i:/etc
创建mysql用户,mysql组
[root@localhost ~]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)

解压mysql与/usr/local/mysql下

[root@localhost mysql]# pwd
/usr/local/mysql
[root@localhost mysql]# ls
bin      include         mysql               README   sql-bench
COPYING  INSTALL-BINARY  mysql-test          scripts  support-files
data     lib             ndbinfo             share    test
docs     man             performance_schema  sock
创建sock目录
mkdir sock
设置相应权限
drwxrwxrwx  2 root  mysql  4096 02-24 23:39 bin
-rwxrwxrwx  1 root  mysql 17987 01-31 01:48 COPYING
drwxrwxrwx  5 mysql mysql  4096 02-25 00:15 data
drwxrwxrwx  2 root  mysql  4096 02-24 23:39 docs
drwxrwxrwx  4 root  mysql  4096 02-24 23:39 include
-rwxrwxrwx  1 root  mysql  7604 01-31 01:48 INSTALL-BINARY
drwxrwxrwx  3 root  mysql  4096 02-24 23:39 lib
drwxrwxrwx  4 root  mysql  4096 02-24 23:39 man
drwx------  2 root  mysql  4096 02-24 23:48 mysql
drwxrwxrwx 10 root  mysql  4096 02-24 23:39 mysql-test
drwx------  2 root  mysql  4096 02-24 23:48 ndbinfo
drwx------  2 root  mysql  4096 02-24 23:48 performance_schema
-rwxrwxrwx  1 root  mysql  2552 01-31 01:47 README
drwxrwxrwx  2 root  mysql  4096 02-24 23:39 scripts
drwxrwxrwx 29 root  mysql  4096 02-24 23:39 share
drwxrwxrwx  2 mysql mysql  4096 02-24 23:45 sock
drwxrwxrwx  4 root  mysql  4096 02-24 23:39 sql-bench
drwxrwxrwx  2 root  mysql  4096 02-24 23:39 support-files
drwx------  2 root  mysql  4096 02-24 23:48 test
创建mysql系统数据库,(初始化mysql)
scripts/mysql_install_db --user=mysql
--basedir=/usr/local/mysql --datadir=/usr/local/mysql
创建mysql启动脚本,并且开机启动
 cp support-files/mysql.server /etc/init.d/
chmod +x /etc/init.d/mysq.server
chkconfig --add mysql.server
chkconfig mysql.server on


基本上结束了!启动顺序为 MGM NODE SQL
[root@localhost opt]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.3.129  (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master)
id=3    @192.168.3.130  (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.3.128  (mysql-5.5.19 ndb-7.2.4)

[mysqld(API)]   2 node(s)
id=4    @192.168.3.131  (mysql-5.5.19 ndb-7.2.4)
id=5 (not connected, accepting connect from any host)
查看结果!


测试后续添加,时间比较仓促!




另外,在贴一篇RH5U5下RPM安装mysql CLUSTER

实验所用到的软件包:
MySQL-client-community-5.0.51a-0.rhel4.i386.rpm
MySQL-clustermanagement-community-5.0.51a-0.rhel4.i386.rpm
MySQL-clusterstorage-community-5.0.51a-0.rhel4.i386.rpm
MySQL-clustertools-community-5.0.51a-0.rhel4.i386.rpm
MySQL-server-community-5.0.51a-0.rhel4.i386.rpm
perl-HTML-Template-2.9-1.el4.rf.noarch.rpm 或者
perl-HTML-Template-2.9-1.el5.rf.noarch.rpm

   Server1: 192.168.0.1 数据库服务器
   Server2: 192.168.0.2 数据库服务器
   Server3: 192.168.0.3 集群管理节点
  Servers1 和 Server2 作为实际配置 MySQL 集群的服务器。Server3 作为管理节点,Server3 的系统进行很小的调整并且无需安装 MySQL。
----------------------------------------
配置过程:
MySQL服务器端配置:
rpm -ivh MySQL-client-community-5.0.51a-0.rhel4.i386.rpm
rpm -ivh MySQL-server-community-5.0.51a-0.rhel4.i386.rpm
rpm -ivh MySQL-clusterstorage-community-5.0.51a-0.rhel4.i386.rpm
service mysqld stop

管理节点服务器配置:
rpm -ivh MySQL-clustermanagement-community-5.0.51a-0.rhel4.i386.rpm
rpm -ivh perl-HTML-Template-2.9-1.el5.rf.noarch.rpm
rpm -ivh MySQL-clustertools-community-5.0.51a-0.rhel4.i386.rpm
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vi config.ini
写入:
 [NDBD DEFAULT]
 NoOfReplicas=2
 [MYSQLD DEFAULT]
 [NDB_MGMD DEFAULT]
 [TCP DEFAULT]
 # Managment Server
 [NDB_MGMD]
 HostName=192.168.0.3 #管理节点服务器 Server3 的 IP 地址
 # Storage Engines
 [NDBD]
 HostName=192.168.0.1 #MySQL 集群 Server1 的 IP 地址
 DataDir= /var/lib/mysql-cluster
 [NDBD]
 HostName=192.168.0.2 #MySQL 集群 Server2 的 IP 地址
 DataDir=/var/lib/mysql-cluster
# 以下 2 个[MYSQLD]可以填写 Server1 和 Server2 的主机名。
# 但为了能够更快的更换集群中的服务器,推荐留空,否则更换服务器后必须对这个配置进行更改。
 [MYSQLD]
 [MYSQLD]

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

MySQL服务器端配置:
所有的数据库服务器进行如下操作
vi /etc/my.cnf
写入:
[mysqld]
 ndbcluster
 ndb-connectstring=192.168.0.3 #Server3 的 IP 地址
[mysql_cluster]
 ndb-connectstring=192.168.0.3 #Server3 的 IP 地址

mkdir /var/lib/mysql-cluster
cd /var/lib
chown mysql:mysql mysql-cluster
ndbd - initial        
service mysql start
可以把/usr/local/mysql/bin/ndbd 加到/etc/rc.local 中实现开机启动
注意:只有在第一次启动 ndbd 时或者对 Server3 的 config.ini 进行改动后才需要使#用--initial 参数。平常就不需要使用--initial 参数了。

查看工作状态
回到管理节点服务器上
ndb_mgm 查看相关的结果

----------------------------------------

测试
在 Server1 中添加一个库,使用 engine=nbdcluster 建立指定可以被 MYSQL-CLUSTER 所使用的表。然后看看另外一个节点的效果
mysql
use test;
create table uplooking(id int,name char(10))engine=ndbcluster;
insert into table uplooking(id,name) values (10,'test');
select * from uplooking;
然后去另外一个节点看效果
推荐使用一个大一点的数据库备份导入 。这样你可以顺便查看 MYSQL 簇的
工作效率。根据之前的测试,MYSQL 的 MASTER/SLAVER 方式每秒可以录入 2500条数据,现在你可以测试一下使用 MYSQL 簇每秒可以录入多少。
如果上述正常,则换到 Server2 上重复上面的测试,观察效果。