mongodb数据存储原理,mongodb 文件存储

  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

mongodb数据存储原理,mongodb 文件存储