MySQL vs.MongoDB 各有胜负!MySQL Cluster的宽泛问题。

CPU和RAM提升的速度比之硬盘来的更快,允许在1个Cluster中运行多个MySQL服务器

起的键值比较,MongoDB完赛

MySQL
Cluster是MySQL适合为分布式计算环境的胜实用、高冗余版本。它以了NDB
Cluster存储引擎,允许在1独Cluster中运作多个MySQL服务器。

赶紧还要再次快,这一直都是咱们与数据库系统的靶子MySQL
Dragster把磁盘的快作它的极其老阻力,这诚然能说过渡也?姑且就拿作一个阻力,那解决方案吗?!如果一个阻碍限制了您的Dragster,你一点一滴可选取重新快之缠绕了它们要在处理器方面提升。举个例子:

MySQL
Cluster是均等种技术,该技术允许在无共享的系中安排“内存中”数据库的Cluster。通过任共享系统布局,系统会用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己之内存和磁盘,不设有单点故障。

  • 避免使用磁盘,尽可能的坐内存替代
  • 之所以重新快之磁盘(如SSD)

总结了把移植到MySQL Cluster要留意的大规模问题。

实则上面就对类似比较并无好,因为来自磁盘的克是这般之深,而且突然的凡从来不获得过改善。你恐怕会见说,我们不是生SSD吗?对,这真的让硬盘得到了晋级,但是变化忘了:CPU和RAM提升的快慢比之硬盘来的重复快!但是不妨借要一下,我们的外存大到可直接代替硬盘了,那么一切就运行的同单一样快了?显然不是,所以不用再发硬盘是公不过老范围的丑恶嘴脸了!

至于连接

犹如CPU核心的提升速度更是快,有相同上突然不再如以前提升的那么高效了。为了缓解者问题,多核心技术诞生。然而限制新CPU性能的题目接踵而至,成为了极其让人头痛的问题!比如线程的排挤!又按MySQL里之Query
Cache互斥!

MySQL集群适合用来高速带富的条件被,采用TCP/IP方式连接。它的属性和主机里的连接速率有直接关系。集众多中之尽小速率要求是例行的100Mb以太网或者同一的网。我们建议或的话语就利用G级网络。

言归正传,现在终于可以初步测试在5月拟定的规则了(英语文献)。这里说一下怎么这么老才开,因为将数据加载到MySQL中花了多的时。在斯进程中,我创建了一个开源项目,用于把JSON中之数码导出来然后导进MySQL中。这项工作得后,我虽持有了盖切实世界规则分类的多寡。在这里,还非得得勾一些列从而MySQL就可拍卖这些数据了,因为MySQL
Cluster只能于磁盘上囤积定长的数。这个于自身来了挺十分之工作量:

至于内存

  • 汪洋的原料要描写副磁盘
  • UTF-8编码更意味着3倍以上的多寡而描写副

MySQL集群可以运行在其余启用NDB的阳台上。显然,CPU越快,内存越怪,对集群性能提升尤为显,64个之CPU也可能较32员的处理器更快。每个作为数据节点的机械都必须有足够的内存来保存共享数据库。

这么尽管保险了MySQL
Cluster的大好的运行,但是还有部分异常的景况,这个在值的路。假如值的路是文件或者类,那么我们还须以VARCHAR或者类似之格式,这些才真正的限制了MySQL
Cluster。为了给MySQL运行的尤其全面,只能创造充分简单的表:

当MySQL
5.0蒙,集群只能冲内存。意思是所有表的数目(包括索引)都保存在内存中。如果您的数码来1GB那么深,你想如果复制一客到聚集众多中的话,那么尽管不能不要
2GB的内存才行(每卖复制占用1GB),这是运行集群的电脑上针锋相对其他操作系统额外要求的内存。

lovebet体育 1

如若一个数据节点上的内存以过了可用之限制,则操作系统会下
交换内存来达到上限值DataMemory。不过当下会造成性严重低落,并且可能致相应时间变慢。正是出于这由,我们无引进在生育环境遭受利用磁盘交
换空间。在另情形下,只要达到DataMemory上限了,那么具有的操作请求(比如插入)都见面失败。

每当就张表里,加载了大致1.05亿实行数据。这对于MySQL
Cluster来说应该是小菜一碟,对吧?但是还要除下MySQL
Cluster只支持各国部分512MB哈希数据(真正愚蠢的限定)。万般无奈之下只得把数量分为5单有,这同样有些工作呢算完了了。

