MongoDb gridfs-ngnix文件存款和储蓄方案

安装Install与配置

1.安装mongoDb

增加MongoDB Repository,不清楚vim,请参考VIM

vim /etc/yum.repos.d/mongodb.repo

如果是64bit的

[mongodb]

name=MongoDB Repository

baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86\_64/

gpgcheck=0

enabled=1

32bit的系统:

[mongodb]

name=MongoDB Repository

baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686/

gpgcheck=0

enabled=1

下一场安装,会提示Y/N:

yum install mongo-10gen mongo-10gen-server

启动:

service mongod start

查看情形

service mongod status

停止

service mongod stop

更加多,关于三.0上述版本,请参见官网。

2.安装nginx及nginx-gridfs

依赖库、工具

# yum -y install pcre-devel openssl-devel zlib-devel

# yum -y install gcc gcc-c++

下载nginx-gridfs源码

# git clone https://github.com/mdirolf/nginx-gridfs.git

# cd nginx-gridfs

# git checkout v0.8

# git submodule init

# git submodule update

下载nginx源码,编写翻译安装。(高版本协助倒霉)

# wget http://nginx.org/download/nginx-1.4.7.tar.gz

# tar zxvf nginx-1.4.7.tar.gz

# cd nginx-1.4.7

# ./configure –with-openssl=/usr/include/openssl –add-module style=”color: #9b00d3;”>=../nginx-gridfs/

# make -j8 && make install –j8

留意银白字符配置成相应nginx-gridfs的门径

  1. 配置nginx-gridfs

vim /usr/local/nginx/conf/nginx.conf

在 server 节点中添加 location 节点

location /img/ { 
        gridfs testdb 
        field=filename 
        type=string; 
        mongo 192.168.0.159:27017; 
}

location /files/ { 
        gridfs testdb 
        field=_id 
        type=objectid; 
        mongo 192.168.0.159:27017; 
}

此处大家的mongo服务在IP 1玖贰.16八.0.15玖。 
假诺不内定 田野,暗许为 MongoDB 的自增ID,且type为int

布署参数介绍:

gridfs:nginx识别插件的关键字 
testdb:db名 
[root_collection]: 选择collection,如root_collection=blog,
mongod就会去找blog.files与blog.chunks七个块,私下认可是fs 
[field]: 查询字段,保证mongdb里有那么些字段名,帮助_id, filename,
可省略, 默认是_id 
[type]: 解释田野的数据类型,帮忙objectid, int, string, 可粗略,
私下认可是int 
[user]: 用户名, 可省略 
[pass]: 密码, 可省略 
mongo: mongodb url 

结论

        Gridfs最符合大文件存储,特别是录像,音频,大型图片领先1陆MB大小的文书。小型文件也能够储存,可是须要交给1遍询问代价(metadata与file
content) [Tip#18 50 Tips and Tricks for MongoDB
Developers
]。不要涂改存款和储蓄文件的始末,而是更新文件元数据如版本,或上传新版本的公文,删除老版本的文件。对于大量文件存款和储蓄时,须要四个数据节点,复制,数据分片等。别基于nginx访问图片文件,浏览器未有缓存。
从互连网存款和储蓄图片案例来看,图片大都以jpg,
png与缩略图像和文字件,分存式文件系统(DFS)会是更加好的消除方案。

GridFS在数据库中,默许使用fs.chunks和fs.files来储存文件。

其余有关mongodb 的壹部分小提醒:

  • 永不接纳31位版本

MongoDB的三玖人版本也是不提议被选用的,因为你只可以处理二GB大小的多寡。还记得第一个限制么?那是MongoDB关于该限制的说明

  • 打听官方的范围

让笔者倍感讶异的是,很少有人会询问有关她们快要采纳的工具的范围。幸亏,MongoDB的开发职员公布了一篇MongoDB全体限制的博客,你能够提前领会相关消息,制止在运用进度中狼狈。

  • 主从复制不会保障高可用性

固然已经不建议被利用了,可是MongoDB如故提供了此外一种复制策略,即主从复制。它解决了13个节点限制难题,然则却爆发了新的题材:假诺急需变更集群的主节点,那么您不可能不得手工业完成,感到讶异?看看这么些链接吧。

  • 因此复制集完成的多少复制效果相当屌,但是也有限制

