MySQL Cluster初步学习资料整理--安装部署新特性性能测试等
1.1 mysql-cluster简介
简单的说,MySQLCluster实际上是在无共享存储设备的情况下实现的一种完全分布式数据库系统,其主要通过NDBCluster(简称NDB)存储引擎来实现。
MySQLCluster刚刚诞生的时候可以说是一个可以对数据进行持久化的内存数据库,所有数据和索引都必须装载在内存中才能够正常运行,但是最新的MySQLCluster版本已经可以做到仅仅将所有索引和索引数据装载在内存中即可,实际的数据可以不用全部装载到内存中,架构如下图所示:
1.3 Cluster主要结构
?1、管理(MGM)节点:这类节点的作用是管理MySQLCluster内的其他节点,如提供配 置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启 动这类节点。MGM节点是用命令“ndb_mgmd”启动的。
对硬件没什么要求,差一点的机器完全能够胜任。默认端口1186。
??2、数据节点:这类节点用于保存Cluster的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。不过没有必要设置多个副本。数据节点是用命令“ndbd”启动的。
可以选择大内存,cpu也相对来讲不错的,尤其是以后ndbmtd对多核Cpu的支持。默认端口2202
??3、SQL节点:这是用来访问Cluster数据的节点。对于MySQLCluster,客户端节点是使用NDBCluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld–ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。
对cpu要求较高,选择多核,高频CPU较好1.4 Cluster特性
?分布式:分布式存储引擎,可以由多个NDBCluster存储引擎组成集群分别存放整体数据的一部分 具有非常高的并发需求
对单个请求的响应并不是非常的critical
查询简单,过滤条件较为固定,每次请求数据量较少,又不希望自己进行水平Sharding
尽可能让查询简单,避免数据的跨节点传输;尽可能满足SQL节点的计算性能,大一点的集群SQL节点会明显多余Data节点;在各节点之间尽可能使用万兆网络环境互联,以减少数据在网络层传输过程中的延时
1.5 mysql-cluster的优缺点?优点:?1) 99.999 %的高可用性
2) 快速的自动失效切换
3) 灵活的分布式体系结构,没有单点故障
4) 高吞吐量和低延迟
5) 可扩展性强,支持在线扩容
??缺点:1) 存在很多限制,比如:不支持外键,数据行不能超过8K(不包括BLOB和text中的数据)
2) 部署、管理、配置很复杂
3) 占用磁盘空间大,内存大
4) 备份和恢复不方便
5) 复杂的sql查询性能一般
2 安装
2.1 环境介绍
?mysqlcluster7.2.4安装配置?准备64位版本 5台服务器4G内存60G硬盘2cpu?10.100.200.36 64位?10.100.200.37 64位?10.100.200.38 64位?10.100.200.39 64位?10.100.200.41 64位?管理节点(ndb_mgmd)10.100.200.36 64位?数据节点(ndbd) 10.100.200.37 64位 10.100.200.38 64位?SQL节点(mysqld/api) 10.100.200.39 64位 10.100.200.41 64位??下载安装包:mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz?http://mirror.services.wisc.edu/mysql/Downloads/MySQL-Cluster-7.2/shell> tar -xvfmysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz
?2.1.2创建安装目录shell> mkdir-p /usr/local/mysql/bin
shell> mkdir-p /usr/local/mysql/ndbdata
?2.1.3添加执行文件路径shell> vi ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
?2.1.4拷贝执行文件shell> cdmysql-cluster-gpl-7.2.4-linux2.6-x86_64
shell> cp bin/ndb_mgmd/usr/local/mysql/bin
shell> cp bin/ndb_mgm/usr/local/mysql/bin
?2.1.5创建日志文件存储目录shell> mkdir/var/lib/mysql-cluster
?2.1.6创建配置文件目录及修改配置文件shell> mkdir/usr/local/mysql/cluster-conf
shell> vi /usr/local/mysql/cluster-conf/config.ini
2.2 管理节点配置文件
[NDBDDEFAULT]
#TotalSendBufferMemory= 256M
NoOfReplicas=2
DataMemory=2500M
IndexMemory=256M
DataDir=/var/lib/mysql-cluster
#FileSystemPath=/data/dbdata
#Redolog
FragmentLogFileSize=32M
InitFragmentLogFiles=SPARSE
NoOfFragmentLogFiles=8
RedoBuffer=1024M
StringMemory=25
LockPagesInMainMemory=1
MaxNoOfTables=4096
MaxNoOfOrderedIndexes=2048
MaxNoOfUniqueHashIndexes=1024
MaxNoOfAttributes=24576
MaxNoOfTriggers=14336
ODirect=1
MaxNoOfConcurrentTransactions=10000
MaxNoOfConcurrentOperations=50000
MaxNoOfLocalOperations=55000
TimeBetweenGlobalCheckpoints=1000
TimeBetweenEpochs=100
TimeBetweenWatchdogCheckInitial=60000
TransactionBufferMemory=10M
DiskCheckpointSpeed=10M
DiskCheckpointSpeedInRestart=100M
TimeBetweenLocalCheckpoints=20
SchedulerSpinTimer=400
SchedulerExecutionTimer=100
RealTimeScheduler=1
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M
MaxNoOfExecutionThreads=4
TransactionDeadLockDetectionTimeOut=10000
BatchSizePerLocalScan=512
###Increasing the LongMessageBufferb/c of a bug (20090903)
LongMessageBuffer=8M
###Heartbeating
HeartbeatIntervalDbDb=15000
HeartbeatIntervalDbApi=15000
[MGMDEFAULT]
PortNumber:1186
DataDir:/var/lib/mysql-cluster1
[TCPDEFAULT]
SendBufferMemory:64M
#######################################
#Change HOST1 to the name of the NDB_MGMD host
#Change HOST8 to the name of the NDBD host
#Change HOST9 to the name of the NDBD host
#######################################
[NDB_MGMD]
NodeId:1
HostName:10.100.200.36
ArbitrationRank:1
[NDBD]
NodeId:4
HostName:10.100.200.37
[NDBD]
NodeId:5
HostName:10.100.200.38
######################################################
#Note: The following can be MySQLDconnections or #
# NDB API application connecting to thecluster #
######################################################
[API]
NodeId:10
HostName:10.100.200.39
ArbitrationRank:2
[API]
NodeId:11
HostName:10.100.200.39
ArbitrationRank:2
[API]
NodeId:12
HostName:10.100.200.39
ArbitrationRank:2
[API]
NodeId:13
HostName: 10.100.200.39
ArbitrationRank: 2
[API]
NodeId:14
HostName: 10.100.200.41
ArbitrationRank: 2
[API]
NodeId:15
HostName: 10.100.200.41
ArbitrationRank: 2
[API]
NodeId:16
HostName: 10.100.200.41
ArbitrationRank: 2
[API]
NodeId:17
HostName: 10.100.200.41
ArbitrationRank: 2
[root@banggocluster-conf]#ndb_mgmd-f /usr/local/mysql/cluster-conf/config.ini
?b、启动数据节点ndbd–initial #(第一次启动必须添加选项,另外备份/恢复,修改配置文件也需要执行)
ndbd #不是第一次启动需要执行的命令
?c、启动SQL节点/etc/rc.d/init.d/mysqldstart或servicemysqldstart
启动后可以用mysql-uroot -p验证mysql服务状态
??关闭顺序:SQL节点->管理节点?a、关闭SQL节点/etc/rc.d/init.d/mysqldstop或servicemysqld stop
?b、关闭数据节点ndbdstop
?c、关闭管理节点ndb_mgm〉shutdown
验证配置的正确性
1、在管理节点执行:ndb_mgm-> show
[root@banggo~]# ndb_mgm
--NDB Cluster -- Management Client --
ndb_mgm>show
Connectedto Management Server at: localhost:1186
ClusterConfiguration
---------------------
[ndbd(NDB)] 2 node(s)
id=4 @10.100.200.37 (mysql-5.5.19 ndb-7.2.4, Nodegroup:0, Master)
id=5 @10.100.200.38 (mysql-5.5.19 ndb-7.2.4, Nodegroup:0)
[ndb_mgmd(MGM)]1 node(s)
id=1 @10.100.200.36 (mysql-5.5.19 ndb-7.2.4)
[mysqld(API)] 2 node(s)
id=10 @10.100.200.39 (mysql-5.5.19 ndb-7.2.4)
………
id=14 @10.100.200.41 (mysql-5.5.19 ndb-7.2.4)
………
7ndbcluster存储引擎功能测试(与innoDB对比)
8 MySQLClster备份与恢复
备份
采用ndb_mgm管理客户端来备份,在管理节点执行ndb_mgm即可进入管理命令行,输入startbackup开始备份所有节点,如果后面还跟着对应数据节点的id就只备份对应的数据节点
恢复(参考:http://xxtianxiaxing.iteye.com/blog/563063)
使用命令ndb_restore进行恢复,具体过程如下:
启动管理节点
/usr/bin/ndb_mgmd-f /usr/local/mysql/mysql-cluster/config.ini--reload
启动数据节点:
/usr/bin/ndbd --initial
第一个节点恢复的时候
在第一个节点恢复表结构(恢复的时候如果不涉及到表结构的变更,不用使用参数-m)
/usr/bin/ndb_restore -c 10.100.200.37-n 11 -b 1 -m --backup_path=/data/backup/backup-1/
恢复数据,恢复数据的时候可以几个ndb节点一起执行,速度会快一点!
/usr/bin/ndb_restore -c 10.100.200.37-n 11 -b 1 -r --backup_path=/data/backup/backup-1/
其他节点恢复的时候(以后的节点不需要加-m参数)
/usr/bin/ndb_restore -c 192.168.100.223 -n 11 -b 1 -r --backup_path=/data/dbdata1/BACKUP/BACKUP-1/
9 MySQLClster在线添加节点1
[NDBD]
id=21
HostName=10.100.200.37
?[NDBD]
id=22
HostName=10.100.200.38
??用ndb_mgm工具,停掉管理节点,然后重新启动管理节点?执行ndb_mgm进入管理命令界面,找到管理节点的id,然后执行管理节点idstop,退出??执行?/usr/bin/ndb_mgmd-f /usr/local/mysql/mysql-cluster/config.ini --reload 重新启动管理节点??登陆上去用show命令查看,是否出现了新添加的两个节点!?环状重启(一次重启数据节点和sql节点)??初始化新添加的两个节点:?ndbd--initial (执行初始化之后会自动创建数据文件,undo日志文件等等)?通过ndb_mgm创建nodegroup?CREATENODEGROUP 21,22s??重新分配cluster的数据?SELECTTABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE ='NDBCLUSTER';?ALTERONLINE TABLE table_nameREORGANIZE PARTITION;?alteronline table card_packagereorganize partition;??然后通过show命令或者使用ndb_desc命令查看?ndb_desc-c 10.80.30.39 -dbgcarddbcard_package-p?-c后面跟管理节点的ip,-d跟数据库的名字,table_name为表名,-p输出分区的详细信息shell>mysqldumpmysql userdbtables_privcolumns_privprocs_priv>backup_file.sql
?验证权限表mysql>show create tablemysql.user;看engine是否为ndbcluster。
?在41上面加测试账号mysql>grant all on *.* to test@'10.100.200.%' identified by 'test123';
[root@banggo~]#mysql-h10.100.200.39 -utest-ptest123 -P3307;
OK,能连上,测试成功!
11.1 MySQLClster备份与恢复扩展(操作见No8)
12.1 Join的改进1
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| ndb_join_pushdown | OFF |
+-------------------+-------+
?mysql>SELECT sql_no_cacheCOUNT(*) FROM residents,postcodesWHERE residents.postcode=postcodes.postcodeAND postcodes.town="MAIDENHEAD";?+----------+?|COUNT(*) |?+----------+?| 20000 |?+----------+?1row in set (17.68 sec)13.1 磁盘存储表
ADD UNDOFILE 'undo_2.log'
INITIAL_SIZE 536870912
UNDO_BUFFER_SIZE 67108864
ENGINE NDBCLUSTER;
#创建表空间,并添加数据文件
?CREATETABLESPACE ts_2ADDDATAFILE 'data_2.dat'
USE LOGFILE GROUP lg_2
INITIAL_SIZE 536870912
ENGINE NDBCLUSTER;
?CREATETABLE `bgtdisk`( #创建使用磁盘存储的表:
`Name` varchar(50) NOT NULL,
`ProviderName`varchar(200) NOT NULL,
PRIMARY KEY (`Name`)
) tablespace ts_2 storage disk ENGINE=ndbcluster DEFAULT CHARSET=utf8;
?可以去information_schema.FILES和ndbinfo.logspaces里面获取日志文件和数据文件的信息。?修改表的存储引擎:altertable test.t1tablespacets_1 storage disk ENGINE=ndbclusterDEFAULT CHARSET=utf8;?录入数据mysql>insert intobgtdiskselect * from postcodes;
Query OK, 100000 rows affected (9.68 sec)
Records: 100000 Duplicates: 0 Warnings: 0
?再去数据节点,查看存储情况,数据文件已经增长,如图所示:Query OK, 1000000 rows affected (1 min 55.28sec) Records: 1000000 Duplicates: 0 Warnings: 0