MySQL Cluster技术详解

1 MySQL Cluster简介
    MySQL集群是一种在无共享架构(SNA,Share Nothing Architecture)系统里应用内存数据库集群的技术。这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性。 MySQL集群是一种分布式设计,目标是要达到没有任何单点故障点。因此,任何组成部分都应该拥有自己的内存和磁盘。任何共享存储方案如网络共享,网络文件系统和SAN设备是不推荐或不支持的。通过这种冗余设计,MySQL声称数据的可用度可以达到99.999%。

    实际上,MySQL集群是把一个叫做NDB的内存集群存储引擎集成与标准的MySQL服务器集成。它包含一组计算机,每个都跑一个或者多个进程,这可能包括一个MySQL服务器,一个数据节点,一个管理服务器和一个专有的一个数据访问程序。它们之间的关系如下图所示:


    MySQL Cluster 使用了一个专用的基于内存的存储引擎NDB,这样做的好处是速度快, 没有磁盘I/O的瓶颈,但是由于是基于内存的,所以数据库的规模受系统总内存的限制, 如运行NDB的MySQL服务器一定要内存够大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多台服务器上来实现数据的可靠性和扩展性,理论上 通过配置2台NDB的存储节点就能实现整个数据库集群的冗余性和解决单点故障问题。

2 MySQL Cluster特点

    2.1 特性

    1.通过自动分片实现高水平的写入扩展能力
        MySQL Cluster 自动将表分片(或分区)到不同节点上,使数据库可以在低成本的商用硬件上横向扩展,同时保持对应用程序完全应用透明。 
    2.99.999% 的可用性
        凭借其分布式、无共享架构,MySQL Cluster 可提供 99.999% 的可用性,确保了较强的故障恢复能力和在不停机的情况下执行预定维护的能力。 
    3.SQL 和NoSQL API
        MySQL Cluster 让用户可以在解决方案中整合关系数据库技术和NoSQL技术中的最佳部分,从而降低成本、风险和复杂性。 
    4.实时性能
        MySQL Cluster 提供实时的响应时间和吞吐量,能满足最苛刻的 Web、电信及企业应用程序的需求。  
    5.具有跨地域复制功能的多站点集群
        跨地域复制使多个集群可以分布在不同的地点,从而提高了灾难恢复能力和全球 Web 服务的扩展能力。  
    6.联机扩展和模式升级
        为支持持续运营,MySQL Cluster 允许向正在运行的数据库模式中联机添加节点和更新内容,因而能支持快速变化和高度动态的负载。

    2.2 缺点

    1.基于内存,数据库的规模受集群总内存的大小限制
    2.多个节点通过网络实现通讯和数据同步、查询等操作,因此整体性受网络速度影响

3 功能模块介绍

    MySQL cluster配置中,由3个不同功能的服务构成,每个服务由一个专用的守护进程提供,一项服务也叫做一个节点,下面来介绍每个节点的功能: 
    管理(MGM)节点:
    管理节点,用来实现整个集群的管理,理论上一般只启动一个,而且宕机也不影响 cluster 的服务,这个进程只在cluster 启动以及节点加入集群时起作用, 所以这个节点不是很需要冗余,理论上通过一台服务器提供服务就可以了。管理节点的作用是管理MySQL集群内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于管理节点负责管理其他节点的配置,应在启动其他节点之前首先启动管理节点。
    数据节点:
    数据节点用于保存集群的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。
    数据节点可以和管理节点(MGM)处在不同的机器上,也可以在同一个机器上面,集群中至少要有一个数据节点,2个以上时就能实现集群的高可用保证,数据节点增加时,集群的处理速度会变慢。
    SQL节点:
    SQL节点是用来访问集群数据的节点,是应用和数据节点之间的一个桥梁。Cluster中可以有多个sql节点,通过每个sql节点查询到的数据都是一致的,通常来说,sql节点越多,分配到每个sql节点的负载就越小,系统的整体性能就越好。
    以上三种逻辑上不同节点物理上可以存放在不同的服务器上,也可以存放在相同的服务器上。

4 环境准备及节点分布

