1. MySQL 6.0 下的 cluster + replicate
Yejr(imysql@gmail.com)
2008-2-20
1. 简介
本文主要是尝试 MySQL 6.0 下的集群+复制,没有做深入的测试,仅可作安
装配置参考。
2. 准备工作
如果只是做普通的集群,那么一般只需要 4 台机器,甚至只需要 3 台,即把
管理节点和 SQL 节点放在同一个机器上,不过不推荐这么做。如果是集群+复制,
则机器数量翻番。
2.1. 普通集群
Node IP Address
Management (MGM) node 192.168.0.1
MySQL server (SQL)
node
192.168.0.2
Data (NDBD) node "A" 192.168.0.3
2. Data (NDBD) node "B" 192.168.0.4
2.2. 集群+复制
Node IP Address
Master Management (MGM)
node
192.168.0.1
MySQL server (SQL)
node
192.168.0.2
Data (NDBD) node "A" 192.168.0.3
Data (NDBD) node "B" 192.168.0.4
3. Slave Management (MGM)
node
192.168.1.1
MySQL server (SQL)
node
192.168.1.2
Data (NDBD) node "A" 192.168.1.3
Data (NDBD) node "B" 192.168.1.4
3. 配置
MySQL 的安装路径默认为:/usr/local/mysql。
3.1. 管理节点
首先,创建数据文件主目录 /usr/local/mysql/data,然后编辑配置文件:
vi /usr/local/mysql/config.ini
4. #定义默认参数
[ndbd default]
#设置集群中每个表保存的副本数
#这里有 2 个数据节点,那么每个节点则保存一个副本
NoOfReplicas=2
#设置用于保存数据的内存大小
DataMemory=1G
#设置用于保存哈希索引的内存大小
IndexMemory=1G
#设定管理节点相关参数
[ndb_mgmd]
#指定 ID 号
id = 1
#指定管理节点主机
hostname=192.168.0.1
#指定管理节点的数据文件主目录
datadir=/usr/local/mysql/data
#设定数据节点相关参数
[ndbd]
id = 3
hostname=192.168.0.3
datadir=/usr/local/mysql/data
[ndbd]
id = 4
hostname=192.168.0.4
datadir=/usr/local/mysql/data
5. #设定 SQL 节点相关参数
[mysqld]
id = 2
hostname=192.168.0.2
#增加一个 API 节点,API 节点视需求增加
[mysqld]
id = 5
3.2. SQL 节点
在 SQL 节点中,除了作为正常的 mysqld 服务在运行而设定的常规参数外,
想要加入集群中,只需要增加几行即可:
vi /etc/my.cnf
# mysql cluster
#告诉 mysqld,要启用 ndbcluster 引擎
ndbcluster
#指定管理节点
ndb-connectstring=192.168.0.1
[mysql_cluster]
ndb-connectstring=192.168.0.1
3.3. 数据节点
数据节点配置很简单,只需要指定管理节点 IP 即可:
vi /etc/my.cnf
# mysql cluster
#告诉 mysqld,要启用 ndbcluster 引擎
ndbcluster
8. id=5 (not connected, accepting connect from any host)
#查看全部数据节点状态
ndb_mgm> all status
Node 3: started (mysql-6.0.3 ndb-6.2.6)
Node 4: started (mysql-6.0.3 ndb-6.2.6)
#报告数据节点的内存使用情况
ndb_mgm> 3 report memoryusage
Node 3: Data usage is 6%(2154 32K pages of total 32768)
Node 3: Index usage is 2%(3009 8K pages of total 131104)
#重启第 3 个节点
ndb_mgm> 3 restart
Node 3: Node shutdown initiated
Node 3: Node shutdown completed, restarting, no start.
Node 3 is being restarted
Node 3: Started (version 6.2.6)
6. 备份、恢复
6.1. 备份
集群的备份很简单,只需在管理节点上执行 START BACKUP 即可:
ndb_mgm> START BACKUP
Waiting for completed, this may take several minutes
Node 3: Backup 4 started from node 1
Node 3: Backup 4 started from node 1 completed
StartGCP: 7847 StopGCP: 7850
#Records: 1736024 #LogRecords: 0
Data: 41649824 bytes Log: 0 bytes
9. 6.2. 恢复
来做个实际的测试,在 SQL 节点上先制造一些数据出来:
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| a |
+----------------+
1 row in set (0.01 sec)
mysql> show create table a;
+-------+-------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------+
| a | CREATE TABLE `a` (
`id` int(11) DEFAULT NULL
) ENGINE=ndbcluster DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> select count(*) from a;
+----------+
| count(*) |
+----------+
| 1733965 |
+----------+
1 row in set (0.03 sec)
mysql> checksum table a;
+--------+------------+
| Table | Checksum |
+--------+------------+
| test.a | 1641855839 |
+--------+------------+
1 row in set (11.61 sec)
然后用上面提到的方法进行备份后,删除该表的数据:
10. mysql> truncate table a;
Query OK, 0 rows affected (0.68 sec)
接下来在 2 个数据节点上分别执行以下命令恢复数据:
/usr/local/mysql/bin/ndb_restore -n 3 -b 5 -r data/BACKUP/BACKUP-3
Nodeid = 3
Backup Id = 5
backup path = data/BACKUP/BACKUP-5
Opening file 'data/BACKUP/BACKUP-5/BACKUP-5.3.ctl'
File size 8120 bytes
Ndb version in backup files: ndb-6.2.6
Connected to ndb!!
Opening file 'data/BACKUP/BACKUP-5/BACKUP-5-0.3.Data'
File size 20809008 bytes
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 0
_____________________________________________________
Processing data in table: test/def/a(5) fragment 0
_____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(4) 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
Opening file 'data/BACKUP/BACKUP-5/BACKUP-5.3.log'
File size 44 bytes
Restored 866287 tuples and 0 log entries
NDBT_ProgramExit: 0 - OK
再在 SQL 节点上查一下:
mysql> select count(*) from a;
+----------+
| count(*) |
+----------+
| 866287 |
+----------+
1 row in set (0.00 sec)
11. 然后在另一个数据节点上执行恢复。
/usr/local/mysql/bin/ndb_restore -n 4 -b 5 -r data/BACKUP/BACKUP-3
Nodeid = 4
Backup Id = 5
backup path = data/BACKUP/BACKUP-5
Opening file 'data/BACKUP/BACKUP-5/BACKUP-5.4.ctl'
File size 8120 bytes
Ndb version in backup files: ndb-6.2.6
Connected to ndb!!
Opening file 'data/BACKUP/BACKUP-5/BACKUP-5-0.4.Data'
File size 20841232 bytes
_____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(1) fragment 1
_____________________________________________________
Processing data in table: test/def/a(5) 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: sys/def/SYSTAB_0(0) fragment 1
_____________________________________________________
Processing data in table: mysql/def/ndb_schema(2) fragment 1
Opening file 'data/BACKUP/BACKUP-5/BACKUP-5.4.log'
File size 44 bytes
Restored 867678 tuples and 0 log entries
NDBT_ProgramExit: 0 – OK
再来查一次看看:
mysql> checksum table a;
+--------+------------+
| Table | Checksum |
+--------+------------+
| test.a | 1641855839 |
+--------+------------+
1 row in set (11.62 sec)