MySQL Cluster 7.2.7内存表和磁盘表对比测试

一、准备工作
自从2009年测试MySQL Cluster 7.0之后,就没怎么关注过它,发展实在太慢了,还有很多不靠谱的地方。前阵子退出7.2.7版本后,看了看新特性介绍,号称性能比以往版本高了很多,于是再关注并进行测试。
部署过程不多说,下载PRM包后直接安装即可。共10个节点,其中1个管理节点,其他9个节点同时作为数据和SQL节点,所有节点服务器配置图:

MySQL Cluster管理节点关键配置见下:

#
#ndb config.ini
#
[TCP DEFAULT]
SendBufferMemory=32M
ReceiveBufferMemory=32M

[NDB_MGMD DEFAULT]
PortNumber=1186
Datadir=/home/cluster/mgm

[NDB_MGMD]
NodeId=1
Hostname=x.x.x.x
LogDestination=FILE:filename=ndb_1_cluster.log,maxsize=10000000,maxfiles=6
ArbitrationRank=1

[NDBD DEFAULT]
NoOfReplicas=3
Datadir=/home/cluster/data
FileSystemPathDD=/home/cluster/data/diskdata
BackupDataDir=/home/cluster/backup
#FileSystemPathUndoFiles=/home/cluster/data
#FileSystemPathDataFiles=/home/cluster/data
DataMemory=21633M
IndexMemory=2705M
LockPagesInMainMemory=1

#相对应: 一次事务中,可以修改的数据行数
MaxNoOfConcurrentOperations=100000
MaxNoOfConcurrentTransactions=16384

StringMemory=25
MaxNoOfTables=4096
MaxNoOfOrderedIndexes=2048
MaxNoOfUniqueHashIndexes=512
MaxNoOfAttributes=24576
MaxNoOfTriggers=14336

### Params for REDO LOG 
FragmentLogFileSize=256M
InitFragmentLogFiles=SPARSE
NoOfFragmentLogFiles=85
RedoBuffer=64M

TransactionBufferMemory=32M

#TimeBetweenGlobalCheckpoints=1000
TimeBetweenGlobalCheckpoints=100
TimeBetweenEpochs=100

TimeBetweenEpochsTimeout=32000

### Params for LCP 
DiskCheckpointSpeedInRestart=100M
DiskCheckpointSpeed=10M
TimeBetweenLocalCheckpoints=20

### Heartbeating 
HeartbeatIntervalDbDb=1500
HeartbeatIntervalDbApi=1500

### Params for setting logging 
MemReportFrequency=30
BackupReportFrequency=10
LogLevelStartup=15
LogLevelShutdown=15
LogLevelCheckpoint=8
LogLevelNodeRestart=15

### Params for BACKUP 
BackupMaxWriteSize=1M
BackupDataBufferSize=16M
BackupLogBufferSize=4M
BackupMemory=20M

### Params for ODIRECT 
#Reports indicates that odirect=1 can cause io errors (os err code 5) on some systems. You must test.
#ODirect=1

### Watchdog 
TimeBetweenWatchdogCheckInitial=60000

### TransactionInactiveTimeout  - should be enabled in Production 
#TransactionInactiveTimeout=60000
TransactionInactiveTimeout=6000
#TransactionDeadlockDetectionTimeout = 1200
TransactionDeadlockDetectionTimeout = 12000
### New 7.1.10 redo logging parameters 
RedoOverCommitCounter=3
RedoOverCommitLimit=20
### REALTIME EXTENSIONS 
#RealTimeScheduler=1
### REALTIME EXTENSIONS FOR 6.3 ONLY
#SchedulerExecutionTimer=80
#SchedulerSpinTimer=40

### DISK DATA 
SharedGlobalMemory=20M
DiskPageBufferMemory=64M

### Multithreading 
MaxNoOfExecutionThreads=4

### Increasing the LongMessageBuffer b/c of a bug (20090903)
LongMessageBuffer=16M

BatchSizePerLocalScan=512

### REALTIME ASPECTS - THREAD BINDING 
### READ http://johanandersson.blogspot.com/2008/02/mysql-cluster-features-what-they-are.html#realtime
#LockExecuteThreadToCPU=X
#LockMaintThreadsToCPU=Y

[MYSQLD DEFAULT]
DefaultOperationRedoProblemAction=ABORT
BatchSize=512
#BatchByteSize=2048K
#MaxScanBatchSize=2048K

