多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#上传与存储的关系 ## 上传与存储的演进 **初始阶段** 所有的都是一台机器 程序文件:不同的用户不同的目录 数据库:不同的用户通过用户名访问数据库,实质上是同一个实例,但是 一个用户一个库 程序文件: Discuz: uc_server/data ThinkPHP: data/uploads ![](https://box.kancloud.cn/2016-05-16_57397ee4d9d82.png) ![](https://box.kancloud.cn/2016-05-16_57397ee7917be.png) #文件存储及其涉及到的问题 1、结构与非结构化数据的存储 今天讨论非结构化存储 2、不同类型的存储 数据量级、小文件与大文件存储、备份 3、不同的变更频繁程度 4、特例:头像与缩略图存储 文件转换、异步分发 ## 结构与非结构化存储 数据的世界不像我们想像的那么简单 不用的对象,不同的存储方式 曾经归纳了 11 种数据存储的场景 文本、文件数据库、远程 结构化存储,表格、字段、行、列、JSON、XML 非结构化存储,文件,但是:文件不一定是单一文件,正像数据行、数据 表可以不是单一文件 ## 不同类型的存储 **• 数据量级** • 量级无非就是文件数量大小 • 占用空间大量 **• 小文件与大文件存储** • 小文件大量占用 inode 资源, inode 容量有限 • 文件多了,速度就会变慢 **• 备份** • 大文件的备份(同吞吐有关)、小文件(增量与全量备份差别巨大) ## 相关工具与命令 1、inode 的查看 (df -i, ls -i) 2、文件同步(ssh【scp】、ftp、sftp、rsync) 3、磁盘吞吐测试:hdparm –t/hdparm -T 4、inotify(监测文件动态变更) • 一种海量小文件的存储装置 ## 特例:头像存储与异步队列 1、头像原文件存储、头像标准尺寸存储 2、各种尺寸的小头像存储 什么时间转换! 3、转换、推送到存储(Gearman) boost-devel pthread ##Gearman 的使用 1、使用 Net_Gearman Gearman 扩展(ldd) 2、转换 image_thumbnail_client.php image_thumbnail_worker.php 3、分发 ![](https://box.kancloud.cn/2016-05-16_57397ee81663d.png) ## 小头像的处理要点上传 **• 上传** • 用户将文件上传到某台 Web 服务器 • Web服务器进行类型检查、杀毒,分析元数据 • Web服务器存储元数据,告知用户照片上传成功,以及当前 服务器能显示的地址 • Web服务器当前能显示的地址仅是当前需要的版本 • Web服务器将图片标准尺寸或者原图分发到存储 **• 下载** • 用户向服务器请求某张图片(可能是头像的某个版本) • CDN检查文件有无缓存(后面讲什么是CDN) • CDN向后端服务器(源站)请求文件 • 源站接收到的 Web或者是分发服务器,检测文件是否存在 • 存在则立即返回文件,CDN接收文件,缓存文件,返回文件 • 不存在Web或者分发服务器向存储请求文件,请求不到,返 回 404给,再继续返回,请求到了,就返回给下一级,同上 一步 ## 哪些点涉及到转换? • Web服务器存储元数据,告知用户照片上传成功,以及当前服务器 能显示的地址 • 转换成返回版本 • Web服务器将图片标准尺寸或者原图分发到存储 • 至少要转换成标准图版本 • 源站接收到的 Web或者是分发服务器,检测文件是否存在 • 没有的话,源站需要拉取回来,然后转换,返回成相应的版本 #分布式存储之土办法实现 ##分布式存储的PHP实现 **PHP 配置** 在配置中约定,xxxx-xxxx文件,在某台服务器,服务器可以指定 多台,甚至也可以指明备份 可以扩展配置支持多个文件类型 **PHP上传** 上传了之后,检测是哪个产品线来的,检测应该往哪发,直接往相 应的服务器 rsync ##示例实现 1、配置文件 2、上传 3、生成文件ID,检测文件类型 4、比较配置,发往相应的服务器 5、几种存储方式对比 #分布式存储之 FastDFS ![](https://box.kancloud.cn/2016-05-16_57397ee866240.png) ![](https://box.kancloud.cn/2016-05-16_57397ee8a813e.png) 1. client询问tracker上传到的storage; 2. tracker返回一台可用的storage; 3. client直接和storage通信完成文件上传,storage返回文件ID。 ![](https://box.kancloud.cn/2016-05-16_57397ee8ce4c4.png) 1. client询问tracker下载文件的storage,参数为文件ID(组名和文件名); 2. tracker返回一台可用的storage; 3. client直接和storage通信完成文件下载。 ## 配置 cat /etc/fdfs/tracker.conf |egrep -v "^#"|egrep -v "^$” cat /etc/fdfs/storage.conf |egrep -v "^#"|egrep -v "^$” cat /etc/fdfs/client.conf|egrep -v "^#"|egrep -v "^$" ## 要点 /usr/local/bin/fdfs_upload_file /etc/fdfs/client.conf upload/meinv.jpg /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf 4.0 已经去除了内置 HTTP的支持,但相关的代码、配置有些还在 ##示例 1、fastdfs_client 模块 2、使用 模块上传文件 3、查看上传效果 #高效的分发系统与大文件分发 ##CDN 与高效分发 CDN 原理 - 解决服务器端的“第一公里”问题 - 缓解甚至消除了不同运营商之间互联的瓶颈造成的影响 - 减轻了各省的出口带宽压力 - 缓解了骨干网的压力 - 优化了网上热点内容的分布 ![](https://box.kancloud.cn/2016-05-16_57397ee9062bb.png) ##Varnish • 安装 • 有一些 python 的工具需要装 • 使用 • varnishd -f /etc/varnish/default.vcl -s malloc,1024m -T 127.0.0.1:200 -a 0.0.0.0:80 • 指定后端 • 演示我们上传的文件 ![](https://box.kancloud.cn/2016-05-16_57397ee9633aa.png) ##大文件分发 大文件分发 • 1、压缩分发(小文件尤其如此) • 2、rsync 、scp 传输 • 3、数据解压 • 4、数据校验(md5, md5sum)?目的是什么? • 到底应该怎么传大文件? • 压缩有何利弊?有改进之处吗? • 不压缩有何办法? 第一种办法 • tar -zcvf 20150101.tar.gz 20150101 • scp -P 22 20150101.tar.gz wuxing@101.251.196.91:/home/wuxing • 其他: • ls -d 2015*|xargs -i echo "tar -zcvf {}.tar.gz {}"|sh & • ls -d 2015*|grep -v tar|awk '{printf "tar -zcvf %d.tar.gz %d\n",$0,$0}'|sh 第二种办法 • gzip -c 20150605/ucai_info_20150605.sql |ssh -p 22 wuxing@101.251.196.91 "gunzip -c - > /var/software/test/test.sql" ##第三种办法 • 发送端: • gzip -c 20150605/ucai_info_20150605.sql |nc 101.251.196.91 12345 • 接收端 • nc -l 12345|gunzip -c > /var/software/test.sql ![](https://box.kancloud.cn/2016-05-16_57397ee9a2d7b.png)