C# MongoDB分布式海量存储实验

本实验将按以下几步进行:实验环境monodevelop ,ubuntu10.04,实验目的:探索分布式文件存储方案

1、单机小文件的存储,逐步增加上传文件的大小,观察mongoDB中文件对磁盘分配大小的变化。

2、采用分片的方式存储大量的数据

实验一:

首先建立一个数据库gywdb,上传一个574.5kB大小的文件,代码如下:


using System;
using System.Collections;
using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;

namespace mongoDBClient
{
class MainClass
{
public static void Main (string[] args)
{
//mongoDb服务实例连接字符串
string con="mongodb://localhost:27017";
//得到一个于mongoDB服务器连接的实例
MongoServer server=MongoServer.Create(con);
//获得一个与具体数据库连接对象,数据库名为gywdb
MongoDatabase mydb=server.GetDatabase("gywdb");
//定义一个本地文件的路径字符串
string localFileName="/home/guoyuanwei/学习资料/Google三大论文中文版.pdf";
//定义mongoDB数据库中文件的名称
string mongoDBFileName="Google三大论文中文版";
//设置GridFS文件中对应的集合前缀名
MongoGridFSSettings fsSetting=new MongoGridFSSettings(){Root="gyw"};
//实例化一个GridFS
MongoGridFS gridfs=new MongoGridFS(mydb,fsSetting);
//将本地文件上传到mongoDB中去,以默认块的大小256KB对文件进行分块
gridfs.Upload(localFileName,mongoDBFileName);

}
}
}

运行命令:> show collections
gyw.chunks
gyw.files
可以看到得到了一个前缀为gyw的文件元数据存储的集合gyw.files和存储文件数据块的gyw.chunks
运行命令> db.gyw.chunks.find({},{"_id":1,"n":1})
{ "_id" : ObjectId("4fc0a6d91d41c808f45cbfec"), "n" : 0 }
{ "_id" : ObjectId("4fc0a6d91d41c808f45cbfed"), "n" : 1 }
{ "_id" : ObjectId("4fc0a6da1d41c808f45cbfee"), "n" : 2 }

得到3个块数据,因为文件总大小为574.5KB,每个块采用的是默认大小256KB,所以得到了3个块。此时磁盘文件系统中,mongoDB自动生成了3个文件分别是:

gywdb.0(大小为64MB),gywdb.1(大小为128MB),gywdb.ns(存储命名空间源数据),这里分配机制体现了mongoDB的文件分配策略,每个数据库有一个.ns文件和若干个数据文件

,数据文件以递增的数字结尾。每个新的以数字结尾的数据文件大小会加倍,直到达到最大值2GB,这是为了让小数据库不浪费太多的磁盘空间,同时让大数据使用磁盘上连续的空间。

MongoDB为了保证性能还会预分配数据文件,这意味着MongoDB服务器总是试图为每一个数据库保留一个额外的空数据文件,来避免文件分配所产生的阻塞。

接着利用上面的代码再上传一个大小为2.4MB大小的文件到mongoDB的文件系统中