在这里要注意的是,需要多分配一些 API 节点出来,否则启动cluster时候,可能会报告无剩余 nodeid 的错误,这个问题也困扰了我小半天。
顺便提一下,这个配置文件主要依靠免费在线工具生成的,之前发文介绍过:在线生成MySQL Cluster配置文件。该工具的管理员非常负责任,在我生成配置文件后不久,还亲自发邮件问我用的怎么样,有误改进建议,赞。
数据节点和SQL节点配置文件主要内容如下:

#
# ndbcluster
#
#ndb-cluster-connection-pool=4
ndbcluster=1
ndb-connectstring="x.x.x.x:1186"
ndb-force-send=1
ndb-use-exact-count=0
ndb-extra-logging=1
ndb-batch-size=32M
ndb-autoincrement-prefetch-sz=1024
engine-condition-pushdown=1
default-storage-engine=ndbcluster

全部配置完后,就可以启动进行测试了。这个过程相对比较简单,自己看手册就可以,只要记得数据节点上第一次启动要加 --initial 选项即可。

二、测试过程&结果
1.) 创建磁盘表空间
(a) 创建LOGFILE GROUP

create logfile group NDB_LOGGRP ADD UNDOFILE 'NDB_UNDO_01.dbf' 
  INITIAL_SIZE=1024M ENGINE=NDBCLUSTER;

alter logfile group NDB_LOGGRP ADD UNDOFILE 'NDB_UNDO_02.dbf' 
  INITIAL_SIZE=1024M ENGINE=NDBCLUSTER;

注意:

  • 只能有一个logfile group
  • 一次只能添加一个undofile
  • 配置文件中已经设置redo_buffer_size的话,命令行中不可修改或重新设定+

(b) 创建数据表空间组

create tablespace NDB_TBSPC_01 ADD DATAFILE 'NDB_TBSPC_01.dbf' 
  USE LOGFILE GROUP NDB_LOGGRP 
  EXTENT_SIZE = 64M INITIAL_SIZE = 1024M AUTOEXTEND_SIZE = 64M
  ENGINE = NDBCLUSTER;
 
alter tablespace NDB_TBSPC_01 ADD DATAFILE 'NDB_TBSPC_02.dbf' 
  INITIAL_SIZE=1024M ENGINE=NDBCLUSTER;
...
alter tablespace NDB_TBSPC_01 ADD DATAFILE 'NDB_TBSPC_10.dbf' 
  INITIAL_SIZE=1024M ENGINE=NDBCLUSTER;

#类似地,创建 NDB_TBSPC_02,也是10个数据文件,不重复演示

注意:

  • 可以创建多个数据表空间文件
  • 多个数据表空间,包括日志空间,文件不可同名
  • 删除数据表空间前,需要先删除数据文件

共:

  • 1个REDO LOGFILE GROUP,空间2GB;
  • 2个数据表空间,20个数据文件,每个数据文件1GB,共20GB;

2.) TPCC数据初始化
在这里分别测试了10个DW和100个DW的对比情况:

可以看到,在初始化阶段,磁盘表并没有比内存表慢多少,比较赞。
其中,磁盘表各表所使用的表空间分配如下:

3.) TPCC初始化后各表统计情况对比
执行完TPCC数据初始化后,内存表和磁盘表的各表相关数据统计不完全一样,见下:

原因:暂不清楚,稍后去深入了解下再更新本文。

4.) TPCC并发测试结果对比
执行多次TPCC并发测试,求平均值后,相应结果见下:

小结:从测试结果来看,MySQL Cluster测性能还很差;相同机器配置,改成2块10K RPM SAS盘做RAID 1,1000个DW,TPMC最高都能跑到1900多。而MySQL Cluster的表现确实比较一般,当然了,这和我的测试环境有很大关系,毕竟只是百M网络。不管怎样,MySQL Cluster仍不适用于高并发的OLTP场景,在低并发但要求高可用的场景还比较合适。据说就有不少类似电信企业被忽悠着上了MySQL Cluster,呵呵。
资源有限,以后有机会再进行测试并更新博文,O(∩_∩)O哈哈~

补充:尝试做把一个节点的ndbd和sql进程强行杀掉,内存表总大小约6414MB、磁盘表总大小约:5568MB(事实上数据量是一样的,只是所占存储空间不一样)的场景下,该节点启动恢复数据,总共耗时28分钟,在百兆网络环境下,还是可以接受的。

评论

比较感兴趣的是,百兆网测cluster的话,有没有遇到ndb节点间binlog断开的情况;网络带宽是否足够测试

本次测试还好,没出现这个问题,百兆网络只能做基本简单用途场景,并发稍微大一些就不行了。