#上傳與存儲的關系
## 上傳與存儲的演進
**初始階段**
所有的都是一臺機器
程序文件:不同的用戶不同的目錄
數據庫:不同的用戶通過用戶名訪問數據庫,實質上是同一個實例,但是
一個用戶一個庫
程序文件:
Discuz: uc_server/data ThinkPHP: data/uploads


#文件存儲及其涉及到的問題
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、分發

## 小頭像的處理要點上傳
**? 上傳**
? 用戶將文件上傳到某臺 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


1. client詢問tracker上傳到的storage;
2. tracker返回一臺可用的storage;
3. client直接和storage通信完成文件上傳,storage返回文件ID。

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 原理
- 解決服務器端的“第一公里”問題
- 緩解甚至消除了不同運營商之間互聯的瓶頸造成的影響 - 減輕了各省的出口帶寬壓力
- 緩解了骨干網的壓力
- 優化了網上熱點內容的分布

##Varnish
? 安裝
? 有一些 python 的工具需要裝
? 使用
? varnishd -f /etc/varnish/default.vcl -s malloc,1024m -T
127.0.0.1:200 -a 0.0.0.0:80 ? 指定后端
? 演示我們上傳的文件

##大文件分發
大文件分發
? 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

- SWOOLE及php網絡編程
- LNMP架構與Socket,http協議
- 如何高效學習
- 開發工具箱
- 編寫高效的js
- js閉包編寫全功能的購物車
- JSON和JSONP
- 多級分類的開發與應用
- 設計安全的登錄注冊流程
- 前端性能優化
- 前端架構優化
- 使用第三方云服務加速產品開發
- 移動互聯網之API開發
- php分層
- 全文檢索的實踐與部署
- webIM的原理及前后端實現
- 如何配置高效的數據庫以及MySQL的代碼及插件開發
- NoSql.隊列,任務隊列
- 構建本機緩存,構建分布式緩存池
- 數據庫分庫分表的設計
- Nginx原理及模塊開發初步
- 無限擴充的數據庫架構
- php構建分庫分表分布式數據庫連接池
- 靜態文件上傳、分布式存儲與分發
- MySQL Cluster,Proxy分析與實踐
- 架構解密