牛倩
摘要:MongoDB为了提高处理大数据量时的性能,提供了自动分片的技术。MongoDB的分片是集合级别的,根据基于分区的片键可以将数据集合均匀的分布在各片上。文中在研究MongoDB特点的基础上,着重分析自动分片技术的应用。对比普通和分片情况下的MongoDB性能,提出使用基于分区的MongoDB自动分片技术可以提高数据量较大时的性能,使MongoDB更稳定。对比片索引和普通索引的性能,提出对于使用非常频繁的查询或写操作,应使用基于片键的索引,可以大幅度提高MongoDB的性能。
关键词:MongoDB 自动分片 性能测试 非关系型数据库
中图分类号:TP311.13 文献识别码:A 文章编号:1007-9416(2016)06-0000-00
1 MongoDB介绍
MongoDB是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用功能,如辅助索引、范围查询和排序。MongoDB的功能非常丰富,比如内置的对MapReduce式聚合的支持,以及对地理空间索引的支持。MongoDB既有优点也有缺点,但是总体来说还是相当不错的,它是NoSQL数据库中最接近SQL数据的一种基于文档的数据库产品,主要为网页应用提供可扩展的高性能数据存储解决方案,并且已经应用在一些世界顶级的互联网公司的产品中。
2 MongoDB的自动分片技术介绍
使用自动分片技术的MongoDB集群包括以下三个组件:分片服务器、路由服务器配置服务器。
分片服务器负责存储数据。为了提供高可用性和数据一致性,在生产环境中,分片服务器集群中,每一个片都是一个副本集。如果是开发环境或者测试环境中,可以不采用副本集机制。本文主要研究MongoDB的自动分片技术,为了更好的观察MongoDB的自动分片技术本文中的每一个片都是一个单独的Mongod服务,并没有采用副本集技术。
路由服务器,也可称为查询路由服务器,它是mongos实例程序,接收客户端的请求,把请求直接分发给适当的一个或几个分片服务器,收集分片服务器的操作结果汇总成最终结果,然后将最终结果返回给客户端。一个MongoDB集群可以有多个路由服务器。
配置服务器存储MongoDB集群的元数据。包括数据的分片策略。路由服务器根据这些元数据把请求分发到特殊的分片服务器。并且在3.2版本以后,配置服务器可以应用副本集机制。
3 性能测试
此次测试共涉及5台服务器:3台MongoDB服务器。机器配置:CPU 为 Intel(R) Core (TM) i7-5500U CPU @ 2.40GHz、内存为16G、硬盘1T、操作系统为Linux。分别在3台机器运行一个mongod实例和一个mongos进程。在Scala程序设计语言下,使用MongoDB官方提供的casbah工具包编写程序对MongoDB进行操作。
(1)对三个数据集分别插入1亿条数据,要求数据的L1字段取值均匀的分布在长整型取值空间上;
在插入的数据每条为1kB的情况下,普通插入的方式在数据量小于1000万条时,三个数据集性能都是是比较高效的,但之后每秒插入数据量骤降。原因是MongoDB的普通插入只是把数据写入内存就结束了,所以在内存有空闲时,普通插入速度是非常高效的,但是随着写入数据量的增加,内存逐渐被占用,此事再写入数据需要在磁盘和内存间进行大量的数据交换,因此性能下降较快。
虽然随着写入数据量的增加,写入性能明显下降,但是分片数据集下降率比未分片的数据集低。在数据量大于2000万后的写入数据性能,分片数据集比未分片数据集要好。
比较collection1和collection2发现,在数据量大于4000万后,collection1的写入性能更好,原因是在数据量达到4000万时,collection2数据集第一个块写满,数据均衡的操作,数据在不同的shard间移动,导入写入速度下降。而collection1进行了分块操作,在数据写入之前,已经将数据均匀的分布在了三个shard上,所以collection1随着数据量的上升写入性能下降较为缓慢,写入操作的压力被均匀的分布在了三个片上。
(2)分别根据普通索引、分片索引查询1000条数据测试结果如图1所示,对未分片的数据集进行查询3,查询性能非常不稳定,但是对分片的collection1进行的1和2查询相对比较稳定。查询1使用的是分片索引,查询2使用的是普通索引,观察可以发现,使用分片索引的查询效率高于普通索引。原因是根据分片索引,mongos可以把查询操作有选择的分发到相关的一部分mongod服务器上,而根据普通索引的查询,mongos必须把查询操作分发给每一个mongod服务器。
4 结语
经过测试分析得知,使用MongoDB自动分片技术可以提高数据量较大时的性能,并且时MongoDB更稳定。并且,在使用自动分片技术时,应设置块的划分,一方面可以使数据均匀的分布在每一个片上,而且可以减少数据平衡时的数据移动。在查询操作时,使用片索引效率比普通索引效率高。对于使用非常频繁的查询,应该考虑使用这个索引的关键词来进行分片。在未来的研究工作中,将对MongoDB集群不仅使用自动分片技术,而且加入副本集技术,并观测在有Mongod故障情况下,MongoDB集群的性能以及故障服务的恢复方法等。
参考文献
[1] 程显峰.MongoDB权威指南[M].北京人民邮电出版社,2011.
[2] 黎瑞瑜.分布式实时分发微博系统[D].华南理工大学,2011.