#上传与存储的关系
## 上传与存储的演进
**初始阶段**
所有的都是一台机器
程序文件:不同的用户不同的目录
数据库:不同的用户通过用户名访问数据库,实质上是同一个实例,但是
一个用户一个库
程序文件:
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)
- SWOOLE及php网络编程
- LNMP架构与Socket,http协议
- 如何高效学习
- 开发工具箱
- 编写高效的js
- js闭包编写全功能的购物车
- JSON和JSONP
- 多级分类的开发与应用
- 设计安全的登录注册流程
- 前端性能优化
- 前端架构优化
- 使用第三方云服务加速产品开发
- 移动互联网之API开发
- php分层
- 全文检索的实践与部署
- webIM的原理及前后端实现
- 如何配置高效的数据库以及MySQL的代码及插件开发
- NoSql.队列,任务队列
- 构建本机缓存,构建分布式缓存池
- 数据库分库分表的设计
- Nginx原理及模块开发初步
- 无限扩充的数据库架构
- php构建分库分表分布式数据库连接池
- 静态文件上传、分布式存储与分发
- MySQL Cluster,Proxy分析与实践
- 架构解密