分类: Mysql/postgreSQL
2007-12-02 10:12:59
本文介绍如何规划、安装、配置及运行mysql cluster,这里是基于3台、4台服务器(将ndnd和mysqld分开安装)的MySQL Cluster。并且实现任意一台DataNode服务器出现问题或宕机时MySQL依然能够继续运行,该cluster是允许在无共享的系统中部署“内存中”数据库的Cluster。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。
MySQL Cluster将标准的MySQL服务器与名为NDB的“内存中”式存储引擎集成了起来。在我们的文档中,术语NDB指的是与存储引擎相关的设置部分,而术语“MySQL Cluster”指的是MySQL和NDB存储引擎的组合。
概念词解释:
1) NDB:
NDB是一种“内存中”存储引擎,它具有可用性高和数据一致性好的特点, 能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但以Cluster层面上的存储引擎开始最简单。MySQL Cluster的NDB存储引擎包含完整的数据集,仅取决于Cluster本身内的其他数据;
2) 管理(MGM)节点:
该节点的作用是管理MySQL Culter内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令ndb_mgmd启动的;
3) 数据节点::
用于保存Culter的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。没有必要有一个以上的副本。数据节点是用命令ndbd启动的;
4) SQL节点::
这是用来访问Culter数据的节点。对于MySQL Culter,客户端节点是使用NDB Culter存储引擎的传统MySQL服务器。典型情况下,SQL节点是使用命令mysqld –ndbcluster启动的,或将ndbcluster添加到my.cnf后使用mysqld启动;
5) 标准MySQL客户端:
能够从用PHP、Perl、C、C++、Java、Python、Ruby等编写的现有MySQL应用程序访问MySQL Culter;
6) 管理客户端:
这类客户端与管理服务器相连,并提供了优雅地启动和停止节点、启动和停止消息跟踪(仅对调试版本)、显示节点版本和状态、启动和停止备份等的命令。
MySQL Cluster由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB数据节点,管理服务器,以及(可能)专门的数据访问程序。所有这些程序一起构成了MySQLCulter。将数据保存到NDBCulter存储引擎中时,表将保存在数据节点内。能够从Culter中所有其他MySQL服务器直接访问这些表。因此,在将数据保存在Culter内的数据表应用程序中,如果某一应用程序更新了,则所有查询该数据的其他MySQL服务器能立刻发生变化。下图介绍关于Cluster中这些组件的关系到由NDB存储引擎和一些MySQL服务器构成的MySQL Cluster的实现,请参见下图:
这里建立具有2个节点的Cluster,每个节点位于不同的主机上,而且在典型的以太网中具有固定的网络地址。
节点 |
机器环境 |
IP地址 |
管理(MGM)节点/ |
操作系统:RedHat AS4-U3 |
192.168.0.13 |
数据(NDBD)节点"A" |
操作系统:RedHat AS4-U3 |
192.168.0.11 |
数据(NDBD)节点"B" |
操作系统:RedHat AS4-U3 |
192.168.0.12 |
注意!
虽然这是基于2台服务器的MySQL Cluster,但也必须有额外的第三台服务器作为管理节点,但这台服务器可以在集群启动完成后关闭。同时需要注意的是并不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群,但是这样的架构,一旦一台服务器宕机之后集群就无法继续正常工作了,这样也就失去了集群的意义了。出于这个原因,就需要有第三台服务器作为管理节点运行, 这三台机器都安装了RedHat AS4-U3版本,首先保证把系统中没有一个包带有mysql的,有的话就rpm –e做删除
这里分别对3台服务器(ndb--/mysqld、Data Node X 2)做以下安装步骤:
1) 检查确认当前系统的mysql:
清除准备安装MySQL的服务器上linux自带的mysql-server,
[root@mysql1 ~]# rpm -qa|grep mysql-server
注意:如果有就删除(rpm -e mysql-server)
[root@mysql1 ~]# rpm -qa|grep mysql
mysql-
mysqlclient10-
libdbi-dbd-mysql-
mysql-devel-
[root@mysql1 ~]#
[root@ mysql1 ~]# mv /etc/my.cnf /etc/my.cnf.bak
2) 安装二进制程序包:
[root@mysql1 etc]# cd /usr/local/
[root@mysql1 local]# cp /u01/mysql-max-
[root@mysql1 local]# tar zxvf mysql-max-
…… ……
[root@mysql1 local]# mv mysql-max-
[root@mysql1 local]#
3) 创建mysql组和用户:
[root@mysql1 local]# groupadd mysql
[root@mysql1 local]# useradd -g mysql mysql
[root@mysql1 local]#
4) 创建mysql许可表:
[root@mysql1 local]# su - mysql
[mysql@mysql1 ~]$ su - root
Password:
[root@mysql1 ~]# cd /usr/local/mysql
[root@mysql1 mysql]# scripts/mysql_install_db --user=mysql
Installing all prepared tables
Fill help tables
To start mysqld at boot time you have to copy support-files/mysql.server
to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
./bin/mysqladmin -u root password 'new-password'
./bin/mysqladmin -u root -h ce163 password 'new-password'
See the manual for more instructions.
You can start the MySQL daemon with:
cd . ; ./bin/mysqld_safe &
You can test the MySQL daemon with the benchmarks in the 'sql-bench' directory:
cd sql-bench ; perl run-all-tests
Please report any problems with the ./bin/mysqlbug script!
The latest information about MySQL is available on the web at
Support MySQL by buying support/licenses at
[root@mysql1 mysql]#
5) 设置文件所有权:
[root@mysql1 mysql]# chown -R mysql:mysql .
[root@mysql1 mysql]# cp support-files/my-medium.cnf /etc/my.cnf
[root@mysql1 mysql]#
其他两个服务器依次顺序安装
1) 在3台机器上分别配置系统服务
(配置mysql为系统服务,方便我们启动mysql和系统自启动):
[root@mysql1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysql
[root@mysql1 mysql]# chmod +x /etc/rc.d/init.d/mysql
[root@mysql1 mysql]# chkconfig –
[root@mysql1 mysql]# chkconfig –add mysql
2) 在2台(192.168.0.12和192.168.0.12)data node机器上分别配置ndbd
(配置ndbd就是为了系统重启后能自动运行该服务):
[root@mysql1 mysql]# ln -s /usr/local/mysql/bin/ndbd /usr/bin/ndbd
[root@mysql1 mysql]# vi /etc/rc.local
添加一行ndbd后保存退出!
3) 分别配置存储节点(包含sql节点)my.cnf文件:
[root@mysql1 mysql]# vi /etc/my.cnf
#找到myisam_sort_buffer_size =
ndbcluster
ndb-connectstring=192.168.0.13
#然后到my.cnf的最后一行增加以下六行:
[ndbd]
connect-string=192.168.0.13
[ndb_mgm]
connect-string=192.168.0.13
[ndb_mgmd]
config-file=/var/lib/mysql-cluster
修改完毕后,保存推出!
# mkdir /var/lib/mysql-cluster
4) Mysqld节点机(192.168.0.13)单独配置:
a) 配置config.ini文件
# cd /var/lib/mysql-cluster
# touch config.ini
# vi config.ini 键入如下信息
[NDBD DEFAULT]
NoOfReplicas=2
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Managment Server
[NDB_MGMD]
HostName=192.168.0.13
# Storage Engines
[NDBD]
HostName=192.168.0.11
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName=192.168.0.12
DataDir=/var/lib/mysql-cluster
[MYSQLD]
Id=11
HostName=192.168.0.11
[MYSQLD]
Id=12
HostName=192.168.0.12
[MYSQLD]
Id=13
HostName=192.168.0.13
保存退出!
b) 配置ndbd_mgm和ndnd_mgmd文件
(这里的配置是为了系统重启后能自动运行该服务和指向cluster的配置文件):
[root@mysql1 mysql]# ln -s /usr/local/mysql/bin/ndb_mgm /usr/bin/ndb_mgm
[root@mysql1 mysql]# ln -s /usr/local/mysql/bin/ndb_mgmd /usr/bin/ndb_mgmd
[root@mysql1 mysql]# vi /etc/rc.local后添加如下一行
/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
保存退出!
1) 启动mysqld(192.168.0.13)上服务
执行的命令如下,并检查
# /usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
# service mysqld start
#ndb_mgm
2) 分别启动数据库节点服务器(192.168.0.11和192.168.0.12)
执行的命令如下
# /usr/local/mysql/bin/ndbd --initial
注:只在第一次启动ndbd时使用--initial参数
#service mysql start
1) 在192.168.0.13上检查当前的状态:
[root@mysql13 ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.0.13:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.11 (Version:
id=3 @192.168.0.12 (Version:
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.13 (Version:
[mysqld(API)] 3 node(s)
id=11 @192.168.0.11 (Version:
id=12 @192.168.0.12 (Version:
id=13 @192.168.0.13 (Version:
ndb_mgm>
2) 创建表和插入数据并在其他两个数据库上检查数据是否同步:
在.13上创建表customers插入一条数据:
mysql> use test;
Database changed
mysql> show tables;
Empty set (0.06 sec)
mysql> create table customers ( custcode char(10), username varchar(10), UNIQUE INDEX cust_inx (custcode) ) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (1.22 sec)
mysql> insert into customers (custcode,username) values ('sung','sungang');
Query OK, 1 row affected (0.01 sec)
mysql> select * from customers;
+----------+----------+
| custcode | username |
+----------+----------+
| sung | sungang |
+----------+----------+
1 row in set (0.01 sec)
mysql>
转到.11和.12上做检查数据是否同步并同时在.11上插入一条数据:
mysql> use test;
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| customers |
+----------------+
1 row in set (0.03 sec)
mysql> select * from customers;
+----------+----------+
| custcode | username |
+----------+----------+
| sung | sungang |
+----------+----------+
1 row in set (0.10 sec)
mysql>
mysql> insert into customers (custcode,username) values ('shiyg','shiyouguang');
Query OK, 1 row affected, 1 warning (0.02 sec)
mysql> select * from customers;
+----------+------------+
| custcode | username |
+----------+------------+
| shiyg | shiyouguan |
| sung | sungang |
+----------+------------+
2 rows in set (0.04 sec)
mysql>
分别到.12和.13上检查已经同步
同样的测试可以将.11或者.12的网线拔掉(可以直接用命令down也是一样),发现其中的database和.13同样保持数据同步,如果将database的网络恢复则直接启动该服务器的ndbd即可。
3) 注意事项
Ø mysql cluster在启动过程中必须提前启动管理节点服务器,等管理节点启动成功后,再启动其它节点;
Ø 关闭整个集群的时候最好最后关闭管理节点;
Ø 管理节点宕机后,剩下的某台主机再宕机后,这样就失去了集群的意义了。管理节点最好是24小时待命;
Ø 创建表的时候需要定义表中的ENGINE=子句,如果创建的时候没有加上则可以使用altel来加入(ALTER TABLE customers ENGINE=NDBCLUSTER;)。