操作系统为:CentOS release 6.3 (Final)
Cluster版本为:mysql-cluster-gpl-7.2.12-linux2.6-x86_64.tar.gz
节点分布如下:

节点IP及端口运行实例
管理节点192.168.85.138ndb_mgmd
SQL节点1192.168.85.139mysqld
SQL节点2192.168.85.140mysqld
数据节点1192.168.85.141ndbd
数据节点1192.168.85.142ndbd

5 安装前准备 

    5.1 关闭五台主机防火墙

[root@localhost opt]# service iptables stop
[root@localhost opt]# chkconfig iptables off
    5.2 分别解压安装包

[root@localhost opt]# tar xzvf mysql-cluster-gpl-7.2.12-linux2.6-x86_64.tar.gz
[root@localhost opt]# mv mysql-cluster-gpl-7.2.12-linux2.6-x86_64 /opt/mysql-cluster-7.2.12
    5.3 添加运行用户组及用户

[root@localhost opt]# groupadd mysql
[root@localhost opt]# useradd mysql -g mysql
[root@localhost opt]# chown -R mysql:mysql mysql-cluster-7.2.12
 
6 配置与安装

    6.1 节点启动顺序

    管理节点->存储节点->SQL节点。

    6.2 配置管理节点

    创建管理节点日志文件夹及配置文件

[root@localhost opt]# mkdir /opt/mysql-cluster-7.2.12/cluster/
[root@localhost opt]# touch /opt/mysql-cluster-7.2.12/cluster/config.ini 
[root@localhost opt]# vi /opt/mysql-cluster-7.2.12/cluster/config.ini 
[MGM DEFAULT]
portNumber=1186
DataDir=/opt/mysql-cluster-7.2.12/cluster #在MGM上保存日志的目录

[NDBD DEFAULT]
DataMemory=80M  #分配data storage使用的内存
IndexMemory=20M  #分配index storage使用的内存
DataDir=/opt/mysql-cluster-7.2.12/data  #在数据节点上存储MySQL数据的目录
NoOfReplicas=2  #每个数据节点的镜像数量
ODirect=1  #开启这个设置会使内地版NDB尝试采用O_DIRECT写LCP、备份、重做日志,通常使用更少的内存和cpu
CompressedLCP=1
TotalSendBufferMemory = 32M
#SendBufferMemory = 2M
TimeBetweenLocalCheckpoints=6  #本地检测点间隔时间,默认20 最大 31
LockPagesInMainMemory=1  #锁定内存中进程,默认 0 
MaxNoOfAttributes: 10000  #最大属性数,默认1000
MaxNoOfTables: 500  #最大所有表数 默认128 最小8 最大1600
MaxNoOfOrderedIndexes: 200  #最大请求索引数,默认128
MaxNoOfUniqueHashIndexes: 100 #最大独立索引数,默认64 
MaxNoOfTriggers: 770  #最大触发数,默认768
MaxNoOfConcurrentOperations: 100000  #最大并发操作数,默认32768
#设置管理节点
[NDB_MGMD]
NodeId=1
HostName= 192.168.85.138

#设置SQL节点1
[MYSQLD]
NodeId=2
HostName= 192.168.85.139

#设置SQL节点2
[MYSQLD]
NodeId=3
HostName= 192.168.85.140

#设置存储节点NDB1
[NDBD]
NodeId=4
HostName= 192.168.85.141

#设置存储节点NDB2
[NDBD]
NodeId=5
HostName= 192.168.85.142

[MYSQLD]

[MYSQLD]

[MYSQLD]

[MYSQLD]

[MYSQLD]
    注意:要在配置文件config.ini里添加多余的[MYSQLD]选项,以便SQL节点自动扩展,本例中多余的[MYSQLD]选项至少为SQL节点实例的两倍(2倍正好,多余的话不会利用,也不产生任何影响,少的话会报错,数据从备份中恢复时也需要空闲的连接,所以最好多写几个,参考第九节)

    6.2 配置数据节点

