按照此配置完全可以配置成功!!
一、介绍
========测试环境:Server1:ndbd 192.168.1.225Server2:ndbd 192.168.1.226Server3:mysqld --ndb-cluster 192.168.1.224 (ndbd_mgm ndbd_mgmd也在本机)Server4:LVS 192.168.1.111 (调度主服务器,利用此服务器进行MYSQL的负载均衡,否则MYSQL CLUSTER只做到了数据同步的作用,好像在机制内部MYSQL NDB的各各节点上也会有负载均衡这一说!)操作系统均为RH AS4 所需软件包:mysql-5.1.23-ndb-6.2.15-linux-i686-glibc23.tar.gz下载地址: 首先,明确几个概念(参照下图):ndbd: 数据库节点,需要更大的内存。mysqld --ndb-cluster: MySQL服务器节点,程序直接访问的是这台机器的IP。默认端口仍是3306,。ndbd_mgm ndbd_mgmd:管理节点。管理/查看各库节点和服务器节点的状态,最好自己单独一台服务器,测试发现只要ndbd_mgmd程序死掉,所有的节点全部停止工作. 二、在Server1、Server2、Server3上安装MySQL=================================1.安装:# mv mysql-5.1.23-ndb-6.2.15-linux-i686-glibc23.tar.gz /usr/local/# cd /usr/local/# tar -zxvf mysql-5.1.23-ndb-6.2.15-linux-i686-glibc23.tar.gz# ln -s mysql-5.1.23-ndb-6.2.15-linux-i686-glibc23.tar.gz mysql# groupadd mysql# useradd -g mysql mysql# cd mysql# scripts/mysql_install_db --user=mysql# chown -R mysql:mysql .2.编辑配置文件:
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf# vi /etc/my.cnf 在文件尾加入........................................................................................................................# Options for mysqld process:[MYSQLD]ndbcluster # run NDB enginendb-connectstring=192.168.1.224 # location of MGM node# Options for ndbd process:
[MYSQL_CLUSTER]ndb-connectstring=192.168.1.224 # location of MGM node保存&退出........................................................................................................................3.在Server1、Server2上创建日志文件夹,默认# mkdir /var/lib/mysql-cluster4.在Server3上创建ndb_mgmd启动配置文件:
# mkdir /var/lib/mysql-cluster# cd /var/lib/mysql-cluster# vi config.ini内容如下: Options affecting ndbd processes on all data nodes:[NDBD DEFAULT] NoOfReplicas=2 # Number of replicasDataMemory=80M # How much memory to allocate for data storageIndexMemory=18M # How much memory to allocate for index storage # For DataMemory and IndexMemory, we have used the # default values. Since the "world" database takes up # only about 500KB, this should be more than enough for # this example Cluster setup. # TCP/IP options:[TCP DEFAULT] portnumber=2202 # This the default; however, you can use any # port that is free for all the hosts in cluster # Note: It is recommended beginning with MySQL 5.0 that # you do not specify the portnumber at all and simply allow # the default value to be used instead # Management process options:[NDB_MGMD] hostname=192.168.1.224 # Hostname or IP address of MGM nodedatadir=/var/lib/mysql-cluster # Directory for MGM node logfiles # Options for data node "A":[NDBD] # (one [NDBD] section per data node)hostname=192.168.1.225 # Hostname or IP addressdatadir=/usr/local/mysql/data # Directory for this data node's datafiles # Options for data node "B":[NDBD] hostname=192.168.1.226 # Hostname or IP addressdatadir=/usr/local/mysql/data # Directory for this data node's datafiles # SQL node options:[MYSQLD] [MYSQLD][MYSQLD] #hostname=192.168.1.224 # Hostname or IP address # (additional mysqld connections can be # specified for this node for various # purposes such as running ndb_restore)保存&退出
[MYSQLD]
[MYSQLD][MYSQLD]表示允许有三台MySQL服务器从任何IP访问数据库结点。各参数功能,请参考 ... config-example.html
三、启动服务============Server3 /usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.iniServer1 /usr/local/mysql/bin/ndbd --initial (只在第一次启动ndbd时使用--initial参数,通知ndbd执行初始化启动。初始化启动将删除以前ndbd实例为恢复目的创建的任何文件。它还能重新创建恢复用日志文件。注意,在某些操作系统上,该进程可能会占用较长的时间)Server2 /usr/local/mysql/bin/ndbd --initialServer3 /usr/local/mysql/support-files/mysql.Server start
四、检查工作状态
================回到管理节点服务器Server3上,并启动管理终端:# /usr/bin/ndb_mgm
键入show命令查看当前工作状态:(下面是一个状态输出示例)ndb_mgm> show
Cluster Configuration---------------------[ndbd(NDB)] 2 node(s)id=2 (not connected, accepting connect from 192.168.1.225)id=3 @192.168.1.226 (Version: 5.0.22, Nodegroup: 0, Master)[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.224 (Version: 5.0.22)[mysqld(API)] 3 node(s)
id=4 @192.168.1.224 (Version: 5.0.22)id=5 (not connected, accepting connect from any host)id=6 (not connected, accepting connect from any host)mysqld(API)即mysqld --ndb-cluster,MySQL服务器节点。当前只有Server3 MySQL启动。
如果上面没有问题,现在开始测试MySQL:
注意,这篇文档对于MySQL并没有设置root密码,推荐你自己设置Server1、Server2、Server3的MySQL root密码。在Server3中:
# /usr/local/mysql/bin/mysql> use test;> CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;(一定要加上ENGINE=NDBCLUSTER或ENGINE=NDB,否则各主机无法同步数据!!)> INSERT INTO ctest () VALUES (1);> SELECT * FROM ctest;应该可以看到1 row returned信息(返回数值1)。
如果上述正常,则换到Server1、Server2上重复上面的测试,观察效果,数据库应该是同步刷新的。但首先要启动这两台机器的MySQL服务
# /usr/local/mysql/support-files/mysql.Server start如果都没有问题,那么恭喜成功!FAQ:
失败原因,可能是启动顺序不对。查找所有ndb和sql相关进程,杀掉,重新按顺序来。ps -aux |grep ndbps -aux |grep sqlkill -9 <PID> <PID> ...<PID>/usr/local/mysql/bin/ndb_mgm -e shutdown(此命令会关闭所有主机节点)
五、破坏性测试
==============将Server1或Server2的网线拔掉,观察另外一台集群服务器工作是否正常(可以使用SELECT查询测试)。测试完毕后,重新插入网线即可。如果你接触不到物理服务器,也就是说不能拔掉网线,那也可以这样测试:
在Server1或Server2上:ifconfig eth0 down #如果只有一块网卡,默认是eth0之后在Server3上使用SELECT查询测试。并且在管理节点服务器的管理终端中执行show命令会看到被破坏的那台服务器的状态。
测试完成后,只需要重新启动被破坏服务器的ndbd进程即可:# ndbd注意!前面说过了,此时是不用加--inital参数的!至此,MySQL集群就配置完成,MySQL负载均衡功能完成! ===============================================六.注意事项:1.ndb_mgmd管理服务器,防火墙勿忘开1186端口.2.ndb数据服务器,防火墙勿忘开2202端口.3.LVS主服务器应该打开3306端口.4.创建表时注意,在表后一定要加上ENGINE=NDBCLUSTER或ENGINE=NDB,否则各主机无法同步数据!!===============================================七:用于MySQL簇进程的命令选项1.ndb_mgm -e show (查看各节点状态)2. --skip-ndbcluster (禁止NDB簇存储引擎。对于包含该功能的二进制版本,在默认情况下,该功能是被禁止的,换句话讲,NDB簇存储引擎处于禁止状态,直至使用“—ndbcluster”选项激活了它为止。仅当所编译的服务器支持NDB簇存储引擎时,才能使用该选项。)
--ndb-connectstring=connect_string (使用NDB存储引擎时,通过设置该选项,能够指定分配簇配置数据的管理服务器)
3.ndb>
· SHOW
在使用多个管理节点的簇中,该命令仅显示与当前管理服务器实际相连的数据节点的信息 · node_id START启动由node_id标识的数据节点(或所有数据节点)。
· node_id STOP
停止由node_id标识的数据节点(或所有数据节点)。
· node_id RESTART [-N] [-I]
重启由node_id标识的数据节点(或所有数据节点)。
· node_id STATUS
显示由node_id标识的数据节点(或所有数据节点)的状态信息。
· ENTER SINGLE USER MODE node_id
进入单用户模式,仅允许由节点ID“node_id”标识的MySQL服务器访问数据库。
· EXIT SINGLE USER MODE
退出单用户模式,允许所有的SQL节点(即所有运行的mysqld进程)访问数据库。
· QUIT
中止管理客户端。
· SHUTDOWN
关闭除SQL节点之外的所有簇节点,并退出。
4.用单用户模式,数据库管理员能够将对数据库系统的访问限制在1个MySQL服务器(SQL节点)。进入单用户模式时,与所有其他MySQL服务器的所有连接均将恰当关闭,而且所有正在运行的事务均将被放弃。不允许启动任何新事务.
NDB> ENTER SINGLE USER MODE 5执行该命令而且簇进入单用户模式后,节点ID为5的SQL节点将成为簇中唯一允许的用户 NDB> EXIT SINGLE USER MODE退出单用户模式八.MYSQL CLUSTER 备份与恢复1、在管理节点上进行备份。ndb_mgm> start backup nowaitndb_mgm> Node 3: Backup 4 started from node 1Node 3: Backup 4 started from node 1 completed StartGCP: 43010 StopGCP: 43013 #Records: 2138 #LogRecords: 0 Data: 53068 bytes Log: 0 bytes ndb_mgm> shutdownNode 3: Cluster shutdown initiatedNode 4: Cluster shutdown initiatedNode 4: Node shutdown completed.Node 3: Node shutdown completed.2 NDB Cluster node(s) have shutdown.Disconnecting to allow management server to shutdown.ndb_mgm> exit2、删掉SQL节点的数据。 DROP DATABASE TEST_CLUSTER;3、关闭MYSQLD服务器。[root@localhost bin]# service mysqld stopShutting down MySQL… SUCCESS!4、重新顺序启动所有节点。[root@localhost mysql]# /usr/local/mysql/ndb_mgmd -f /etc/config.ini[root@localhost data]# /usr/local/mysql/bin/ndbd –initial我发现如果不带这个 –initial选项的话,恢复会失败。[root@localhost bin]# service mysqld start
Starting MySQL SUCCESS!4、在NDBD节点上进行恢复。(每个节点都得执行一次,因为数据分散在两个节点上)
第一个节点:[root@localhost BACKUP]#/usr/local/mysql/bin/ndb_restore -n3 -b4 -r -m \–backup_path=/usr/local/mysql/data/BACKUP/BACKUP-4/-r开关是记录集合。
-m是元数据。就是表和库的SCHEMA。Nodeid = 3Backup Id = 4backup path = /usr/local/mysql/data/BACKUP/BACKUP-4/Ndb version in backup files: Version 5.1.21Connected to ndb!!Successfully restored table `test_cluster/def/lk4_test`…Successfully created index `PRIMARY` on `lk4_test`…_____________________________________________________Processing data in table: test_cluster/def/lk4_test54) fragment 1_____________________________________________________…Restored 37 tuples and 0 log entriesNDBT_ProgramExit: 0 - OK
第二个节点:[root@localhost BACKUP-1]#/usr/local/mysql/bin/ndb_restore -n4 -b4 -r \–backup_path=/usr/local/mysql/data/BACKUP/BACKUP-4/Nodeid = 4
Backup Id = 4backup path = /usr/local/mysql/data/BACKUP/BACKUP-4/Ndb version in backup files: Version 5.1.21Connected to ndb!!_____________________________________________________Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 1_____________________________________________________Processing data in table: mysql/def/ndb_apply_status(4) fragment 1_____________________________________________________Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 1_____________________________________________________Processing data in table: test/def/t11(5) fragment 1_____________________________________________________Processing data in table: sys/def/SYSTAB_0(0) fragment 1_____________________________________________________Processing data in table: mysql/def/ndb_schema(2) fragment 1Restored 2 tuples and 0 log entriesNDBT_ProgramExit: 0 - OK
这里完成。5、查看一下有没有数据,为了安全起见。mysql> show databases;+——————–+| Database |+——————–+| information_schema || mysql || test |+——————–+3 rows in set (0.00 sec)没有恢复的数据库?MYSQL现在必须重新建立SCHEMA。mysql> create database test_cluster;
Query OK, 1 row affected (0.33 sec)mysql> use test_cluster;
Database changedmysql> show tables;+——————————+| Tables_in_test_cluster |+——————————+| lk4_test || … |+——————————+27 rows in set (0.11 sec)mysql> select * from cs_comment;
Empty set (0.00 sec)不过MYSQL的backup 程序现在还只能进行完全备份。
[root@localhost BACKUP]# du -h
76K ./BACKUP-296K ./BACKUP-6180K ./BACKUP-4172K ./BACKUP-376K ./BACKUP-160K ./BACKUP-5668K .6、在NDBD节点上进行恢复的时候有一个要注意的问题。
因为NDBD节点以 –initial 方式启动的时候不会自动删除undo 和 data 文件(即保存到磁盘上的表数据),所以得手动在每个NDBD节点上进行RM操作:[root@node239 ndb_6_fs]# rm -rf *.dat
然后开始备份。
在MASTER上备份的时候要加 -m 开关。在SLAVE上要加-d 而且不要-m开关。具体步骤如下:
MASTER :[root@localhost ndb_3_fs]# /usr/local/mysql/bin/ndb_restore -n3 -b1 -r -m –backup_path=/usr/local/mysql/data/BACKUP/BACKUP-1/
Nodeid = 3Backup Id = 1backup path = /usr/local/mysql/data/BACKUP/BACKUP-1/Ndb version in backup files: Version 5.1.21Connected to ndb!!Creating logfile group: lg_1…doneCreating tablespace: ts_1…doneCreating datafile “data_1.dat”…doneCreating undofile “undo_1.dat”…doneSuccessfully restored table `test/def/t11`Successfully restored table event REPL$test/t11_____________________________________________________Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 0_____________________________________________________Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 0_____________________________________________________Processing data in table: sys/def/SYSTAB_0(0) fragment 0_____________________________________________________Processing data in table: mysql/def/ndb_schema(2) fragment 0_____________________________________________________Processing data in table: mysql/def/ndb_apply_status(4) fragment 0_____________________________________________________Processing data in table: test/def/t11(10) fragment 0Restored 26 tuples and 0 log entriesNDBT_ProgramExit: 0 - OK
其他的SLAVE上的操作:
[root@node239 ndb_6_fs]# /usr/local/mysql/bin/ndb_restore -n6 -b1 -r -d –backup_path=/usr/local/mysql/data/BACKUP/BACKUP-1/
Nodeid = 6Backup Id = 1backup path = /usr/local/mysql/data/BACKUP/BACKUP-1/Ndb version in backup files: Version 5.1.21Connected to ndb!!_____________________________________________________Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 3_____________________________________________________Processing data in table: mysql/def/NDB$BLOB_2_3(3) fragment 3_____________________________________________________Processing data in table: sys/def/SYSTAB_0(0) fragment 3_____________________________________________________Processing data in table: mysql/def/ndb_schema(2) fragment 3_____________________________________________________Processing data in table: mysql/def/ndb_apply_status(4) fragment 3_____________________________________________________Processing data in table: test/def/t11(10) fragment 3Restored 20 tuples and 0 log entriesNDBT_ProgramExit: 0 - OK
-d 开关的意思即:
-d, –no-restore-disk-objects Dont restore disk objects (tablespace/logfilegroups etc)既忽略表空间和分组空间