mongodb百亿数据存储(mysql数据库并发量)

3 过程分析与测试3.1 GridFS概述由于MongoDB中的Bson对象大小是有限制的,在1.7版本以前单个Bson对象最大容量为4M,1.7版本以后单个Bson对象最大容量为16M[5]。对于一般的文件存储,单个对象的4到16M的存储容量能够满足需求,但无法满足对于一些大文件的存储,如高清图片、设计图纸、视频等,因此在海量数据存储方面,MongoDB提供了内置的GridFS,

大家好,又见面了,我是你们的朋友全栈君。

3  过程分析与测试

3.1  GridFS概述

由于MongoDB中的Bson对象大小是有限制的,在1.7版本以前单个Bson对象最大容量为4M,1.7版本以后单个Bson对象最大容量为16M[5]。对于一般的文件存储,单个对象的4到16M的存储容量能够满足需求,但无法满足对于一些大文件的存储,如高清图片、设计图纸、视频等,因此在海量数据存储方面,MongoDB提供了内置的Grid

FS,可以将一个大文件分割成为多个较小的文档,可以指定文件分块标准,对用户是透明的。GridFS使用两个数据结构来存储数据:files(包含元数据对象)、chunks(包含其他一些相关信息的二进制块)。为了使多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认前缀为fs,用户有权改变这个前缀。
GridFS对Java、C#、Perl、PHP、Python、Ruby等程序言语均支持,且提供了良好的API接口。
3.2  基于GridFS的海量数据存储测试
本文主要采用MongoDB最新版2.0及官方提供的C#语言驱动进行测试,C#驱动下载地址:https://github.com/mongodb/Mongo-csharp-driver。
MongoDB在bin目录下提供了一系列有用的工具,可以很方便的进行运维管理:
(1)bsondump:将Bson格式的文件转储为Json格式的数据。
(2)mongo:客户端命令行工具,支持js语法。
(3)mongod:数据库服务端,每个实例启动一个进程,可以fork为后台运行。
(4)mongodump:数据库备份工具。
(5)mongorestore:数据库恢复工具。
(6)mongoexport:数据导出工具。
(7)mongoimport:数据导入工具。
(8)mongofiles:GridFS管理工具,可实现二进制文件的存取。
(9)mongos:分片路由,如果使用了sharding功能,则应用程序连接的是mongos,而非mongod。
(10)mongosniff:这一工具的作用类似于tcpdump,不同的是他只监控MongoDB相关包请求,并且是以指定的可读性的形式输出。
(11)mongostat:实时性能监控工具。
同时有好几个第三方提供的客户端图形工具,如MongoVUE、RockMongo、MongoHub等,方便管理和维护。

GridFS结合自动分片及自动复制技术,可以实现高性能的分布式数据库集群架构,从而进行海量数据存储,如下图2所示。

mongodb百亿数据存储(mysql数据库并发量) 

图2  高性能的分布式数据库集群架构

MongoDB Sharding Cluster需要三种角色:

(1)Shard Server:即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Set。

(2)Config Server:用来存储所有shard节点的配置信息、每个chunk的shard key范围、chunk在各shard的分布情况、该集群中所有DB和collection的sharding配置信息。

(3)Route Process:这是一个前端路由,客户端由此接入,然后询问Config Servers需要到哪个shard上查询或保存记录,再连接相应的shard进行操作,最后将结果返回给客户端,而这一切对客户端是透明的,客户端不用关心所操作的记录存储在哪个shard上。

为了测试方便,下面在同一台物理机器上构建一个简单的Sharding Cluster,如下图3所示。

 

mongodb百亿数据存储(mysql数据库并发量) 

 

图3  简单的Sharding Cluster架构图

 

配置测试环境如下:

模拟2个Shard服务器和1个Config服务器,均运行在本机127.0.0.1上,只是端口不同:

(1)Shard Server1:127.0.0.1:27020。

(2)Shard Server2:127.0.0.1:27021。

(3)Config Server:127.0.0.1:27022。

(4)Route Process:127.0.0.1:27017。

启动相关服务进程:

c:\mongodb 2.0.0\bin>mongod –shardsvr –dbpath “c:\mongodb 2.0.0\db” –port 27020

d:\mongodb 2.0.0\bin>mongod –shardsvr –dbpath “d:\mongodb 2.0.0\db” –port 27021

e:\mongodb 2.0.0\bin>mongod –configsvr –dbpath “e:\mongodb 2.0.0\db” –port 27022

e:\mongodb 2.0.0\bin>mongos –configdb 127.0.0.1:27022

配置Sharding:

(1)e:\mongodb 2.0.0\bin>mongo

(2)use admin

(3)db.runCommand( { addshard : “127.0.0.1:27020”, allowLocal : 1,

maxSize:2 , minKey:1, maxKey:10 } )

(4)db.runCommand( { addshard : “127.0.0.1:27021”, allowLocal : 1, minKey:100  } )

(5)config =connect(“127.0.0.1:27022”)

