GridFS是一種在MongoDB中存儲(chǔ)大二進(jìn)制文件的機(jī)制。使用GridFS存文件有如下幾個(gè)原因:利用Grid可以簡(jiǎn)化需求。要是已經(jīng)用了MongoDB
GridFS是一種在MongoDB中存儲(chǔ)大二進(jìn)制文件的機(jī)制。使用GridFS存文件有如下幾個(gè)原因:
利用Grid可以簡(jiǎn)化需求。要是已經(jīng)用了MongoDB,GridFS就可以不需要使用獨(dú)立文件存儲(chǔ)架構(gòu)。
GridFS會(huì)直接利用業(yè)已建立的復(fù)制或分片機(jī)制,所以對(duì)于文件存儲(chǔ)來(lái)說(shuō)故障恢復(fù)和擴(kuò)展都很容易。
GridFS可以避免用于存儲(chǔ)用戶上傳內(nèi)容的文件系統(tǒng)出現(xiàn)的某些問(wèn)題。例如,GridFS在同一個(gè)目錄下放置大量的文件是沒(méi)有任何問(wèn)題的。
GridFS不產(chǎn)生磁盤(pán)碎片,因?yàn)镸ongoDB分配數(shù)據(jù)文件空間時(shí)以2GB為一塊。
使用場(chǎng)景:如果你的系統(tǒng)有如下情景:
1) 有大量的上傳圖片(用戶上傳或者系統(tǒng)本身的文件發(fā)布等)
2) 文件的量級(jí)處于飛速增長(zhǎng),有可能打到單機(jī)操作系統(tǒng)自己的文件系統(tǒng)的查詢性能瓶頸,甚至超過(guò)單機(jī)硬盤(pán)的擴(kuò)容范圍.
3) 文件的備份(不適用gridfs這種三方也可以做,但是不盡方便),文件系統(tǒng)訪問(wèn)的故障轉(zhuǎn)移和修復(fù)..
4) 文件的索引,存儲(chǔ)除文件本身以外還需要關(guān)聯(lián)更多的元數(shù)據(jù)信息(比如,不僅僅存儲(chǔ)文件,還要保存一些文件的發(fā)布式作者/發(fā)布時(shí)間/文件tag屬性等等自定義信息)并且需要索引的...
5) 基于4),對(duì)文件的分類(lèi)模糊,如果采用操作系統(tǒng)的文件系統(tǒng),文件夾分類(lèi)關(guān)系混亂或者無(wú)法分類(lèi)時(shí)..
6) 當(dāng)前系統(tǒng)是基于web的,對(duì)圖片的訪問(wèn)根據(jù)url了規(guī)則路由的..(普通文件系統(tǒng)也可以)
7) 文件尺寸較小,而且眾多,且文件有可能被遷移/刪除等..
在Mongodb中以GridFSB方式存放文件有兩種方式:
1、命令行方式mongofiles 2、客戶端驅(qū)動(dòng)編程
1、命令行方式mongofiles
mongofiles命令行下向Mongodb數(shù)據(jù)庫(kù)中插入文件數(shù)據(jù)。
mongofiles -host 127.0.0.1:27017 -d mydb put 文件名
向數(shù)據(jù)庫(kù)mydb中插入一個(gè)文件,其中put為命令,,表示向Mongodb中上傳文件,get、delete分別表示取得文件和刪除文件。
執(zhí)行 db.fs.files.find()即可看到GridFS中的文件列表.
mongo自帶有一個(gè)實(shí)現(xiàn)mongofliles,基本操作如下:
列出所有文件:
mongofiles list
上傳一個(gè)文件:
mongofiles put xxx.txt
下載一個(gè)文件:
mongofiles get xxx.txt
查找文件:
mongofiles search xxx //會(huì)查找所有文件名中包含“xxx”的文件
mongofiles list xxx //會(huì)查找所有文件名以“xxx”為前綴的文件
參數(shù)說(shuō)明:
–d 指定數(shù)據(jù)庫(kù) ,默認(rèn)是fs,Mongofiles list –d testGridfs
-u –p 指定用戶名,密碼
-h 指定主機(jī)
-port 指定主機(jī)端口
-c 指定集合名,默認(rèn)是fs
-t 指定文件的MIME類(lèi)型,默認(rèn)會(huì)忽略
2、使用API來(lái)存取文件
我一般用python調(diào)用pymongo管理mongodb的聚集
很多時(shí)候我們可以搭配nginx用,讓nginx直接讀取gridfs的文件。
安裝nginx-gridfs
wget https://download.github.com/mdirolf-nginx-gridfs-v0.8-0-gb5f8113.tar.gz
tar –zxvf mdirolf-nginx-gridfs-v0.8-0-gb5f8113.tar.gz
mv mdirolf-nginx-gridfs-v0.8-0-gb5f8113 mdirolf-nginx-gridfs-v0.8
wget https://download.github.com/mongodb-mongo-c-driver-v0.3-0-g74cc0b8.tar.gz
tar –zxvf mongodb-mongo-c-driver-v0.3-0-g74cc0b8.tar.gz
mv mongodb-mongo-c-driver-v0.3-0-g74cc0b8/* mdirolf-nginx-gridfs-v0.8/mongo-c-driver
rm –rf mongodb-mongo-c-driver-v0.3-0-g74cc0b8
安裝nginx,指定nginx-gridfs目錄與nginx聯(lián)合編譯
wget
tar –zxvf nginx-1.0.1.tar.gz
cd nginx-1.0.1
./configure --prefix=/usr/local/nginx --with-openssl=/usr/include/openssl --with-http_stub_status_module --add-module=/home/cdh/Downloads/mdirolf-nginx-gridfs
make –j8
sudo make install –j8
配置nginx-gridfs
location /pics/ {
gridfs pics
field=filename
type=string;
mongo 127.0.0.1:27017;
}
gridfs:nginx識(shí)別插件的關(guān)鍵字
pics:db名
[root_collection]: 選擇collection,如root_collection=blog, mongod就會(huì)去找blog.files與blog.chunks兩個(gè)塊,默認(rèn)是fs
[field]:查詢字段,保證mongdb里有這個(gè)字段名,支持_id, filename, 可省略, 默認(rèn)是_id
[type]:解釋field的數(shù)據(jù)類(lèi)型,支持objectid, int, string, 可省略, 默認(rèn)是int
[user]:用戶名, 可省略
[pass]:密碼, 可省略
mongo:mongodb url
能下載圖片就說(shuō)明成功了
gridfs 都是應(yīng)用到偏海量,又不到海量的文件需求場(chǎng)景下的,不然咱們也不會(huì)花這么多功夫來(lái)搞這個(gè)了。
在這種需求下,可以用分片和主從把壓力分切開(kāi)。
mkdir -p /data/shard/s0
mkdir -p /data/shard/s1
mkdir -p /data/shard/log
mkdir -p /data/shard/config
#啟動(dòng)shard server
./mongod --shardsvr --port 20000 --dbpath /data/shard/s0 --fork --logpath /data/shard/log/s0.log --directoryperdb
./mongod --shardsvr --port 20001 --dbpath /data/shard/s1 --fork --logpath /data/shard/log/s1.log --directoryperdb
#啟動(dòng)配置服務(wù)器config server
./mongod --configsvr --port 30000 --dbpath /data/shard/config --fork --logpath /data/shard/log/config.log --directoryperdb
#啟動(dòng)route server mongos
mongos --port 40000 --configdb localhost:30000 --fork --logpath /data/shard/log/route.log --chunkSize 1
#添加分片
./mongo admin --port 40000 #鏈接mongos
db.runCommand({addshard:"localhost:20000"}) #添加分片1
db.runCommand({addshard:"localhost:20001"}) #添加分片2
db.runCommand({enablesharding:"test"}) #設(shè)置test庫(kù)開(kāi)啟分片
db.runCommand({shardcollection:"test.users",key:{_id:1}}) #設(shè)置test.users集合分片和分片的主鍵
#驗(yàn)證sharding
use test
#插入50萬(wàn)數(shù)據(jù)
for(var i=1;i<=500000;i++) db.users.insert({age:i,name:"zx",addr:"beijing",country:"china"})
db.users.stats() #查看users的分片情況
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com