本文版權歸博客園和作者吳雙本人共同所有,轉載和爬蟲必須在顯要位置註明原文地址,www.cnblogs.com/tdws 寫在前面 圖片/文件伺服器,顧名思義就是存文件唄,有的人用阿裡雲的現有服務,有的把文件Post到文件伺服器,在文件伺服器一端用一個應用程式來接收並保存,方法各不相同。老司機們各種服 ...
本文版權歸博客園和作者吳雙本人共同所有,轉載和爬蟲必須在顯要位置註明原文地址,www.cnblogs.com/tdws
寫在前面圖片/文件伺服器,顧名思義就是存文件唄,有的人用阿裡雲的現有服務,有的把文件Post到文件伺服器,在文件伺服器一端用一個應用程式來接收並保存,方法各不相同。老司機們各種伺服器已經玩爛了。在使用圖片/文件多伺服器的幾個問題就在於:
1.web上傳的文件如何post到文件伺服器上及其速度如何,占用帶寬和耗時如何。
2.如何使文件均衡的分佈在各台圖片伺服器上。
3.如何拓展新的圖片伺服器,並保障對已分配的內容影響降到最小。
本篇分享一方面希望有經驗的司機給點意見,另一方面分享給新司機和記錄自己的歷程。
第一分鐘確定最終目標1.各文件伺服器不僅提供存儲功能,還要有對外服務能力,以降低各個Web伺服器的帶寬占用和磁碟IO消耗。
2.提供簡便和容易的可橫向拓展能力
3.Async非同步IO保證線程非阻塞,如果對非同步有疑問的,可以非同步這篇文章 http://www.cnblogs.com/tdws/p/6172207.html
4.文件快速到達圖片伺服器
第三分鐘否定自己1.否認採取Http Post圖片到圖片伺服器的方式
2.否認採取Hash取模演算法
3.否認使用一致性哈希,避免伺服器橫向拓展後文件移動,即使是少量的
第五分鐘確定實現方式1.把文件伺服器磁碟共用出一個文件夾,作為特定用戶間“網路磁碟”,就是說該共用文件夾,只有web伺服器有許可權訪問,你可以參照區域網內如何共用文件夾或者阿裡雲共用文件夾。
2.通過IIS虛擬目錄,將其物理路徑指向網路磁碟。你知道共用文件夾間使用Tcp/Ip協議和Netbios協議通信。
3.配置WebConfig訪問網路磁碟身份(用戶名和密碼)—必須配置哦
4.第一步所共用的文件,在文件伺服器部署在IIS下WebApp中的一個文件下,以便暴露URL路徑。因為你知道IIS除了使用文件讀取的方式,是不可以獲取父級文件夾中的任何內容的。
4.確定根據文件名均勻分配圖片位置的方式—文件尾碼名方式,尾碼名採用"文件名-01"(一號伺服器),尾碼名採用"文件名-02"(二號伺服器),隨機數使用Random來取,隨機數是幾,我們就存在幾號伺服器。經過多次測試100萬次隨機,1,2,3分別得到33W次左右,保障了均衡。在將來拓展的時候,Random隨機數多開啟幾位就行了,不需要文件的移動,也沒有reshash。並且在橫向拓展伺服器數量後,希望保證已有三台伺服器不繼續存儲文件,Random範圍可調。在資料庫或者緩存中我們已經存下了文件名稱,並且其有尾碼名,在為前臺返回圖片URL的時候,只需要根據尾碼名稱,來拼出文件伺服器IP或功能變數名稱。
第七分鐘按照步驟動手操作1.部署FileServerApp,其功能是對圖片暴露URL,其實很簡單啦,建立一個Asp.Net空項目,建立出存儲圖片的文件夾。並將該文件夾共用給Web伺服器,細節看最後一節的部署圖。
2.假定你已經實現文件夾共用
3.在IIS站點下新建虛擬目錄,註意物理路徑指向的是網路共用文件夾的網路路徑
4.在Webconfig下 <system.web>增加 <identity impersonate="true" userName="ben" password="yourpwd" /> ,IIS對該虛擬目錄設置身份驗證為 應用程式池標識。
5.使用Server.MapPath可以獲取FileServer2的網路路徑,並使用你的讀寫文件方式對目錄中的文件進行讀寫。
6.寫入文件建議使用Async的方式,非同步IO會在你將IO請求包發給網路驅動或者磁碟驅動後,返回去處理其他事情,在將來的某個時刻,文件寫入成功,狀態機恢復你的上下文並以同步的方式繼續向下執行,能大大提高你Web伺服器的吞吐能力。
寫在最後的重點如果還有模糊的地方,看這裡就全明白啦
如果我的點滴分享,對你有點滴幫助, 歡迎點擊下方紅色按鈕關註,我持續輸出分享。也歡迎為你自己,也為我點贊。