(6)config = config.getSisterDB(“config”)

(7)ecDocs=db.getSisterDB(“ecDocs”)

(8)db.runCommand({enablesharding:”ecDocs”})

(9)db.runCommand( { shardcollection : “ecDocs.filedocs.chunks”, key : { files_id : 1 } } )

(10)db.runCommand( { shardcollection : “ecDocs.filedocs.files”, key : { _id : 1 } } )

以上的ecDocs是指数据库名,filedocs是指用户自定义的GridFS的文件集合名,系统默认文件集合名为fs。

使用官方提供的C#驱动,需要在程序中引用MongoDB.Driver.dllMongoDB.Bson.dll,循环添加同一文件到GridFS示例代码,如下图4所示。

 

mongodb百亿数据存储(mysql数据库并发量) 

 

图4  循环添加同一文件到GridFS代码

 

测试配置环境如下:

操作系统:WindowsXP专业版32位SP3。

处理器(CPU):英特尔Xeon(至强)W3503@2.40GHz。

内存:3567MB(DDR31333MHz/FLASH)。

硬盘:希捷ST3250318AS(250GB/7200转/分)。

由于本机是32位操作系统,因此单个服务实例只支持GridFS的文件容量大小为0.9G左右,由于采用了两台Shard服务实例,可以支持存储的文件总容量大小为1.8G左右,如果是64位操作系统就没有此限制。

本文主要测试GridFS采用循环插入大容量文件的性能和分片容量大小,测试结果,如下图5所示。

从图5可以看出,第1到3步骤,只添加单个文件时,Shard2并没有产生分片数据,只有测试到步骤4连续添加100个相同文件时Shard2才产生分片数据,并且添加三四百兆的单个文件,只需11秒多就完成了操作,而即使通过文件拷贝方式这么大的文件也至少需要二三十秒才能完成,可见MongoDB在大容量文件存储方面拥有非常高的性能。

通过在客户端的mongo工具输入db.printShardingStatus()命令可以查看详细分片情况,如下图6所示。

从图6可以看出,在shard1中分配了6个chunks,在shard2中分配了7个chunks,分片数据相对还是比较均匀的。

从以上的测试可以得知,采用GridFS可以存储海量数据,并且可以通过廉价服务器进行大规模数据库集群,非常容易扩展部署,程序编码也非常容易,因此能够有效支持云存储的应用,能够满足大规模数据存储的应用需求。

mongodb百亿数据存储(mysql数据库并发量)

 

图5  GridFS大容量文件测试结果

 mongodb百亿数据存储(mysql数据库并发量)

图6  GridFS大容量文件分片信息

4  结论

随着企业和个人数据的不断扩大,随着云计算的高速发展,越来越多的应用需要存储海量数据,并且对高并发和处理海量数据提出了更高的要求,传统的关系型数据库对于这些应用场景难以满足应用需求,而作为NoSQL数据库之一的MongoDB数据库能够完全满足和解决在海量数据存储方面的应用,越来越多的大网站和企业选择MongoDB代替Mysql进行存储。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129643.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Spring @Value注解使用${}进行注入(转)

    Spring @Value注解使用${}进行注入(转)

  • linux时间戳转换成标准时间_linux获取毫秒时间戳

    linux时间戳转换成标准时间_linux获取毫秒时间戳[lvhongmin@AY1401201736089361adZbin.gatemaster]$date2014年05月28日星期三11:24:59CST[lvhongmin@AY1401201736089361adZbin.gatemaster]$date+%s1401247504[lvhongmin@AY1401201736089361adZbin.gatemaster]…

  • Mysql慢查询_mysql并发查询慢

    Mysql慢查询_mysql并发查询慢慢查询日志概念MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数…

  • 配置文件的选择_Cisco备份配置文件

    配置文件的选择_Cisco备份配置文件不同模式打开文件的完全列表:模式描述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。r+

  • c语言函数的迭代与递归_递归与迭代

    c语言函数的迭代与递归_递归与迭代斐波那契数列:11235813213455…fb(n):1n<=2fb(n-1)+fb(n-2)n>2intfb(n){if(n<=2){return1;}else{returnfb(n-1)+fb(n-2);}}使用递归需进行,如果递归的深度并不是很深,便可以使用。递归的子问题一定要有解。(即递归一定要有回归条件。)递归有两个过程…

  • 学生网上选课管理系统_选课管理系统

    学生网上选课管理系统_选课管理系统**数据库系统原理课程设计报告**学生选课管理系统(上)设计内容与要求:1、系统用户由三类组成:教师、学生和管理员。2、管理员负责的主要功能:①用户管理(老师、学生及管理员的增、删、改);②课程管理(添加、删除和修改);③选课管理(实现选课功能开放和禁止、老师成绩输入开放和禁止)。3、学生通过登录,可以查询课程的基本信息、实现选课、退课和成绩查询;4、老师通过登录,可以查看选…

    2022年10月16日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号