运行命令:> db.gyw.chunks.find({},{"_id":1,"n":1,"files_id":1})
{ "_id" : ObjectId("4fc0a6d91d41c808f45cbfec"), "files_id" : ObjectId("4fc0a6d91d41c808f45cbfe9"), "n" : 0 }
{ "_id" : ObjectId("4fc0a6d91d41c808f45cbfed"), "files_id" : ObjectId("4fc0a6d91d41c808f45cbfe9"), "n" : 1 }
{ "_id" : ObjectId("4fc0a6da1d41c808f45cbfee"), "files_id" : ObjectId("4fc0a6d91d41c808f45cbfe9"), "n" : 2 }
{ "_id" : ObjectId("4fc0a8cf1d41c80910191105"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 0 }
{ "_id" : ObjectId("4fc0a8cf1d41c80910191106"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 1 }
{ "_id" : ObjectId("4fc0a8cf1d41c80910191107"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 2 }
{ "_id" : ObjectId("4fc0a8cf1d41c80910191108"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 3 }
{ "_id" : ObjectId("4fc0a8cf1d41c80910191109"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 4 }
{ "_id" : ObjectId("4fc0a8cf1d41c8091019110a"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 5 }
{ "_id" : ObjectId("4fc0a8cf1d41c8091019110b"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 6 }
{ "_id" : ObjectId("4fc0a8cf1d41c8091019110c"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 7 }
{ "_id" : ObjectId("4fc0a8cf1d41c8091019110d"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 8 }
{ "_id" : ObjectId("4fc0a8cf1d41c8091019110e"), "files_id" : ObjectId("4fc0a8cf1d41c80910191102"), "n" : 9 }

可以看到块中多了10个块,而且第一次上传的文件块中“files_id" 为 ObjectId("4fc0a6d91d41c808f45cbfe9"),第二次上传的文件为ObjectId("4fc0a8cf1d41c80910191102"),

这个files_id代表了这个块是属于那个文件的。如下命令显示了文件系统中文件元数据信息

> db.gyw.files.find()
{ "_id" : ObjectId("4fc0a6d91d41c808f45cbfe9"), "filename" : "百度大规模数据处理", "length" : 588276, "chunkSize" : 262144, "uploadDate" : ISODate("2012-05-26T09:48:09.357Z"), "md5" : "5e55fb7496d41a52eb90daeac9e06936" }
{ "_id" : ObjectId("4fc0a8cf1d41c80910191102"), "filename" : "Google三大论文中文版", "length" : 2526950, "chunkSize" : 262144, "uploadDate" : ISODate("2012-05-26T09:56:31.143Z"), "md5" : "605f1deec1a277e3d878dfc6f3491cce" }
这个里面的"_id"值正好对应了上面块中的“files_id”

这时在观察磁盘文件系统中mongoDB自动生成的文件,发现和第一次一样,说明数据还没达到第一个数据文件gywdb.0的总大小(64MB)。

接着再利用上面的代码上传一个大小为112.2MB大小的文件到mongoDB的文件系统中,利用命令:

> db.gyw.files.find()
{ "_id" : ObjectId("4fc0a6d91d41c808f45cbfe9"), "filename" : "百度大规模数据处理", "length" : 588276, "chunkSize" : 262144, "uploadDate" : ISODate("2012-05-26T09:48:09.357Z"), "md5" : "5e55fb7496d41a52eb90daeac9e06936" }
{ "_id" : ObjectId("4fc0a8cf1d41c80910191102"), "filename" : "Google三大论文中文版", "length" : 2526950, "chunkSize" : 262144, "uploadDate" : ISODate("2012-05-26T09:56:31.143Z"), "md5" : "605f1deec1a277e3d878dfc6f3491cce" }
{ "_id" : ObjectId("4fc0b3a31d41c8099f80a9ac"), "filename" : "微软官方2010年宽屏PPT图表全集400张锐普PPT论坛首发", "length" : 117652480, "chunkSize" : 262144, "uploadDate" : ISODate("2012-05-26T10:42:43.773Z"), "md5" : "506810e215c773addc3ce10a035695d9" }
发现多了一个文件微软官方2010年宽屏PPT图表全集400张锐普PPT论坛首发,证明上传成功了,再观察磁盘文件系统中mongoDB自动生成的文件,发现多了一个gywdb.2(大小为256MB),这证明了mongoDB文件分配机制。

实验二:数据的分布式存储即分片测试

准备:两台分片服务器(在同一台主机上,通过端口来区分,分别为:20000,20001),一台路由服务器(端口为:40000,所有的读写请求都必须经过它),一台配置服务器(端口为:30000)

[email protected]:/# mkdir -p /data/shard/s0
[email protected]:/# mkdir -p /data/shard/s1
[email protected]:/# mkdir -p /data/shard/log
上面的命令为建立两个分片服务器的数据存放路径以及日志文件路径

[email protected]:/usr/local/mongoDB/bin# ./mongod --shardsvr --port 20000 --dbpath /data/shard/s0 --fork --logpath /data/shard/log/s0.log --directoryperdb
[email protected]:/usr/local/mongoDB/bin# ./mongod --shardsvr --port 20001 --dbpath /data/shard/s1 --fork --logpath /data/shard/log/s1.log --directoryperdb
上面的命令为启动两个分片服务器,注意其中各参数的意义

[email protected]:/# mkdir -p /data/shard/config
[email protected]:/usr/local/mongoDB/bin# ./mongod --configsvr --port 30000 --dbpath /data/shard/config --fork --logpath /data/shard/log/config.log --directoryperdb

上面的命令为启动配置服务器端口为3000

# ./mongos --port 40000 --configdb localhost:30000 --fork --logpath /data/shard/log/route.log 
上面的命令是启动路由服务器,注意里面的参数configdb表示配置服务器的位置,因为路由服务器启动时需要从配置服务器上获取相应的信息

下面的命令是连接路由服务器并做一些配置:

[email protected]:/usr/local/mongoDB/bin# ./mongo admin --port 40000
MongoDB shell version: 2.0.4
connecting to: 127.0.0.1:40000/admin
mongos> db.runCommand({addshard:"localhost:20000"})
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({addshard:"localhost:20001"})
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> db.runCommand({enablesharding:"userDB"})
{ "ok" : 1 }
上面的命令完成了将两个服务器添加到分片集群中,在端口为40000的路由服务器上建立了一个数据库userDB,并将此数据库配置为可以进行分片。

接下来通过C#编写代码,完成文件的上传,观察数据被分片存储的情况,代码如下:


using System;
using System.Collections;
using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;

namespace mongoDBClient
{
class MainClass
{
public static void Main (string[] args)
{
//mongoDb服务实例连接字符串
string con="mongodb://localhost:40000";
//得到一个于mongoDB服务器连接的实例
MongoServer server=MongoServer.Create(con);
//获得一个与具体数据库连接对象,数据库名为gywdb
MongoDatabase mydb=server.GetDatabase("userDB");
//定义一个本地文件的路径字符串
string localFileName="/home/guoyuanwei/学习资料/微软官方2010年宽屏PPT图表全集400张锐普PPT论坛首发.ppt";
//定义mongoDB数据库中文件的名称
string mongoDBFileName="微软官方2010年宽屏PPT图表全集400张锐普PPT论坛首发";
//设置GridFS文件中对应的集合前缀名
MongoGridFSSettings fsSetting=new MongoGridFSSettings(){Root="userdata"};
//实例化一个GridFS
MongoGridFS gridfs=new MongoGridFS(mydb,fsSetting);
//将本地文件上传到mongoDB中去,以默认块的大小256KB对文件进行分块
gridfs.Upload(localFileName,mongoDBFileName);

}
}
}

传了一个112.2MB的文件到路由服务器中。通过以下命令观察下此时数据库中集合情况

mongos> use userDB
switched to db userDB
mongos> show collections

system.indexes
userdata.chunks
userdata.files
此时数据库中有新增加了两个集合userdata.chunks和userdata.files,其中userdata.chunks是真正存储数据的地方。以下命令观察此集合的概况

mongos> db.userdata.chunks.stats()
{
"sharded" : false,
"primary" : "shard0000",
"ns" : "userDB.userdata.chunks",
"count" : 449,
"size" : 117711616,
"avgObjSize" : 262163.95545657014,
"storageSize" : 135131136,
"numExtents" : 12,
"nindexes" : 2,
"lastExtentSize" : 26034176,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 57232,
"indexSizes" : {
"_id_" : 24528,
"files_id_1_n_1" : 32704
},
"ok" : 1
}
其中 "sharded" : false表明此表还没进行分片存储,路由服务器此时将数据全部保存到分片0所对应的服务器中了,文件的大小为117711616字节,在linux下通过文件系统的命令:

[email protected]:/usr/local/mongoDB/bin# cd /data/shard/s0/userDB
[email protected]:/data/shard/s0/userDB# ls -l
总用量 475156
drwxr-xr-x 2 root root 4096 2012-05-27 16:57 _tmp
-rw------- 1 root root 67108864 2012-05-27 16:57 userDB.0
-rw------- 1 root root 134217728 2012-05-27 16:57 userDB.1
-rw------- 1 root root 268435456 2012-05-27 16:57 userDB.2
-rw------- 1 root root 16777216 2012-05-27 16:57 userDB.ns
发现文件确实被存在分片0所对应的服务器中。

继续上传更大的文件到路由服务器,突破分片设置中的默认块的大小200MB,看是什么情况?代码仍然如上,只是修改上传的文件,上传的文件大小为:393.0MB


using System;
using System.Collections;
using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;

namespace mongoDBClient
{
class MainClass
{
public static void Main (string[] args)
{
//mongoDb服务实例连接字符串
string con="mongodb://localhost:40000";
//得到一个于mongoDB服务器连接的实例
MongoServer server=MongoServer.Create(con);
//获得一个与具体数据库连接对象,数据库名为gywdb
MongoDatabase mydb=server.GetDatabase("userDB");
//定义一个本地文件的路径字符串
string localFileName="/home/guoyuanwei/学习资料/Platform5.24.rar";
//定义mongoDB数据库中文件的名称
string mongoDBFileName="软件源代码";
//设置GridFS文件中对应的集合前缀名
MongoGridFSSettings fsSetting=new MongoGridFSSettings(){Root="userdata"};
//实例化一个GridFS
MongoGridFS gridfs=new MongoGridFS(mydb,fsSetting);
//将本地文件上传到mongoDB中去,以默认块的大小256KB对文件进行分块
gridfs.Upload(localFileName,mongoDBFileName);

}
}
}

首先通过以下命令观察[email protected]:/data/shard/s0/userDB# ls -l
总用量
2048028
drwxr-xr-x 2 root root 4096 2012-05-27 17:22 _tmp
-rw------- 1
root root 67108864 2012-05-27 17:22 userDB.0
-rw------- 1 root root 134217728
2012-05-27 17:22 userDB.1
-rw------- 1 root root 268435456 2012-05-27 17:22
userDB.2
-rw------- 1 root root 536870912 2012-05-27 17:22
userDB.3
-rw------- 1 root root 1073741824 2012-05-27 17:22
userDB.4
-rw------- 1 root root 16777216 2012-05-27 17:22
userDB.ns
发现文件还是被存到默认的分片服务器0上。分片1上的数据还没有。尽管文件的总大小已经达到了需要分片存储的条件,即块的大小200MB
因此下面需要重新设置路由服务器,使其对集合userDB.userdata.chunks(这个里面存储了用户上传的文件)进行分片。
要想实现海量数据的分布式存储,那么就要对集合进行分片,因此片键的选择是至关重要的,它直接决定了集群中数据分布是否均衡、集群性能是否合理。那么我们究竟该选择什么样的字段来作为分片Key呢?这是个需要反复实践总结的地方。由于这里利用了分布式文件系统GridFS,因此有几点要说明(碰到错误,在网上查到的http://blog.csdn.net/zhangzhaokun/article/details/6324389):GridFS
根据需求的不同,GridFS有几种不同的分片方法。基于预先存在的索引是惯用的分片办法:
1)“files”集合(Collection)不会分片,所有的文件记录都会位于一个分片上,高度推荐使该分片保持高度灵活(至少使用由3个节点构成的replica
set)。
2)“chunks”集合(Collection)应该被分片,并且用索引”files_id:1”。已经存在的由MongoDB的驱动来创建的“files_id,n”索引不能用作分片Key(这个是一个分片约束,后续会被修复),所以不得不创建一个独立的”files_id”索引。使用“files_id”作为分片Key的原因是一个特定的文件的所有Chunks都是在相同的分片上,非常安全并且允许运行“filemd5”命令(要求特定的驱动)。
前面已经分析过,在userDB.userdata.chunks集合中每一个记录都有一个字段file_id,代表了此块属于哪个文件,因此这里建一个以file_id的索引,以此字段键做为片键,同一个文件的块会被分配到同一个分片下
mongos>
db.userdata.chunks.ensureIndex({files_id:1})
设置片键的命令如下:
mongos>
db.runCommand({shardcollection:"userDB.userdata.chunks",key:{files_id:1}}
{
"collectionsharded" : "userDB.userdata.chunks", "ok" : 1 }
再次查看此表的状态:
"sharded" : true说明此集合被分片了。
mongos>
db.userdata.chunks.stats()
{
"sharded" : true,
"flags" : 1,
"ns" :
"userDB.userdata.chunks",
"count" : 2022,
"numExtents" : 19,
"size" :
529953820,
"storageSize" : 538714112,
"totalIndexSize" :
245280,
"indexSizes" : {
"_id_" : 73584,
"files_id_1" :
73584,
"files_id_1_n_1" : 98112
},
"avgObjSize" :
262093.87734915924,
"nindexes" : 3,
"nchunks" : 2,
"shards" :
{
"shard0000" : {
"ns" : "userDB.userdata.chunks",
"count" :
2022,
"size" : 529953820,
"avgObjSize" :
262093.87734915924,
"storageSize" : 538714112,
"numExtents" :
19,
"nindexes" : 3,
"lastExtentSize" : 93306880,
"paddingFactor" :
1,
"flags" : 1,
"totalIndexSize" : 245280,
"indexSizes" : {
"_id_" :
73584,
"files_id_1_n_1" : 98112,
"files_id_1" : 73584
},
"ok" :
1
}
},
"ok" : 1
}
多次执行如下代码上传文件后:执行如下命令观看系统中存在的文件
mongos>
db.userdata.files.find()
{ "_id" : ObjectId("4fc1ec6c1d41c809ed4230d3"),
"filename" : "微软官方2010年宽屏PPT图表全集400张锐普PPT论坛首发", "length" : 117652480,
"chunkSize" : 262144, "uploadDate" : ISODate("2012-05-27T08:57:16.676Z"), "md5"
: "506810e215c773addc3ce10a035695d9" }
{ "_id" :
ObjectId("4fc1f2451d41c80b0f29eda1"), "filename" : "软件源代码", "length" :
412116413, "chunkSize" : 262144, "uploadDate" :
ISODate("2012-05-27T09:22:13.443Z"), "md5" : "28cadbb180093dbcd15b25f0e741ae0a"
}
{ "_id" : ObjectId("4fc1fe7d1d41c80b4d4a17cb"), "filename" : "新的软件源代码",
"length" : 412116413, "chunkSize" : 262144, "uploadDate" :
ISODate("2012-05-27T10:14:21.845Z"), "md5" : "28cadbb180093dbcd15b25f0e741ae0a"
}
{ "_id" : ObjectId("4fc212541d41c80ba8e1180f"), "filename" : "新微软PPT",
"length" : 117652480, "chunkSize" : 262144, "uploadDate" :
ISODate("2012-05-27T11:39:00.598Z"), "md5" : "506810e215c773addc3ce10a035695d9"
}
{ "_id" : ObjectId("4fc21b9e1d41c80747e207e8"), "filename" : "新微软PPT1",
"length" : 117652480, "chunkSize" : 262144, "uploadDate" :
ISODate("2012-05-27T12:18:38.183Z"), "md5" : "506810e215c773addc3ce10a035695d9"
}
可以看到实验上传了5个文件
执行以下命令观察文件分块后在集群中的部署情况:
mongos>
db.userdata.chunks.stats()
{
"sharded" : true,
"flags" : 0,
"ns" :
"userDB.userdata.chunks",
"count" : 4493,
"numExtents" : 35,
"size" :
1177568872,
"storageSize" : 1274904576,
"totalIndexSize" :
531440,
"indexSizes" : {
"_id_" : 163520,
"files_id_1" :
155344,
"files_id_1_n_1" : 212576
},
"avgObjSize" :
262089.66659247718,
"nindexes" : 3,
"nchunks" : 3,
"shards" :
{
"shard0000" : {
"ns" : "userDB.userdata.chunks",
"count" :
4044,
"size" : 1059857256,
"avgObjSize" :
262081.4183976261,
"storageSize" : 1139773440,
"numExtents" :
23,
"nindexes" : 3,
"lastExtentSize" : 193486848,
"paddingFactor" :
1,
"flags" : 0,
"totalIndexSize" : 449680,
"indexSizes" : {
"_id_" :
138992,
"files_id_1_n_1" : 179872,
"files_id_1" : 130816
},
"ok" :
1
},
"shard0001" : {
"ns" : "userDB.userdata.chunks",
"count" :
449,
"size" : 117711616,
"avgObjSize" :
262163.95545657014,
"storageSize" : 135131136,
"numExtents" :
12,
"nindexes" : 3,
"lastExtentSize" : 26034176,
"paddingFactor" :
1,
"flags" : 1,
"totalIndexSize" : 81760,
"indexSizes" : {
"_id_" :
24528,
"files_id_1_n_1" : 32704,
"files_id_1" : 24528
},
"ok" :
1
}
},
"ok" : 1
}
执行命令观察分片的概况
printShardingStatus()
---
Sharding Status ---
sharding version: { "_id" : 1, "version" : 3
}
shards:
{ "_id" : "shard0000", "host" : "localhost:20000" }
{ "_id" :
"shard0001", "host" : "localhost:20001" }
databases:
{ "_id" : "admin",
"partitioned" : false, "primary" : "config" }
{ "_id" : "userDB",
"partitioned" : true, "primary" : "shard0000" }
userDB.userdata.chunks
chunks:
shard0000 2
shard0001 1
{ "files_id" : { $minKey : 1 } }
-->> { "files_id" : ObjectId("4fc1f2451d41c80b0f29eda1") } on : shard0000
{ "t" : 2000, "i" : 1 }
{ "files_id" : ObjectId("4fc1f2451d41c80b0f29eda1") }
-->> { "files_id" : ObjectId("4fc21b9e1d41c80747e207e8") } on : shard0000
{ "t" : 1000, "i" : 2 }
{ "files_id" : ObjectId("4fc21b9e1d41c80747e207e8") }
-->> { "files_id" : { $maxKey : 1 } } on : shard0001 { "t" : 2000, "i" : 0
}

至此一个简单的分布式文件存储模型实验完毕!

C# MongoDB分布式海量存储实验

时间: 2024-08-26 15:18:09

C# MongoDB分布式海量存储实验的相关文章

【MongoDB】MongoDB数据库之海量存储机制

GridFS是一种将大型文件存储在Mongodb数据库中的文件规范. 一.如何实现海量存储 由于Mongodb中的bson对象大小是限制的,所以gridfs规范提供了一种透明的机制,可以将一个大文件分成多个较小的文件.这样的机制允许有效地保存大文件的对象,特别是哪些巨大的文件,比如视频,高清图片:该规范指定了一个将文件分块的标准,每个文件都在集合对象中保存一个元数据对象,一个或多个块对象可被组合在一个chunk块集合中.mongodb中主要是利用mongofiles工具. Grifs使用两个表来

mongodb 分布式文档存储数据库

简述: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型. Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引. 在高负载的

海量图片存储,杉岩分布式对象存储轻松应对

当今世界,互联网.大数据应用迅猛发展,物联网.人工智能.云计算 技术日新月异,随之而来的是各种企业和个人应用持续不断地产生亿级甚至是百亿级的海量小文件.这些小文件的元数据管理.存储性能以及访问效率等问题因而成为学术界和工业界公认的难题. 例如,国内目前最大的电商网站淘宝存储的商品图片超过 200 亿张,这些文件的平均大小仅为 15KB 左右,国外著名的社交网站Facebook 存储的图片总量更是超过了600亿张:在线视频播放服务中,每个视频会被切片服务器分割成 1MB 左右的分片文件,一部动画电

MongoDb gridfs-ngnix文件存储方案 - 图片

http://www.cnblogs.com/wintersun/p/4622205.html 在各类系统应用服务端开发中,我们经常会遇到文件存储的问题. 常见的磁盘文件系统,DBMS传统文件流存储.今天我们看一下基于NoSQL数据库MongoDb的存储方案.笔者环境 以CentOS 6.5,MongoDb 2.6.3,  Nginx-1.4.7 为例,您需要了解Linux常用命令. 先来回顾一下MongoDb的内部文件结构 MongoDB在数据存储上按命名空间来划分,一个collection是

分布式文件存储fastdfs

FastDFS是一个开源的轻量级应用级的分布式文件存储服务,它对文件进行管理,功能包括: 文件存储.文件同步.文件访问(文件上传.文件下载)等解决了大容量存储和负载均衡的问题. 特别适合以文件为载体的在线服务,如相册网站.视频网站等等. FastDFS有三个角色:跟踪服务器(tracker server).存储服务器(storage server)和客户端(client). 1)跟踪服务器:主要做调度工作 起负载均衡的作用 2)存储服务器:存储节点存储文件 完成文件管理的所有功能:存储.同步和提

分布式文件存储

Storage不小心看到这个类,注释写着// 分布式文件存储类....不懂,吖的,google不能用,只能用某度,挺火大的. 又找到ThinkPHP\Library\Think\Storage\Driver 下面的File.class.php,那么,Storage类只是通过判断type去加载File.class.php或Sea.class.php 暂时不懂原理,Storage就两个方法,能看懂,但不理解为什么要这样写,继续看. 分布式文件存储,布布扣,bubuko.com

在动态网络下实现分布式共享存储

http://cacm.acm.org/magazines/2014/6/175173-implementing-distributed-shared-memory-for-dynamic-networks 译者序      共享内存系统是普通单机程序开发人员熟悉的开发范式,通过简单的使用读.写命令,就能确保将我们需要的值从内存中放入和读取出来,数据的一致性等问题,在单机系统中,开发人员根本不需要考虑,比如你不需要考虑当你进行了i=i+1后,再获取i的值时,i的值可能还没有来的及变化,因为这些都

mongodb三种存储引擎高并发更新性能专题测试

背景说明 近期北京理财频道反馈用来存放股市实时数据的MongoDB数据库写响应请求很慢,难以跟上业务写入速度水平.我们分析了线上现场的情况,发现去年升级到SSD磁盘后,数据持久化的磁盘IO开销已经不是瓶颈.通过日志分析,线上单次写入(更新)请求大多在数十毫秒这个级别,数据库端观察几个主要的db在繁忙时通常有95%以上的时间在进行锁等待.线上数据库并发很高,接近1000个连接,所以怀疑是并发争用表锁导致性能不足. 我们知道MongoDB的mmap存储引擎一直是库/表级锁,因此任何写操作并发越高锁争

MongoDB分布式

安装 scp mongodb-linux-x86_64-2.6.0.tgz [email protected]:/home/user/ ssh [email protected] tar zxvf mongodb-linux-x86_64-2.6.0.tgz mv mongodb-linux-x86_64-2.6.0 mongodb cd mongodb/ mkdir db 配置环境 sudo vi /etc/profile #mango export MANGO_HOME=/home/user