精华 新鲜出炉,Mongodb和SQLServer性能对比报告
发布于 10 年前 作者 DoubleSpout 23512 次浏览 最后一次编辑是 8 年前 来自 分享

最近公司需要测试1亿条数据10分钟插入数据库,主要是为了数据推送留存用。 这里的一条数据记录了:用户id,设备id,消息内容(以后会存模板),时间,活动到期时间等10几个字段,大部分是整形。

最终我们讨论给出了2套方案

1、单台sqlserver 配合PCIE卡 2、Mongodb分片集群

因为目前数据量是4千万,所以我分别对4千万数据和1亿数据进行了写入测试。 被测试机器都是24CPU,64G内存的独立服务器 测试代码运行服务器也是24CPU,64G内存的独立服务器 网络环境是内网1G带宽。

1、单台sqlserver 配合PCIE卡

1141099555686038624.png

性能测试总结:

使用新配置的720 PCI-E硬盘机器和SQLServer2014,性能非常强劲,单机可达3万条/秒的写入,由于前几次测试本机压测本机,对cpu有抢占情况,所以性能并没完全发挥出来。

2、mongodb测试结果

6619489908259064818.png

性能测试总结: 尽管Mongodb单机性能不如带PCIE卡的SQLServer,但是一旦分片,性能将提升几倍 在分4片的情况下,写入可达60000条/s 在分5片的情况下,写入可达80000条/s 值得一提的是,由于分片不均匀,导致90%的数据仅使用了60%的时间,剩下10%的数据仅在单点插入,所以性能下降的很厉害,如果分片足够多,我们的片键足够散列,让每片存储平均,性能还能有进一步提升。

另外有大神知道,怎么让分片的数据散列的更平均一点呢?因为mongodb分片用的一致性哈希,好像每个片节点无法设置虚拟节点,利用他原来的objectid也无法很平均的分片,望告知一二。

3、汇总总结: 想要达到1亿条数据10分钟插入,必须达到插入速度在16万/秒,所以如果我们将分片达到10片,理论上就可以达到1亿条数据10分钟的插入了,由于机器有限无法完成测试,不过最终20分钟的插入速度也让人满意了。

测试代码地址: 代码使用python写的,nodejs写插入10万条就莫名其妙的报错了,process.nextTick的错误,所以后来就改用py了,有小伙伴知道原因吗?

http://snoopyxdy.blog.163.com/blog/static/6011744020152292423648/

13 回复

赞!不错的文章,但是提出的几个问题都不知道。。。哈哈

再加一个mysql的

@yakczh mysql 估计性能会差很多,不是一个级别的

分片片键可以选用复合键, 你可以根据数据的特点,选用片键

@sunfuze 复合片键之前也试过的,没有明显的区别

如果是插入密集型的场景,建议用mongodb的fork:tokumx,支持acid事物,document级别锁,压缩存储数据,占用空间大约为mongodb的20分之一,写入速度高于mongodb

@andyhu 还是读的多,只不过对写有速度的要求,每天写2次,其余时间都是读

想看看node的代码 想知道node的版本 想知道报的什么错

tokumx已经彻底废掉。node.js写mongodb建议搭配bluebird,process.nextTick 也可以替换成setImmidiate试试

回到顶部