利用mongodb实现分布式WEB图片存储

转载 2016年08月30日 14:38:28
利用mongodb实现分布式WEB图片存储
2012-12-22 14:00:33
 。 的确在站比较小得时候,附件不多的时候,当然这样处理很好。但是当 附件数量海里去了~~ 那这样存就蛋疼了, 备份是个问题,硬盘IO瓶颈那会也会凸显出来。问题接踵而来。那会,就需要分布式文件存储了。    利用 GridFS 存储文件, 再利用 mongodb 的分片(sharding) 就可以做到海量存储了。 当然本文只是一个知识扩展~ 生产使用此方案出问题,与本人无关~~别找我。

  1. 等吧~~。一会就完了。完了还要配置下,做FB的 这个懂的    vi   /etc/rc.conf:
    mongod_dbpath="/data/mongodb"  # DB存储目录
      复制代码

      1. 写个上传表单:demo.php  
             上传文件: <input type="file" name="pic"/>
      2. 接受表单把上传的文件存储到 mongodb : gridfs.php
                $con = new Mongo("mongodb://192.168.1.205"); // Connect to Mongo Server
      3.         $grid->storeUpload("pic", 'demo.jpg');
      4. 。运行程序,提交表单,然后去mongo 看看 存上没。
        MongoDB shell version: 1.8.3
      5. admin   (empty)
      6. xxoo    0.0625GB  #  看到 xxoo了吧~~ 再看下刚上面的代码。在 selectDB的时候,我们选择的就是xxoo 数据库,存在了证明文件存储上了。
      7. > show collections  # 显示数据库里的集合(你就当时表吧)
      8. system.indexes
      9. fs.chunks     块集合, gridfs 会把大文件分成一小块一小块的来进行存储,所以可以存储大文件。

        > db.fs.files.find()
      10. 里面存储着我们刚上传的文件的信息,比如 filename  文件名。   length 文件大小   chunkSize 分块大小。  文件就这样给存储到 mongodb了。
        好的。到这里。 分布式文件存储,就完成了一半了~~。 这半就是文件存储。 那分布式呢? 接下来我们就分布式吧~~ 淡定~这个分布式其实还是比较简单的。
        2、mongos 路由服务器   : 192.168.1.203       把一些存储节点的路由信息存储到内存
        首先配置mongod服务器。 192.168.1.202:
        OK。确定启动成功:   ps  aux  | grep mongo     确定了木问题了继续。
        /usr/local/bin/mongos --configdb  192.168.1.202:27019   --logpath=/data/configdb/mongo.log  --port 27017 --logappend --fork
      复制代码

    1. 添加存储节点到  mongos 路由服务上:
      db.runcOMMAND({addshard:"192.168.1.205:27017"})
    复制代码