以MySQL
5.1挨落实了冲磁盘存储的集群,但是5.0中没此效应。对于富含主键哈希索引的有索引字段,必须遵保留在RAM中,但得以有着其他字段保存于磁盘上。

只好说,没有磁盘数据,MySQL
Cluster运作起来平稳了众多。偶尔的多寡丢失和另外新奇在加载VARCHAR格式数据表格时还不曾发。因此,不仅是磁盘上之数限制了公,你的数据类型(VARCHAR)看起为需要更加的周到。

内需特别注意: 每个MySQL集群表都亟需主键。如果没有概念主键,则 NDB
存储引擎会自动创建一个备的数目节点的内存大小都使一律,由于聚众多被另外数节点都不克动用于另外数据节点最小内存还多的内存。换句话说,如果凑众多中生
4高微机,如果发生3高计算机的内存都是3GB,而另外一光就出1GB,那么每个数据节点最多只能以出1GB内存用于集群。

言归正传,我之服务器(8骨干的AMD CPU和16GB
RAM)已经就绪。将本着具有InnoDB储存引擎的MySQL、MySQL
Cluster及MongoDB进行测试。测试的型是于平等情况下10软针对分布在100独线程上100万推行数据开展读取。为了公平起见,必须保证自己需要安装上内存的数都让放在内存达到,所以先试运行了个别潮。NDB情况下,将运MySQL
API(NDBAPI将在结尾进行测试)。结果如下:

至于安全

  • MongoDB 110000 rows read per second
  • MySQL with InnoDB 30000 rows read per second
  • MySQL with NDB 32000 rows read per second

MySQL集群的2单节点内的通信是勿安全之;它们从不经过其他保护体制加密或者防范。安全之集群是位于防火墙中的私网中,在外围中无法直接看数与管制节点(SQL节点吧如与另外MySQL服务器一样注意安全防护)。

以NDB情况下下,先做以下设置:

关于存储引擎

lovebet体育 2

MySQL集群只支持 NDB
存储引擎。也就是说,想要于一个表明在集群节点中共享,就必指定ENGINE=NDB(或
ENGINE=NDBCLUSTER 也一如既往)。

好显著报告你,在这种模式下起了惊天动地的反差。加载普通数据,结果吗是形似的。但是当加载JSON(JSON是MongoDB的故土文件形式)的时刻,预期受之事体闹了,MongoDB的快慢较NDB/InnoDB快
2.5倍,而NDB/InnoDB两者相当。

MySQL集众多中也可采取MyISAM或InnoDB存储引擎来创造数据表,但是那些非NDB的表明不会见蕴藏于集群节点内共享;它们独立为创造的MySQL服务器或者实例中。

总结:

有关导入

以RAM越来越好的秋,请移除那该生的512M设定!

而可将各种本子的MySQL数据导入到集结众多被去。唯一的求就是设导入的阐发须是
NDB 存储引擎,也尽管是故 ENGINE=NDB 或 ENGINE=NDBCLUSTER方式创建的说明。

键值对比的重复凑巧跟增长,MongoDB依旧胜有

有关数据类型

先是,与方完全相同的测试环境;其次,都使单一表;最后以MySQL中分别以InnoDB和NDB两种处理引擎。测试对100万实行数据的读取(表格大小总计1.05亿)。同样是10不好布在100只线程上,总计1000万执行数据读入。

MySQL集群支持具备常用的数据类型,除了跟MySQL相关的空间扩展项目(详情请圈
Chapter 16, Spatial Extensions)。另外,NDB表的目录也略不同。

通过了部分检查之后发现,InnoDB引擎没有了缓存,更凑巧下测试结果如下:

瞩目: MySQL聚集群表(即 NDB 或 NDBCLUSTER
类型表)只支持固定长度记录。这为代表(举例)如果来平等长条记下包含有
VARCHAR(255)
字段,那么其就是见面要采取255个字符的空间(和数据表使用的字符集及校验所要求的长空一样很),而无论是实际存储的字符数。但是当MySQL
5.1丁,只保留于记录实际占用的字段部分。

  • MongoDB110000 rows read per second
  • InnoDB 39000 rows read per second
  • NDB 32000 rows read per second

在NDB表中,数据库名称、表名称与总体性名称不可知同其它表处理程序
中的同等长。属性名称将为截短至31单字符,截短后而不是绝无仅有的,将导致错误。数据库名称及表名的究竟最深长也122个字符(也就是说,NDB簇表名的
最特别长为122单字符减去该表所属之数据库的名目被的字符数)。