MongoDB中数据复制的复制集策略非常的棒,很不难配置并且动用起来实在无误。但如若集群的节点有13个以上,那么您就会遇到标题。MongoDB中的复制集有13个节点的范围,那里是难点的讲述,你能够追踪这几个难题看看是还是不是早已被消除了。

1
2
3
4
5
6
{
"_id" : ObjectId("4f4608844f9b855c6c35e299"),    //chunk的id
"files_id" : ObjectId("4f4608844f9b855c6c35e298"),  //文件的id,对应fs.files中的对象,相当于fs.files集合的外键
"n" : 0,     //文件的第几个chunk块,如果文件大于chunksize的话,会被分割成多个chunk块
"data" : BinData(0,"QGV...")     //文件的二进制数据,这里省略了具体内容
}

图片 1

启动nginx服务

# /usr/local/nginx/sbin/nginx

唯恐出现: 
Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in
use)

那时可用使用命令关闭占用80端口的顺序

sudo fuser -k 80/tcp

对应的fs.chunks中的chunk如下:

里面fs.files集合存放文件的音信,fs.chunks存放文件数量。

一个fs.files集合中的一条记下内容如下,即3个file的新闻如下:

怎么时候利用Gridfs

出自官方2.六.10版本 手册内容

For documents in a MongoDB collection, you should always use GridFS
for storing files larger than 16 MB.  In some situations, storing
large files may be more efficient in a MongoDB database than on a
system-level filesystem. 

• If your filesystem limits the number of files in a directory, you
can use GridFS to store as many files as needed. 
• When you want to keep your files and metadata automatically synced
and deployed across a number of systems and facilities. When using
geographically distributed replica sets MongoDB can distribute files
and their metadata automatically to a number of mongod instances and 
facilities. 
• When you want to access information from portions of large files
without having to load whole files into memory, you can use GridFS to
recall sections of files without reading the entire file into
memory. 

Do not use GridFS if you need to update the content of the entire file
atomically. As an alternative you can store multiple versions of each
file and specify the current version of the file in the metadata. You
can update the metadata field that indicates “latest” status in an
atomic update after uploading the new version of the file, and later
remove previous versions if needed. 

Furthermore, if your files are all smaller the 16 MB BSON Document
Size limit, consider storing the file manually within a single
document. You may use the BinData data type to store the binary data.
See your drivers documentation for details on using BinData.

在读取文件的时候,先据查询的标准,在fs.files中找到3个伏贴的笔录,获得“_id”的值,再据这几个值到fs.chunks中寻觅全部“files_id”为“_id”的chunk,并按“n”排序,最后依次读取chunk中“data”对象的始末,还原成原来的文书。 

资源:

GridFS官方 
Building MongoDB Applications with Binary Files Using
GridFS

简言之测试

用原生的命令行上传贰个文件

mongofiles put 937910.jpg –local ~/937910_100.jpg –host
192.168.0.159 –port 27017 –db testdb –type jpg

937九十.jpg是大家提前下载好三个图片文件,注意大家从没点名collection,暗许是fs

http://www.robomongo.org/安装robomongo管理工科具, 查看刚刚上传的文书

图片 2

谈到底我们在浏览器访问,假设见到图片就OK了

http://192.168.0.159/img/937910.jpg

对于.net环境下mongodb CSharpDriver  1.10.0 从Nuget: 
Install-Package mongocsharpdriver -Version 1.10.0 
笔者们运用如下1些代码: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int nFileLen = fileUploadModel.FileBytes.Length;
 
MongoGridFSSettings fsSetting = new MongoGridFSSettings() { Root = CollectionName };
MongoGridFS fs = new MongoGridFS(mongoServer, MongoDatabaseName, fsSetting);
 
//调用Write、WriteByte、WriteLine函数时需要手动设置上传时间
//通过Metadata 添加附加信息
MongoGridFSCreateOptions option = new MongoGridFSCreateOptions();
option.Id = ObjectId.GenerateNewId();
var currentDate = DateTime.Now;
option.UploadDate = currentDate;
option.Aliases = alias;
BsonDocument doc = new BsonDocument();
//文档附加信息存储
if(fileUploadModel.DocExtraInfo!=null&&fileUploadModel.DocExtraInfo.Count>0)
{
    foreach(var obj in fileUploadModel.DocExtraInfo)
    {
        if (!doc.Elements.Any(p => p.Name == obj.Key))
        {
            doc.Add(obj.Key, obj.Value);
        }
    }
}
option.Metadata = doc;
 
