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分钟,在百兆网络环境下,还是可以接受的。
评论
游客 (未验证)
周四, 2012/11/08 - 14:50
Permalink
比较感兴趣的是,百兆
比较感兴趣的是,百兆网测cluster的话,有没有遇到ndb节点间binlog断开的情况;网络带宽是否足够测试
yejr
周四, 2012/11/08 - 22:18
Permalink
本次测试还好,没出
本次测试还好,没出现这个问题,百兆网络只能做基本简单用途场景,并发稍微大一些就不行了。