于这次本着决中MongoDB仍处于绝对优势,并且InnoDB也肯定比NDB来之抢。

至于业务

特定环境的键值对比,MySQL曙光乍现

NDB存储引擎的表都支持工作。在MySQL 5.0惨遭,集群只支持READ
COMMITTED隔离级别。

MySQL的成熟度远非MongoDB能比,当把MongoDB放到硬盘上就会意识其速度萎缩的决心。假如我们拥有足够量的内存(我们把她坐Amazon上,那里有足多的内存以),是否意味非来其它磁盘I/O它就会见出特别好的表现?

关于外键

选出一个MongoDB数据存储,同样有1.05亿执行数据。最初我打算动用成套底MongoDB数据存储,但不能不消除其中像VARCHAR格式的数额而通过NDB把多少放到磁盘上拿吃过多底磁盘I/O,确保NDB存储数据以凡定长后(所以一个UTF-8
VARCHAR(256)字段将占768字节)。制作表格模式如下:

NDB存储引擎不支持外键。跟MyISAM一样,它们还未支持。

lovebet体育 3

关于FULLTEXT索引

截止上面的工作,测试控制高还待部分器:

于MySQL
5.0被,NDB存储引擎不支持FULLTEXT索引,其他除了MyISAM存储引擎外也非支持。

  • CPU:AMD FX-8120 8核 内存:16G;主板:M5A88-V(使用Lite-On
    LINE100TX网卡替代了主板搭载的Realtek芯片组)
  • 磁盘系统:因为从没磁盘I/O,不开牵线
  • Ubuntu 10.10
  • MySQL 5.6.5 64-bit
  • MySQL Cluster 7.2.6 64-bit
  • MongoDB 2.0.5 64-bit

一样是10不成布在100只线程上之100万数量的读入,确保了无见面遭遇磁盘I/O影响后,得出的测试结果是:

  • MongoDB 110000 rows read per second
  • MySQL Cluster 32000 rows read per second
  • MySQL with InnoDB 39000 rows read per second
  • MySQL with MEMORY/HEAP 43000 rows read per second
  • MySQL with MylSAM 28000 rows read per second

MySQL在最后两码之显现的确是令人失望的!然后以测试着尚发现MylSAM只缓存自己之键,而非是整数据。但是MylSAM表现还是值得嘉许的,自始至终都不曾察觉磁盘I/O。在化解了之题目我们看一下结出:

  • MySQL with MyISAM 37000 rows read per second

MySQL险胜

尔后咱们而测试了有些其他情况,比如:使用NDB而未采用CLIENT_COMPRESS。但是相比了MongoDB的11万,MySQL表现依旧毫不起色。总结下MySQL在相连尝试着之最好好表现:

  • MySQL with MEMORY/HEAP:43000 rows read per second
  • MySQL with NDB(不使用CLIENT_COMPRESS):46000 rows per second

尽管如此尚无测试所有组成,但是根据上边两长结果好揣测出:当MySQL在采用MEMORY存储引擎和CLIENT_COMlovebet体育PRESS的图景下不采用MySQL
Storage Engines,速度必然快于4.3万。

不难预计这种景象下MySQL将针对CPU造成非常高之负载。因为一切都在内存中没有了磁盘I/O,那么这里可能束缚MySQL的就算惟有剩余了CPU。所以我们纠缠了正统服务器使用MySQL
Cluster,直接看NDBAPI。这样得到了重新好的表现9万,然而这要落后于MongoDB。

综上所述上面的测试,我们还会意识:

  • MySQL with NDB(不使用CLIENT_COMPRESS46000 rows per second
  • NDB 32000 rows read per second

咱们是否好认为CLIENT_COMPRESS是个“害虫”?是否可推测CLIENT_COMPRESS会拿速度下滑25%-30%?!想看客户端的损耗到底是略,最简便的计就是利用libmysqld
—MySQL Embedded
Library。这样我们尽管使本着规则程序开展转移,在开班测试前一模一样如果确保数据现已深受勾勒副内存。准备妥当后开始测试,然而得出的结果比较我们想的一致。11.5万!MySQL终于得了赢!

总结:这里没赢家,只有不断的提高

自此还测试出了MySQL
17.2万底高效,但是把这个当战胜MongoDB的冲的非常携带强。是的,在此我们视底非是胜负,而是MongoDB的雷霆万钧及MySQL还具有的皇皇提升空间。(编译/仲浩
王旭东/审校
原文来自DZone)