[root@localhost opt]# touch /opt/mysql-cluster-7.2.12/my.cnf
[root@localhost opt]# vi /opt/mysql-cluster-7.2.12/my.cnf
[mysql]
port                           = 3332
socket                         = /opt/mysql-cluster-7.2.12/data/mysql-cluster.sock
user                           = root
default-character-set          = utf8
[mysql_cluster]
ndb-connectstring              = 192.168.85.138
[mysqld]
default_storage_engine         = ndb
character-set-server           = utf8
basedir                        = /opt/mysql-cluster-7.2.12
datadir                        = /opt/mysql-cluster-7.2.12/data
socket                         = /opt/mysql-cluster-7.2.12/data/mysql-cluster.sock
pid_file                       = /opt/mysql-cluster-7.2.12/data/mysql-cluster.pid
port                           = 3332
 
# NDB #
ndb-cluster-connection-pool    = 3
ndbcluster                     = 1
ndb-use-exact-count            = 0
ndb-extra-logging              = 1
ndb-autoincrement-prefetch-sz  = 1024
ndb_join_pushdown              = 0
ndb-connectstring              = 192.168.85.138
 
max_prepared_stmt_count        = 65536
 
# SAFETY #
max_connect_errors             = 10000
skip_name_resolve
lower-case-table-names         = 1
 
# BINARY LOGGING #
log_bin                        = mysql-bin
expire_logs_days               = 30
sync_binlog                    = 1
binlog_format                  = row
 
# REPLICATION #
server-id                      = 1
#read_only                     = 0
#log_slave_updates             = 1
#relay_log                     = relay-bin
# CACHES AND LIMITS #
tmp_table_size                 = 128M
max_heap_table_size            = 128M
query_cache_type               = 0
query_cache_size               = 0
max_connections                = 700
thread_cache_size              = 200
open_files_limit               = 65535
# LOGGING #
log_error                      = mysql-error.log
#slow_query_log                = 1
#slow_query_log_file           = mysql-slow.log

    6.3 配置SQL节点

    配置方法及参数同上6.2。

    6.4 启动管理节点

[root@localhost opt]# /opt/mysql-cluster-7.2.12/bin/ndb_mgmd -f /opt/mysql-cluster-7.2.12/cluster/config.ini --configdir=/opt/mysql-cluster-7.2.12/cluster --initial
MySQL Cluster Management Server mysql-5.5.30 ndb-7.2.12

    6.5 启动数据节点

[root@localhost opt]# /opt/mysql-cluster-7.2.12/bin/ndbd  --defaults-file=/opt/mysql-cluster-7.2.12/my.cnf --initial
2014-08-21 06:17:02 [ndbd] INFO     -- Angel connected to '192.168.85.138:1186'
2014-08-21 06:17:02 [ndbd] INFO     -- Angel allocated nodeid: 4

   注意:仅在首次启动NDB时,或者在备份/恢复或配置文件发生变化且重启NDB时才使用-initial参数,如果不是第一次启动,使用如下命令:

[root@localhost opt]# /opt/mysql-cluster-7.2.12/bin/ndbd  --defaults-file=/opt/mysql-cluster-7.2.12/my.cnf
2014-08-21 06:19:44 [ndbd] INFO     -- Angel connected to '192.168.85.138:1186'
2014-08-21 06:19:44 [ndbd] INFO     -- Angel allocated nodeid: 4

    6.6 启动SQL节点
    初始化并启动mysql(mysql_install_db仅在初始化时调用,以后启动直接使用mysqld_safe即可)

[root@localhost opt]# cd /opt/mysql-cluster-7.2.12/
[root@localhost mysql-cluster-7.2.12]# ./scripts/mysql_install_db  --defaults-file=/opt/mysql-cluster-7.2.12/my.cnf --basedir=/opt/mysql-cluster-7.2.12 --datadir=/opt/mysql-cluster-7.2.12/data
[root@localhost mysql-cluster-7.2.12]# chown -R mysql:mysql data
[root@localhost mysql-cluster-7.2.12]# /opt/mysql-cluster-7.2.12/bin/mysqld_safe  --defaults-file=/opt/mysql-cluster-7.2.12/my.cnf --basedir=/opt/mysql-cluster-7.2.12/ --datadir=/opt/mysql-cluster-7.2.12/data/ &
    6.7 基本操作

    6.7.1 通过管理节点查看状态

