本文版權歸博客園和做者吳雙本人共同全部,轉載和爬蟲必須在顯要位置註明原文地址,www.cnblogs.com/tdwshtml
圖片/文件服務器,顧名思義就是存文件唄,有的人用阿里雲的現有服務,有的把文件Post到文件服務器,在文件服務器一端用一個應用程序來接收並保存,方法各不相同。老司機們各類服務器已經玩爛了。在使用圖片/文件多服務器的幾個問題就在於:ios
1.web上傳的文件如何post到文件服務器上及其速度如何,佔用帶寬和耗時如何。web
2.如何使文件均衡的分佈在各臺圖片服務器上。算法
3.如何拓展新的圖片服務器,並保障對已分配的內容影響降到最小。數據庫
本篇分享一方面但願有經驗的司機給點意見,另外一方面分享給新司機和記錄本身的歷程。緩存
1.各文件服務器不只提供存儲功能,還要有對外服務能力,以下降各個Web服務器的帶寬佔用和磁盤IO消耗。服務器
2.提供簡便和容易的可橫向拓展能力網絡
3.Async異步IO保證線程非阻塞,若是對異步有疑問的,能夠異步這篇文章 http://www.cnblogs.com/tdws/p/6172207.htmldom
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服務器的吞吐能力。
若是還有模糊的地方,看這裏就全明白啦
2017-5-3更新。讀淘寶技術這十年筆記,有興趣能夠看看。