//创建文件,文件并存储数据
using (MongoGridFSStream gfs = fs.Create(fileUploadModel.FileName, option))
{
    gfs.Write(fileUploadModel.FileBytes, 0, nFileLen);
    gfs.Close();
}
log.ErrorFormat("附件标识:{0} 文件名:{1} 上传成功", alias, fileUploadModel.FileName);
return option.Id.ToString();

注意,目前gridfs-ngnix不支持_id类型是GUID的,关于ObjectId参考官网,如下图:

图片 3

mongodb发生objectid还有五个更加大的优势,正是mongodb能够由此作者的服务来发生objectid,也得以经过客户端的驱动程序来发出。

数据库主从同步

原理图

图片 4

上海体育场所是MongoDB选取Replica Sets情势的共同流程

  • 甲子革命箭头表示写操作写到Primary上,然后异步同步到四个Secondary上
  • 银白箭头表示读操作能够从Primary或Secondary任意四个上读
  • 梯次Primary与Secondary之间一向维系心跳同步检验,用于判断Replica
    Sets的意况
  1. MongoDB在数据存储上按命名空间来划分,三个collection是2个命名空间,1个目录也是2个命名空间
  2. 同1个命名空间的数码被分为很八个Extent,Extent之间采取双向链表连接
  3. 在每三个Extent中,保存了实际每1行的数量,这么些多少也是经过双向链接连接的
  4. 每一行数据存款和储蓄空间不仅囊括数据占用空间,还大概含有部分增大空间,那使得在数据update变大后能够不移步地方
  5. 索引以BTree结构落成

  在各种系统应用服务端支付中,大家日常会遇上文件存款和储蓄的题材。
常见的磁盘文件系统,DBMS古板文书流存款和储蓄。前些天我们看一下基于NoSQL数据库MongoDb的储存方案。我环境
以CentOS 6.5,MongoDb 二.陆.三,  Nginx-一.四.七为例,您须求通晓Linux常用命令。 
先来回看一下MongoDb的里边文件结构

1
2
3
4
5
6
7
8
9
10
{
"_id" : ObjectId("4f4608844f9b855c6c35e298"),       //唯一id,可以是用户自定义的类型
"filename" : "CPU.txt",      //文件名
"length" : 778,      //文件长度
"chunkSize" : 262144,    //chunk的大小
"uploadDate" : ISODate("2012-02-23T09:36:04.593Z"), //上传时间
"md5" : "e2c789b036cfb3b848ae39a24e795ca6",      //文件的md5值
"contentType" : "text/plain"     //文件的MIME类型
"meta" : null    //文件的其它信息,默认是没有”meta”这个key,用户可以自己定义为任意BSON对象
}

数量分片机制

图片 5

  • MongoDB的分片是钦命多个分片key来展开,数据按限定分成不相同的chunk,每种chunk的大小有限量
  • 有多少个分片节点保存这一个chunk,每种节点保存1部分的chunk
  • 每五个分片节点都是一个Replica Sets,那样保险数据的安全性
  • 当叁个chunk超过其范围的最大体量时,会不一致成三个小的chunk
  • 当chunk在分片节点中遍布不均匀时,会迷惑chunk迁移操作

图片 6

分片时服务器角色

图片 7

地点讲了分片的正式,上边是现实性在分片时的三种节点剧中人物

  • 客户端访问路由节点mongos来展开多少读写
  • config服务器保存了三个映射关系,一个是key值的间隔对应哪八个chunk的炫耀关系,另八个是chunk存在哪1个分片节点的投射关系
  • 路由节点通过config服务器获取数据音讯,通过这么些音讯,找到真正存放数据的分片节点实行相应操作
  • 路由节点还会在写操作时判断当前chunk是或不是当先限定大小,假诺过量,就分列成三个chunk
  • 对此按分片key实行的询问和update操作来说,路由节点会查到现实的chunk然后再拓展连锁的干活
  • 对于不按分片key举行的询问和update操作来说,mongos会对全部下属节点发送请求然后再对回到结果开始展览联合

文本存入到GridFS进度中,假若文件大于chunksize,则把文件分割成五个chunk,再把那些chunk保存到fs.chunks中,最终再把文件新闻存入到fs.files中。

然后是GridFs的结构

网站地图xml地图