[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=4    @192.168.85.141  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)
id=5    @192.168.85.142  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.85.138  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]   7 node(s)
id=2    @192.168.85.139  (mysql-5.5.30 ndb-7.2.12)
id=3    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=6    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=7    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=8    @192.168.85.139  (mysql-5.5.30 ndb-7.2.12)
id=9    @192.168.85.139  (mysql-5.5.30 ndb-7.2.12)
id=10 (not connected, accepting connect from any host)

    说明所有节点已连接成功!

    6.7.2 关闭集群

    关闭管理节点(关闭cluster节点不会停止sql节点数据库服务):

    方法1(外部shutdown):

[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm -e 'shutdown'

    方法2(内部shutdown):

[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> shutdown
Connected to Management Server at: localhost:1186
1 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
ndb_mgm> 

    关闭SQL节点:

[root@localhost mysql-cluster-7.2.12]# ./bin/mysqladmin -uroot -h127.0.0.1 -P3332 shutdown

    添加到开机启动


7 功能测试

    7.1 访问及创建测试数据

    在两个SQL节点添加账户,并开放远程访问,分别执行

[root@localhost mysql-cluster-7.2.12]# ./bin/mysql -uroot -h127.0.0.1 -P3332
mysql> grant all privileges on *.* to 'jesse'@'%' identified by 'jesse' with grant option;
mysql> grant all privileges on *.* to 'jesse'@'localhost' identified by 'jesse' with grant option;
mysql> flush privileges;
    在SQL节点1(192.168.85.139)创建数据库及表

[root@localhost mysql-cluster-7.2.12]# ./bin/mysql -ujesse -pjesse -h192.168.85.139 -P3332
mysql> create database testndb;
mysql> use testndb;
mysql> create table tabndb(a int);
mysql> insert into tabndb values(1);

    在SQL节点2(192.168.85.140)查看数据是否一致

[root@localhost mysql-cluster-7.2.12]# ./bin/mysql -ujesse -pjesse -h192.168.85.140 -P3332
mysql> select * from testndb.tabndb;
+------+
| a    |
+------+
|    1 |
+------+
     说明集群创建成功,数据同步成功!
    7.2 模拟NDB数据节点故障

    在NDB节点1(192.168.85.141)终止掉ndbd进程

[root@localhost bin]# killall ndbd
    在管理节点查看,显示NDB节点1已关闭

[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=4 (not connected, accepting connect from 192.168.85.141)
id=5    @192.168.85.142  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.85.138  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]   7 node(s)
id=2    @192.168.85.139  (mysql-5.5.30 ndb-7.2.12)
id=3    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=6    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=7    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=8    @192.168.85.139  (mysql-5.5.30 ndb-7.2.12)
id=9    @192.168.85.139  (mysql-5.5.30 ndb-7.2.12)
id=10 (not connected, accepting connect from any host)
    在SQL节点1(192.168.85.139)插入数据

[root@localhost mysql-cluster-7.2.12]# ./bin/mysql -uroot -h127.0.0.1 -P3332 
mysql> insert into testndb.tabndb values(2);
    在SQL节点2(192.168.85.140)查看数据
[root@localhost mysql-cluster-7.2.12]# ./bin/mysql -uroot -h127.0.0.1 -P3332
mysql> select * from testndb.tabndb;
+------+
| a    |
+------+
|    2 |
|    1 |
+------+
    说明:数据节点1故障不影响集群正常对外服务。

    测试完毕,将数据节点1启动

[root@localhost bin]# /opt/mysql-cluster-7.2.12/bin/ndbd  --defaults-file=/opt/mysql-cluster-7.2.12/my.cnf
2014-08-22 06:44:57 [ndbd] INFO     -- Angel connected to '192.168.85.138:1186'
2014-08-22 06:44:57 [ndbd] INFO     -- Angel allocated nodeid: 4

    7.3 模拟sql节点故障

    在SQL节点1(192.168.85.139)终止mysqld进程

[root@localhost mysql-cluster-7.2.12]# ./bin/mysqladmin -uroot -h127.0.0.1 -P3332 shutdown

    通过管理节点查看,SQL节点1退出

[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=4    @192.168.85.141  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0)
id=5    @192.168.85.142  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.85.138  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]   7 node(s)
id=2 (not connected, accepting connect from 192.168.85.139)
id=3    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=6 (not connected, accepting connect from any host)
id=7    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=8 (not connected, accepting connect from any host)
id=9    @192.168.85.140  (mysql-5.5.30 ndb-7.2.12)
id=10 (not connected, accepting connect from any host)
    通过SQL节点2(192.168.85.140)访问数据库
[root@localhost mysql-cluster-7.2.12]# ./bin/mysql -uroot -h127.0.0.1 -P3332
mysql> select * from testndb.tabndb;
+------+
| a    |
+------+
|    2 |
|    1 |
+------+
    说明:在单个sql节点故障时,集群可通过其他sql节点正常对外服务。

8 MySQL Cluster 备份与恢复

    8.1 数据准备

    在SQL节点(192.168.85.139)准备5条数据

[root@localhost mysql-cluster-7.2.12]# ./bin/mysql -uroot -h127.0.0.1 -P3332
mysql> select * from testndb.tabndb order by a asc;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+

    8.2 MySQL Cluster 备份

    8.2.1 在管理节点执行备份:

[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm -e 'START BACKUP 20140825'
或者
[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm 
-- NDB Cluster -- Management Client --
ndb_mgm> START BACKUP 20140825
Waiting for completed, this may take several minutes
Node 5: Backup 20140825 started from node 1
Node 5: Backup 20140825 started from node 1 completed
 StartGCP: 154871 StopGCP: 154874
 #Records: 2066 #LogRecords: 0
 Data: 52148 bytes Log: 0 bytes
    注:备份命令格式为start backup backupID(backupid用任意数字,比如日期20140825,backupID也可省略,由cluster自动分配,一般从1开始)。
    8.2.2 分别在两个数据节点查看

[root@localhost bin]# ll /opt/mysql-cluster-7.2.12/data/BACKUP
total 12
drwxr-x---. 2 root root 4096 Aug 24 23:14 BACKUP-1
drwxr-x---. 2 root root 4096 Aug 24 23:18 BACKUP-2014
drwxr-x---. 2 root root 4096 Aug 24 23:20 BACKUP-20140825
[root@localhost bin]# ll /opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825
total 284
-rw-r--r--. 1 root root 262144 Aug 24 23:20 BACKUP-20140825-0.4.Data
-rw-r--r--. 1 root root  21296 Aug 24 23:20 BACKUP-20140825.4.ctl
-rw-r--r--. 1 root root     52 Aug 24 23:20 BACKUP-20140825.4.log
    注:会在数据节点的data目录下生成BACKUP文件夹,并在BACKUP文件夹下生成具体的备份文件夹BACKUP-20140825,查看该文件夹下文件主要有三个,具体含义如下:

    Metadata(元数据):
    所有数据库表的名称和定义,包含控制信息和元数据的控制文件。每个节点均会将相同的表定义(对于簇中的所有表)保存在自己的该文件中
    例如:BACKUP-20140825.4.ctl。
    格式:BACKUP-backup_id.node_id.ctl
    Table records(表记录):
    执行备份时实际保存在数据库表中的数据,包含表记录的数据文件,它是按片段保存的,也就是说,在备份过程中,不同的节点会保存不同的片段。每个节点保存的文件以指明了记录所属表的标题开始。在记录清单后面有一个包含关于所有记录校验和的脚注。
    例如:BACKUP-20140825-0.4.Data。
    格式:BACKUP-backup_id-0.node_id.data 

    Transaction log(事务日志):
    指明如何以及何时将数据保存在数据库中的连续记录,包含已提交事务的记录的日志文件。在日志中,仅保存已在备份中保存的表上的事务。参与备份的节点将保存不同的记录,这是因为,不同的节点容纳了不同的数据库片段。在上面所列的内容中,backup_id指的是备份ID,node_id是创建文件的节点的唯一ID。
    例如:BACKUP-20140825.4.log。
    格式:BACKUP-backup_id.node_id.log 

    这三部分均会保存在参与备份的所有数据节点上。在备份过程中,每个节点均会将这三个部分保存在磁盘上的三个文件中,即有几个数据节点保存几份相同的备份。

    8.2.3 终止正在进行的备份

    使用ABORT BACKUP backupID

    如:

[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm -e 'ABORT BACKUP 20140825'
或者
[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm 
-- NDB Cluster -- Management Client --
ndb_mgm> ABORT BACKUP 20140825

    8.3 MySQL Cluster 恢复

    8.3.1 注意事项

    数据恢复时需要注意:当初创建备份时有几个数据节点参与,恢复时就要执行几次恢复命令,2个数据节点,就需要执行2次,但第一次与第二次在参数上是不同的,第一次需要参数-m,第二次,不用加此参数,此参数的作用是,创建数据元。

    恢复程序对于簇来说相当于API,因此,需要一个空闲连接,以便与簇相连。为此,我们可以在config.ini中添加一个[mysqld],以便于有个空的节点ID,为它提供。可参考上面6.2节。

    8.3.2 数据删除操作

    模拟数据丢失

[root@localhost mysql-cluster-7.2.12]# ./bin/mysql -uroot -h127.0.0.1 -P3332
mysql> drop table testndb.tabndb;
mysql> select * from testndb.tabndb order by a asc;
ERROR 1146 (42S02): Table 'testndb.tabndb' doesn't exist
    8.3.3 关闭管理节点,数据节点及sql节点

    在管理节点执行

[root@localhost cluster]# /opt/mysql-cluster-7.2.12/bin/ndb_mgm -e 'shutdown'
    在SQL节点分别执行

[root@localhost mysql-cluster-7.2.12]# ./bin/mysqladmin -uroot -h127.0.0.1 -P3332 shutdown

    8.3.4 启动管理节点,数据节点及sql节点
    在管理节点执行

[root@localhost cluster]#  /opt/mysql-cluster-7.2.12/bin/ndb_mgmd -f /opt/mysql-cluster-7.2.12/cluster/config.ini --configdir=/opt/mysql-cluster-7.2.12/cluster --initial
    数据节点分别执行(启动时候加上参数--initial,使用这个选项之后发所有数据库中的表都会丢失!)

[root@localhost BACKUP]# /opt/mysql-cluster-7.2.12/bin/ndbd  --defaults-file=/opt/mysql-cluster-7.2.12/my.cnf --initial
    SQL节点分别执行

[root@localhost mysql-cluster-7.2.12]#  ./bin/mysqld_safe --defaults-file=/opt/mysql-cluster-7.2.12/my.cnf --basedir=/opt/mysql-cluster-7.2.12 --datadir=/opt/mysql-cluster-7.2.12/data &

    8.3.5 在数据节点上进行数据恢复

    8.3.5.1 恢复命令及格式:

    ndb_restore -c mgmd -n node_id -m -b backup_id -r [backup_path=]/path/to/backup/files

    其中:

    mgmd 为管理节点的ip
    node_id为数据节点ID,在mgm的客户端通过show查看
    -m 在第一个数据节点上执行,它的作用恢复数据元,数据元的作用.在其他节点,上就不需要此参数了.
    backup_id 就是备份的ID号.也就是在此start backup上,使用的那个backupid,如果不知道,可以到保存此备份的目录下看.

     8.3.5.2 数据节点1(192.168.85.141)执行

[root@localhost BACKUP-20140825]# /opt/mysql-cluster-7.2.12/bin/ndb_restore -c 192.168.85.138 -n 4 -m -b 20140825 -r --backup_path=/opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/
Nodeid = 4
Backup Id = 20140825
backup path = /opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/
Opening file '/opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/BACKUP-20140825.4.ctl'
File size 21296 bytes
Backup version in files: ndb-6.3.11 ndb version: mysql-5.5.30 ndb-7.2.12
Stop GCP of Backup: 154873
Connected to ndb!!
Successfully restored table `testndb/def/tabndb`
Successfully restored table event REPL$testndb/tabndb
Opening file '/opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/BACKUP-20140825-0.4.Data'
File size 262144 bytes
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_7_3(8) fragment 0
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(3) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_head(4) fragment 0
_____________________________________________________
Processing data in table: testndb/def/tabndb(10) fragment 0
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(2) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(7) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_sample(5) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(9) fragment 0
Opening file '/opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/BACKUP-20140825.4.log'
File size 52 bytes
Restored 2 tuples and 0 log entries

NDBT_ProgramExit: 0 - OK
    8.3.5.3 数据节点2(192.168.85.142)执行

[root@localhost BACKUP]#  /opt/mysql-cluster-7.2.12/bin/ndb_restore -c 192.168.85.138 -n 5 -b 20140825 -r --backup_path=/opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/
Nodeid = 5
Backup Id = 20140825
backup path = /opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/
Opening file '/opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/BACKUP-20140825.5.ctl'
File size 21296 bytes
Backup version in files: ndb-6.3.11 ndb version: mysql-5.5.30 ndb-7.2.12
Stop GCP of Backup: 154873
Connected to ndb!!
Opening file '/opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/BACKUP-20140825-0.5.Data'
File size 262144 bytes
_____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_7_3(8) fragment 1
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(3) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_head(4) fragment 1
_____________________________________________________
Processing data in table: testndb/def/tabndb(10) fragment 1
_____________________________________________________
Processing data in table: sys/def/SYSTAB_0(2) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(7) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_sample(5) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(9) fragment 1
Opening file '/opt/mysql-cluster-7.2.12/data/BACKUP/BACKUP-20140825/BACKUP-20140825.5.log'
File size 52 bytes
Restored 3 tuples and 0 log entries

NDBT_ProgramExit: 0 - OK

    8.3.6 sql节点查看数据恢复情况

mysql> select * from testndb.tabndb order by a asc;
+------+
| a    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
     数据恢复成功!

9 一些错误总结

    9.1 config.ini配置错误

    管理节点报错

/opt/mysql-cluster-7.2.12/cluster/ndb_1_cluster.log
2014-08-22 04:08:56 [MgmtSrvr] INFO     -- Node 4: Local checkpoint 34511 completed
2014-08-22 04:08:56 [MgmtSrvr] WARNING  -- Failed to allocate nodeid for API at 192.168.85.140. Returned eror: 'No free node id found for mysqld(API).'
2014-08-22 04:08:56 [MgmtSrvr] WARNING  -- Failed to allocate nodeid for API at 192.168.85.139. Returned eror: 'No free node id found for mysqld(API).'
2014-08-22 04:08:57 [MgmtSrvr] WARNING  -- Failed to allocate nodeid for API at 192.168.85.139. Returned eror: 'No free node id found for mysqld(API).'
2014-08-22 04:08:58 [MgmtSrvr] INFO     -- Node 4: Local checkpoint 34512 started. Keep GCI = 38079 oldest restorable GCI = 36881
2014-08-22 04:08:58 [MgmtSrvr] WARNING  -- Failed to allocate nodeid for API at 192.168.85.140. Returned eror: 'No free node id found for mysqld(API).'
2014-08-22 04:08:58 [MgmtSrvr] WARNING  -- Failed to allocate nodeid for API at 192.168.85.140. Returned eror: 'No free node id found for mysqld(API).'
2014-08-22 04:08:58 [MgmtSrvr] WARNING  -- Failed to allocate nodeid for API at 192.168.85.139. Returned eror: 'No free node id found for mysqld(API).'

    SQL节点报错

/opt/mysql-cluster-7.2.12/data/mysql-error.log
140822  4:22:04 [Warning] NDB : Tables not available after 30 seconds.  Consider increasing --ndb-wait-setup value
    解决办法:在管理节点config.ini文件里增加[MYSQLD]选项,方便集群自动扩展,参考6.2节。


    未完待续......

****************************************************************************************
    原文地址:http://blog.csdn.net/jesseyoung/article/details/38726561
    博客主页:http://blog.csdn.net/jesseyoung

****************************************************************************************


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值