最近公司需要测试1亿条数据10分钟插入数据库,主要是为了数据推送留存用。 这里的一条数据记录了:用户id,设备id,消息内容(以后会存模板),时间,活动到期时间等10几个字段,大部分是整形。
最终我们讨论给出了2套方案
1、单台sqlserver 配合PCIE卡 2、Mongodb分片集群
因为目前数据量是4千万,所以我分别对4千万数据和1亿数据进行了写入测试。 被测试机器都是24CPU,64G内存的独立服务器 测试代码运行服务器也是24CPU,64G内存的独立服务器 网络环境是内网1G带宽。
1、单台sqlserver 配合PCIE卡
性能测试总结:
使用新配置的720 PCI-E硬盘机器和SQLServer2014,性能非常强劲,单机可达3万条/秒的写入,由于前几次测试本机压测本机,对cpu有抢占情况,所以性能并没完全发挥出来。
2、mongodb测试结果
性能测试总结: 尽管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/
赞!不错的文章,但是提出的几个问题都不知道。。。哈哈
再加一个mysql的
@yakczh mysql 估计性能会差很多,不是一个级别的
分片片键可以选用复合键, 你可以根据数据的特点,选用片键
@sunfuze 复合片键之前也试过的,没有明显的区别
ewrq
如果是插入密集型的场景,建议用mongodb的fork:tokumx,支持acid事物,document级别锁,压缩存储数据,占用空间大约为mongodb的20分之一,写入速度高于mongodb
新手
@andyhu 还是读的多,只不过对写有速度的要求,每天写2次,其余时间都是读
想看看node的代码 想知道node的版本 想知道报的什么错
tokumx已经彻底废掉。node.js写mongodb建议搭配bluebird,process.nextTick 也可以替换成setImmidiate试试
@wmzy node 6.9.2