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 上重复上面的测试,观察效果。