最近因为任务需要,专门调研了一下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效率。实现水平扩展,将计算能力提升到最大。