MongoDB与OracleDB效率测试

最近因为任务需要,专门调研了一下MongoDB数据库的效率。与常规的OracleDB做了一下对比。

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 Mongodb的存储方式是文档式存储,并不是Key-Value形式。 Mongodb的主要的三种集群方式的搭建:Replica Set、 Sharding、 Master-Slaver。 其他大部分内容互联网上也有很多,我也就不再做介绍了。

主要测试时设备环境以及数据格式

设备环境

175、176服务器:

CPU:8核

内存:32G(空闲19G)

硬盘:4TB

系统:Red Hat 6.3

网络:千兆光纤

.

165数据库服务器:

CPU:8核

内存:16G

硬盘:2TB

系统:Red Hat 4

网络:百兆光纤

数据格式

每条数据包含6个字段。 字段名为:usr, pwd, age, email, address, phone 每个字段均为整形,每个字段内容为当前条数,如:第100条数据,每个字段内容为100。

一、oracle数据库入库测试

数据库环境:165数据库,表结构:hash分区16个,usr字段唯一索引

入库条数:10,000,000

1 单条数据入库

总入库时间2836s(不包含创建连接以及句柄时间)约47.3分钟。

2 批量数据入库

2.1 每批次数据量50,000

总入库时间564s,约9.4分钟。

2.2 每批次数据量100,000

总入库时间553s,约9.2分钟。

二、mongodb入库测试

1 主从备份数据库配置(主从复制)(Master-Slaver)

比较初级的构架,配置简单。

1.1 数据库环境(无索引)

数据库环境:176主节点,175为备份节点,内容时时同步。无索引(索引可以在查询之前建立)。

1.1.1 入库数据量10,000,000

总入库时间355s,约5.9分钟。

从头遍历一次时间13s。

1.1.2 入库数据量50,000,000

总入库时间1815s,约30.25分钟

从头遍历一次时间58s

注:推荐每次插入前删除索引,插入后重新建立索引,减少插入数据时对索引的处理时间。

1.2 数据库环境(有索引)

数据库环境:176主节点,175为备份节点,内容时时同步。usr字段索引。先建立索引

1.2.1 入库数据量10,000,000

总入库时间418s,约6.97分钟。

从头遍历一次时间11s。

1.2.2 入库数据量50,000,000(放弃)

入库25,000,000数据大概1小时,后续时间持续增长,速度过慢。

注:网上资料提供说:这种先写后读的需求,完全可以等全部插入后再建索引,防止大量的锁竞争。

2 mongodb高可用性架构—Replica Set (副本集)

2.1 数据库环境

数据库环境:主节点10.4.120.176:27017,从节点10.4.120.175:27017,仲裁节点10.4.120.176:17017。

作用:当主节点宕机或停电,从节点与仲裁节点进行投票,选择票数大于总主机数一半的从主机为新的主节点。保证服务正常运转。

2.1.1 入库数据量50,000,000(无索引)

总入库时间2348s,约39.5分钟。

从头遍历一次时间58s。

注:

1.大部分网络上的构架应该是这种的升级版(主要为后期数据库调优)。

2.入库后新建索引大概时间为5分钟。

3 MongoDB分布式主备集群架构

本架构为2章节介绍中1和2架构的结合

集群子集r0主备:主服务器176:10000,备服务器175:20000,仲裁服务器176:10001。

集群子集r1主备:主服务器175:10000,备服务器176:20000,仲裁服务器175:10001。

将r0,r1子集架构为分布式集群,自动分片。

3.1.1 入库数据量10,000,000

总入库时间618s,约10.3分钟。

从头遍历一次时间34s。

本次测试包含:插入过程中将某个子集主节点kill掉模拟服务器故障,过1分钟后重新启动该节点主服务器进程,持续插入进程继续,当最后插入结束时,数据丢失1条。

3.1.2 入库数据量20,000,000

多进程入库,每个进程入库10,000,000

总入库时间1315s,约21.9分钟。

3.1.3 入库数据量50,000,000

总入库时间2771s,约46.2分钟。

从头遍历一次时间160s。

三、总结

通过下方的表格可以看出,当处理数据多时,MongoDB效率基本不会改变,而OracleDB效率慢的地方是执行sql语句的时间,当某些业务需求必须单独执行sql时,MongoDB的效率约为OracleDB的5倍。

其中商业架构主推分布式主备集群的架构方式,此方式可以实现数据时时备份,且数据分布式存储,可以实现当某一台主机宕机,无需暂停业务处理。数据丢失情况,为宕机前100ms内执行的数据,约为数据的千万分之一。

个人认为MongoDB单机的效率虽然非常高,但可用性低,而分布式架构适合数据重要性不强情况,能实现远超oracle的效率,分布式主备架构是可用性、安全性最高的架构方式,前期的效率可能会等同于oracle,但当数据量过大时,会超过oracle效率。实现水平扩展,将计算能力提升到最大。

comments powered by Disqus