最近公司需要测试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/