db.runCommand({"enablesharding" : "xxoo"})
  • 好了 分布式环境搭建完了。 那我们回头看下代码方面,只需要修改下访问地址,所有的请求都应该通过  "mongos 路由服务器" 这样才能自动帮你分片嘛~~ 
            $con = new Mongo("mongodb://192.168.1.203"); // 连接到  mongos 路由服务器,让它帮我们分片
  •         $grid->storeUpload("pic", 'demo.jpg');
  • 文件上传、分布式存储。都实现了。  nginx 开始上场了。 我们用 nginx 来做静态资源的服务器,前面我们装得 nginx-gridfs  模块,里面自带了访问 mongodb  的驱动。那是相当方便呀。看下 nginx 配置:
            listen       8088;
  • #重点在这里
  •             mongo 192.168.1.203:27017;
  •         # redirect server error pages to the static page /50x.html
  •                  location = /50x.html {

  • <li lucida="" console',="" 'courier="" new',="" serif;="" font-size:="" 12px;="" line-height:="" 1.8em;"="" style="padding: 0px 0px 0px 10px; margin: 0px 0px 0px 2em; word-wrap: break-word; list-style-type: decimal-leading-zero;">        # deny access to .htaccess files, if Apache's document root
    <li lucida="" console',="" 'courier="" new',="" serif;="" font-size:="" 12px;="" line-height:="" 1.8em;"="" style="padding: 0px 0px 0px 10px; margin: 0px 0px 0px 2em; word-wrap: break-word; list-style-type: decimal-leading-zero;">        # concurs with nginx's one
  •             deny  all;
  • 重点理解这些:
    mongo 192.168.1.203:27017;
    [php]http://192.168.1.203:8088/demo.jpg[/php]    就可以显示我们要的图片了。
    #!/usr/bin/python
  • from sys import argv
  •     content = ''
  •         line = out.readline()
  •             break
  • if __name__ == '__main__':
    <li lucida="" console',="" 'courier="" new',="" serif;="" font-size:="" 12px;="" line-height:="" 1.8em;"="" style="padding: 0px 0px 0px 10px; margin: 0px 0px 0px 2em; word-wrap: break-word; list-style-type: decimal-leading-zero;">    '''
  •     if len(argv) > 1:
  •             
  •             
  •             config_mongos = {'host':'192.168.1.202:27019','logpath':'/data/config/configdb.log','port':27017}
  •         elif para == 'shard':
  •             print runShell("/usr/local/bin/mongod --shardsvr --dbpath=%s --logpath=%s --port %d --logappend --fork" % (mongodb['dbpath'],mongodb['logpath'],mongodb['port']))
  •             import pymongo

  •                 db.runCommand({'addshard':shardHOST[ip]})
  •             db.runCommand({'enableSharding':'test'})
  •     else:
    <li lucida="" console',="" 'courier="" new',="" serif;="" font-size:="" 12px;="" line-height:="" 1.8em;="" background-color:="" rgb(255,="" 255,="" 255);="" color:="" rgb(51,="" 102,="" 153);="" background-position:="" initial="" initial;="" background-repeat:="" initial;"="" style="padding: 0px 0px 0px 10px; margin: 0px 0px 0px 2em; word-wrap: break-word; list-style-type: decimal-leading-zero;">        print "no argv!"
    <li lucida="" console',="" 'courier="" new',="" serif;="" font-size:="" 12px;="" line-height:="" 1.8em;"="" style="padding: 0px 0px 0px 10px; margin: 0px 0px 0px 2em; word-wrap: break-word; list-style-type: decimal-leading-zero;">
  • 复制代码
    转载自:http://bbs.phpchina.com/forum.php?mod=viewthread&tid=226415

    相关文章推荐

    架构高性能海量图片服务器的技术要素

    先看一下架构图逻辑图,这也是现在各大公司采用的方式: 这个是一个大致逻辑图,具体布署是根据模块的性能消耗类型去混合部署。 第一点,分布存储的必要性:存储原始图片,用分布式存储有几个好处,分布式能自动...

    基于Mongodb进行分布式数据存储

    注:本文是研究Mongodb分布式数据存储的副产品,通过本文的相关步骤可以将一个大表中的数据分布到几个mongo服务器上。MongoDB的1.6版本中auto-sharding功能基本稳...
    • daizhj
    • daizhj
    • 2010年09月07日 13:32
    • 13808

    学习MongoDB--(5-1):索引(简介、使用)

    我们在使用关系型数据库时都或多或少接触过索引(index),MongoDB作为一种数据库,同样也提供了对索引的支持!索引存在的最主要目的就是加快查询速度!数据库的数据和其索引可以对应实际中我们使用的字...

    Nginx实战(五) 反向代理

    反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时...

    MongoDB基于GridFS实现文件的分布式存储

    GridFS是一种在MongoDB中存储大二进制文件的机制。使用GridFS存文件有如下几个原因: 利用Grid可以简化需求。要是已经用了MongoDB,GridFS就可以不需要使用独立文件存储...
    • Hu_wen
    • Hu_wen
    • 2017年05月24日 16:26
    • 486

    分布式存储数据库MongoDB教程

    • 2017年05月18日 09:06
    • 102KB
    • 下载

    【大型网站技术实践】初级篇:海量图片的分布式存储设计与实现

    说明:本文是我阅读计算机工程期刊《海量图片的分布式存储及负载均衡研究》一文的学习笔记和具体实践,原文地址在本文底部。 一、研究背景:性能与资金,二者可兼得乎? 1.1 那么问题来了? ...

    图片的分布式存储和负载均衡实现原理

    今天记录下图片的分布式存储和负载均衡实现原理。         对于Web服务器而言,用户对图片信息的访问是很消耗服务器资源的。当一个网页被浏览时,Web服务器与浏览器建立连接,每个连接表...

    利用log4j+mongodb实现分布式系统中日志统一管理

    背景     在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出。为了方便对这些日志进行统一管理和分析。我们可以将日志统一输出到指...
    内容举报
    返回顶部
    收藏助手
    不良信息举报
    您举报文章:利用mongodb实现分布式WEB图片存储
    举报原因:
    原因补充:

    (最多只允许输入30个字)