Mongodb分片复制集群HA的性能测试
番外篇
很想做一个关于mongodb分片的高可用性的测试,比如在插入过程中挂了一个primary插入速度是否有影响啊?比如宕机之后服务是否需要长时间或者多长时间修复啊?等等
但是翻墙和百度了好多好多,都没有这方面的测试,准备发论文,可是我的实习期时间不够了,而且也遇到了很大的瓶颈,包括测试工具,mongodb内部的机制真实情况。
希望大家可以多给一些意见!谢谢!
禁止商用,只能学习hhh!
MongoDB测试
(1)测试内容
一、用YCSB测出平稳插入量
一开始我们决定先插入500w的数据量试一下,顺便测试一下YCSB在安装配置之后能不能正常使用,结果如图:
中间在测试过程中,YCSB每10sec返回一个数据,类似这样的数据:
10 sec: xxx operations; xxx currentops/sec;[INSERTAverageLatency(us)=xxx]
20 sec: xxx operations; xxx currentops/sec;[INSERTAverageLatency(us)=xxx]
包括进行的操作数,每秒的并发率以及平均响应时间。
可是时间太长了,而且可以看出有丢数据的现象。由于我们的测试环境一般,数据库由3台内存为6G,磁盘空间为40G的虚拟机组成,所以我们决定缩小数据量,所以后来测试了100w,还是依然的时间太长,但是丢数据现象已经没有了。
后我们定下的是10w到50w的数据量,大概可以契合我们这个情况。
依然经过简单的测试,10w、20w的数据插入速度太快,体现不出如果在宕节点下出现的波动,所以我们舍弃了这两个数据量。
下面是我们测试30w、40w、50w的情况:
纵轴是每秒的插入速度,横轴是所用的时间,1、2、3分别是3次测试。这个图我们可以看出三种不同数据量正常插入速度的离散程度,看哪个数据插入速度更加稳定。
3次标准差的平均值为726.7470881
3次标准差的平均值为711.0609
3次标准差的平均值为1105.445194
我们可以看到50w的时候会出现插入速度为零的情况,我们一定不能选择50w的数据量,因为当你宕节点的时候,你不清楚是否是因为宕机而产生的速度为0或者说速度下降,所以这也是我们进行平稳插入量测试的原因,虽然30w和40w有也会有不稳定情况,但是这是无法避免的,所以只能选优的。
二、高可用性的测试
1、首先我是用YCSB测了一次,在YCSB稳定插入时,我直接宕掉了一个分片的primary,一瞬间YCSB开始报错,提示no master,然后程序自动退出。我进入我挂primary的那个副本集里面,发现新的primary已经选了出来。然后再次启动YCSB,插入数据正常,所以可以证明,mongodb分片复制集是高可用的,性能没有明显变化,有时候反而会提高,初步认为是由于那台机子上的primary有好多(几乎3个primary都在那台机子上),宕机之后反而减少了一个primary,插入数据时减少了服务器的压力,所以出现了速度上升的情况。
2、我们又用了spring data mongodb的框架来进行测试,原因是YCSB在集群选主的时候它会自动退出,我们想让这个插入过程不要停止,就算集群在选主,我们也要想让插入等待集群选主。可是由于我实习时间原因,目前还不能找出一种有效的方法来找出这个选主的延时时间。我们只能让我们自己编写的java程序不停的给他发送插入命令,然后可以设置每2000(任意数)插入返回时间,但是这个时间只是这个操作的时间,是否插入成功我们还没有找到这个返回值。实际测试时,我们发现2000的时间在宕节点时,宕一个不明显,宕两个会出现返回时间变大,宕第三个时出现了一串2000的时间异常小的情况,但是随后又稳定回了正常值。我们后发现数据库掉了数据,初步估计是因为选主时我们的插入请求一直在发,但是选主那个时间段没有接收到,所以丢了数据,丢的不多(因为一次性陆续挂了3个primary),大约百分之3吧。但是这依然证明mongodb还是高可用的,影响也是不大。
(2)测试结果及结论
Mongodb分片集群在宕机情况下依然保持可观的高可用性,虽然有丢数据的情况,但是还是可以接受,并且宕机时之后平稳时,插入速度没有很大的波动变化。
2.3MongoDB问题经验总结
(1)各节点功能
挖一个坑。
(2)oplog
挖第二个坑。
(3)选主过程
挖第三个坑。
(4)部署过程中出现的问题
1、服务器集群之间时间不同步
2、配置所需的文件存储路径没有设置正确
3、如果之前启动过mongo服务,需要结束之前的mongo服务,才能再次启动
每个坑其实都能写一篇文章,等我填坑吧。可能下面会忙!我的实习期结束了,我可以留下来但是想去尝试更高更大的平台!加油同志们!
相关文章