mongodb数据存储原理,mongodb 文件存储
GODB的GridFS是个好东西。使用GridFS,我们可以在mongodb中存储文件。有人问,为什么要把文件保存在mongodb里?放在一个目录下就可以了,然后URL就可以直接访问了,比如[php]www.xxoo.com/xo.jpg[/php]。当站真的很小,附件不多的时候,当然这是一个很好的处理方式。但是当附件数量石沉大海的时候~ ~那么这样保存就很痛苦,备份是个问题,硬盘IO瓶颈也会凸显出来。问题随之而来。是的,需要分布式文件存储。使用GridFS存储文件,然后使用mongodb的分片,可以实现海量存储。当然,本文只是知识的延伸~这个方案的制作和使用有问题,与我无关~ ~不要找我。
环境:系统是FreeBSD 8.2-RELEASE。
首先,开始安装mongodb (mongodb-src-r1.8.3 .):
VM 205 # CD/usr/ports/databases/MongoDB/
Vm205# make安装干净的副本代码
等等~ ~。一分钟就结束了。在那之后,你必须配置它,并且这样做FB的vi /etc/rc.conf很好理解:
God _ enable= yes # boot
God _ dbpath=/data/mongodb # DB存储目录复制代码完毕,记得启动mongodb:
/usr/local/etc/rc.d/mongostart复制代码
因为我们使用nginx的nginx-gridfs模块访问mongodb,所以安装nginx (nginx-1.0.8)。
vm205# cd /usr/ports/www/nginx
Vm205# make安装干净的副本代码
记住,在选择模块的步骤中,记得选择:nginx-gridfs模块。不然~~ nginx和mongodb没关系。
又要等了~ ~喝杯咖啡吧。安装完成后,您必须配置它:vi /etc/rc.conf
NGX _ ENABLE= yes # Boot startup复制代码启动:
/usr/local/etc/rc.d/nginx开始复制代码
nginx和mongodb都装上的时候。让我们开始分布式文件存储之旅。首先写一个demo,上传文件的时候把文件存储在mongodb里。
写一个上传表格:demo.php
上传文件:
复制代码验收表,并将上传的文件存储在MongoDB:gridfs.php中。
$ con=new Mongo( MongoDB://192 . 168 . 1 . 205 );//连接到Mongo服务器
$ db=$ con-selectDB( xxoo );//连接到数据库
$ grid=$ d b-getGridFS();
$grid-storeUpload(pic , demo . jpg );
?复制代码。运行程序,提交表单,然后去mongo看看有没有保存。
Vm205# mongo#进入mongo
MongoDB shell版本:1.8.3
连接到:测试
Show dbs #显示所有数据库
管理(空)
本地(空)
妮娘0.0625GB
Xxoo 0.0625GB#看xxoo ~ ~看代码就在上面。在选择DB的时候,我们选择了xxoo数据库,存在证书被存储。
使用xxoo #进入xxoo数据库
切换到db xxoo
Show collections#显示数据库中的收藏(只在那时观看)
fs.chunks
文件系统
System.indexes复制代码。我们先来看看xxoo集合中自动创建的三个集合。
Fs.chunks块集合,gridfs会把大文件分成小块进行存储,所以可以存储大文件。
让我们看看这个文件里有什么。db.fs.files.find()
{ _ id :ObjectId( 4eb 53994 D4 a9 e 198090000001 ), filename : demo.jpg , upload date :iso date( 2011-11-05t 13:26:44Z ), length : 373044,Chunksize: 262144, MD5 : 991 a 2475 cc 9 Fe 9a 414148 b 45519 a6c 40 }复制代码
它存储了我们刚刚上传的文件的信息,比如文件名。长度文件大小块大小块大小。因此,该文件存储在mongodb中。
System.indexes集合索引文件。懂索引~不懂先学mysql,呵呵。
好吧。过来这里。分布式文件存储,完成一半~ ~。这是一半的文件存储。分布式呢?接下来我们来分配吧~ ~淡定~这个分配其实挺简单的。
为了分发,我们准备了4个Freebsd服务器。使用两台服务器和多个进程也可以实现,但是对于四台服务器还不够清晰。让我们建立一个基本的分布式系统。
1.配置mongod服务器:192.168.1.202将“mongos路由服务器”的配置信息存储到硬盘上。
2.mongos路由服务器:192.168.1.203将部分存储节点的路由信息存储到内存中。
3.mongod存储节点:192.168.1.204是一个真实的存储节点,存储上传的图片、文件等。可以扩大n个单位的分布。多少~我也没测试过。
4.mongod存储节点:192.168.1.205
首先,配置mongod服务器。192.168.1.202:
/usr/local/cup of passion/mongod-configs VR-dbpath=/data/configs VR-log path=/data/configs VR/mongo . log-port 27019-log append-fork复制代码
好的.确认启动成功:psaux grep mongo已确认木材问题。继续。
配置mongos路由服务器。192.168.1.203:
/usr/local/cup of passion/mongos-configdb 192 . 168 . 1 . 202:27019-log path=/data/configdb/mongo . log-port 27017-log append-fork复制代码
确保启动正常。继续
配置Mongod存储节点:192.168.1.204和192.168.1.205,在存储节点上分别运行以下shell。
/usr/local/the cup of passion/mongod-shardsvr-dbpath=/data/shardsvr-log path=/data/shardsvr-port 27017-log append-fork复制代码
好了,这里,基本上所有的服务器都配置好了。下一个。我们即将添加“mongos路由信息”。主要是告诉蒙哥。哪些服务器是存储节点?在数据库上开始碎片化?使用集合中的键进行切片。
向mongos路由服务添加一个存储节点:
db . run command({ addshard: 192 . 168 . 1 . 204:27017 })
db . run command({ addhard: 192 . 168 . 1 . 205:27017 })来复制代码
告诉mongos路由节点将这些库和集合分块存储。
db . run command({ enables Harding : xxoo })
db . run command({ shard collection : xxoo . fs . chunks , key : {_id : 1}})
db . run command({ shard collection : xxoo . fs . files , key: {_ id: 1}})复制代码
好了,分布式环境建好了。让我们回头看看代码。我们只需要修改访问地址。所有的请求都要通过mongos路由服务器’,这样我们才能自动帮你切片~ ~
$ con=new Mongo( MongoDB://192 . 168 . 1 . 203 );//连接mongos路由服务器,让它给我们切片。
$ db=$ con-selectDB( xxoo );//连接到数据库
$ grid=$ d b-getGridFS();
$grid-storeUpload(pic , demo . jpg );
?复制代码
文件上传和分布式存储。都实现了。Nginx开始玩了。我们使用nginx作为静态资源的服务器。前面我们安装了nginx-gridfs模块,它有自己的访问mongodb的驱动。那挺方便的。看看nginx的配置:
服务器{
听8088;
server_name本地主机;
#重点在这里
位置/{
grid fs xxoo field=filename type=string;
蒙哥192 . 168 . 1 . 203:27017;
}
#将服务器错误页面重定向到静态页面/50x.html
#
error _ page 500 502 503 504/50x . html;
location=/50x.html {
根html
}
#拒绝访问。htaccess文件,如果Apache的文档根
#赞同nginx的观点
#
位置~ /WEB-INF/{
denyall
}
}复制代码
重点理解这些:
gridfsxxoo field=文件名类型=字符串;
Gridfs[数据库]字段=[使用该字段查询]类型=[字段类型]。一般我们查询存储在mongodb中的文件名,然后打开要显示的文件。
蒙哥192 . 168 . 1 . 203:27017;
Mongos路由服务器和连接端口。
那么我们现在可以浏览地址:
[PHP]http://192 . 168 . 1 . 203:8088/demo . jpg[/PHP]可以显示我们想要的图片。
最后,我为这个教程写了一个方便的部署脚本~ ~。不完美~凑合吧。
#!/usr/激情杯/python
#编码:utf-8
导入操作系统
从系统导入argv
def runShell(命令):
内容=
out=os.popen(命令)
虽然正确:
line=out.readline()
内容=行
如果不行:
破裂
返回内容
if __name__==__main__ :
如果len(argv) 1:
para=argv[1]
if para==config_mongod :
config _ mongod={ path :/data/config , log path :/data/config/config . log , port:27019}
打印runShell(/usr/local/激情的水杯/mongod-config SVR-dbpath=% s-log path=% s-port % d-log append-fork " %(config _ mongod[ path ],config_mongod[logpath],config_mongod[port]))
elif para==config_mongos :
config _ mongos={ host : 192。168 .1 .202:27019 ,日志路径:/data/config/configdb。日志,端口:27017}
打印runShell(/usr/local/激情的水杯/mongos-config db % s-log path=% s-port % d-log append-fork " %(config _ mongos[ host ],config_mongos[logpath],config_mongos[port]))
elif para==shard :
mongodb={port:27017, dbpath :/data/MongoDB ,日志路径:/data/MongoDB/MongoDB。日志 }
打印runShell(/usr/local/激情的水杯/mongod-shardsvr-dbpath=% s-log path=% s-port % d-log append-fork " %(MongoDB[ dbpath ],mongodb[logpath],mongodb[port]))
elif para==enable :
导入安装
conn=pymongo .连接( 192.168.1.203 ,27017)
db=连接管理
碎片主机=[ 192。168 .1 .204:27017 , 192.168.1.205:27017]
对于范围内的IP(len(碎片主机)):
db。运行命令({ addshard :shard host[IP]})
db。运行命令({ enables Harding : test })
db。运行命令({ 碎片集合: test。用户, key:{_id:1}})
否则:
打印“没有argv!”复制代码
转载自:http://bbs.phpchina.com/forum.php?mod=viewthreadtid=226415