基于Mongodb分布式存储物理文件

时间:2021-05-02

在之前的文章中介绍了如何对关系型数据数据通过auto-sharding进行分布式数据存储,今天介绍如何对物理文件(小文件,基本小于100K)进行分布式存储。

接着看一下要配置的测试环境(与前一篇中类似):

模拟2个shard服务和一个config服务, 均运行在10.0.4.85机器上,只是端口不同:

Shard1:27020 Shard2:27021 Config:27022

Mongos启动时默认使用的27017端口

在C,D,E磁盘下分别建立如下文件夹:

mongodb\bin

mongodb\db

然后用CMDming令行依次打开相应文件夹下的mongd文件:

c:\mongodb\bin\mongod --dbpath c:\mongodb\db\ --port 27020

d:\mongodb\bin\mongod --dbpath d:\mongodb\db\ --port 27021

e:\mongodb\bin\mongod --configsvr --dbpath e:\mongodb\db\ --port 27022 (注:config配置服务器)

启动mongos时,默认开启了27017端口

e:\mongodb\bin\mongos --configdb 10.0.4.85:27022

然后打开mongo:

E:\mongodb\bin>mongo 回车 (有时加端口会造成下面的addshardming令出问题)

> use admin switched to db admin > db.runCommand( { addshard : "10.0.4.85:27020", allowLocal : 1, maxSize:2 , minKey:1, maxKey:10} )

--添加sharding,maxsize单位是M,此处设置比较小的数值只为演示sharding效果

{ "shardAdded" : "shard0000", "ok" : 1 } > db.runCommand( { addshard : "10.0.4.85:27021", allowLocal : 1, minKey:1000} ) { "shardAdded" : "shard0001", "ok" : 1 }

注:如果要移除sharding,可用下面写法

db.runCommand( { removeshard : "localhost:10000" } );

> db.runCommand({listshards:1}); --查看shard节点列表

> config = connect("10.0.4.85:27022") > config = config.getSisterDB("config") > dnt_mongodb=db.getSisterDB("dnt_mongodb"); dnt_mongodb > db.runCommand({enablesharding:"dnt_mongodb"}) { "ok" : 1 }

> db.printShardingStatus()

---ShardingStatus---shardingversion:{"_id":1,"version":3}shards:{"_id":"shard0000","host":"10.0.4.85:27020","maxSize":NumberLong(2)}{"_id":"shard0001","host":"10.0.4.85:27021"}databases:{"_id":"admin","partitioned":false,"primary":"config"}{"_id":"dnt_mongodb","partitioned":true,"primary":"shard0001"} > db.runCommand( { shardcollection : "dnt_mongodb.attach_gfstream.chunks", key : { files_id : 1 } } ) --此处与之前的数据存储方式有些不同,目前shard似乎仅支持files_id { "collectionsharded" : "dnt_mongodb.attach_gfstream.chunks", "ok" : 1 } 注:运行上面ming令之前需要设置files_id为唯一索引[unique index]。 创建完sharding和设置相应信息后,我们加载一下测试数据,我用下面代码来读取要本地文件,然后批量向mongodb中添加(通过循环修改文件名来添加相同大小的文件)。///<summary>///上传文件到mongodb///</summary>///<paramname="uploadDir">要上传文件所在路径</param>///<paramname="fileName">要上传的文件名</param>///<returns></returns>publicboolUploadFile(stringuploadDir,stringfileName){for(inti=1;i<10000;i++){try{Mongomongo=mongoDB;mongo.Connect();IMongoDatabaseDB=mongo["dnt_mongodb"];using(FileStreamfileStream=newFileStream(uploadDir+fileName,FileMode.Open)){intnFileLen=(int)fileStream.Length;byte[]myData=newByte[nFileLen];fileStream.Read(myData,0,nFileLen);GridFilefs=newGridFile(DB,"attach_gfstream");using(GridFileStreamgfs=fs.Create(fileName+i)){gfs.Write(myData,0,nFileLen);}}mongo.Disconnect();}catch{}}returntrue;}

如果访问的图片分别位于shard0000和shard0001时,mongos会自行将请求调度到相应sharding上,比如下面的链接文件分别指定shard000和shard0001:

<img src="getfile.aspx?filename=2010\09\08\2\1393993713076.gif5" width="30" /> 位于shard0000

<img src="getfile.aspx?filename=2010\09\08\2\3197962515515.gif9" width="30" /> 位于shard0001

好了,今天的文章就先到这里了。

原文地址:http://blog.csdn.net/daizhj/archive/2010/09/09/5872477.aspx

BLOG: http://daizhj.cnblogs.com/ 作者:daizhj,代震军

本文源自:翔宇亭——IT乐园(http://),转载请保留此信息!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章