多例項叢集部署下的圖片上傳和訪問
阿新 • • 發佈:2019-01-03
場景
- 存在多個無狀態的Web應用服務,支援多例項叢集化部署(使用nginx作為反向代理)
- 在Web應用中存在圖片檔案上傳功能
- 不能將圖片檔案直接儲存到資料庫中,資料庫中只儲存檔案訪問連結
問題
- 因為Web應用服務是多例項叢集化部署的,因此上傳圖片之後不能簡單儲存到本地,否則其他例項將無法訪問上傳之後的圖片.
- 圖片上傳之後不要通過Web應用來訪問(像Tomcat這樣的Servlet容器不擅長處理靜態檔案)
解決方案
圖片如何儲存
針對第一個問題,圖片通過Web應用上傳之後不能儲存在本地,應該使用專門的圖片伺服器或者分散式檔案系統進行儲存.
具體實現方案如下:
- 在專案初期的時候,圖片數量不算太多,可以直接使用1臺獨立的靜態檔案伺服器進行儲存即可,同時使用RAID機制對磁碟進行一定的冗餘備份.
- 隨著專案的演進,圖片數量達到一定量級出現瓶頸時(如單臺伺服器儲存容量不夠,或者檔案數量太多訪問緩慢等因素),需要考慮使用分散式叢集檔案系統進行檔案儲存,如:FastDFS等.
這裡還存在一個疑問: Web應用接收到上傳的圖片檔案之後如何儲存到靜態檔案伺服器或者叢集檔案系統呢?
其一, 如果圖片檔案儲存在單獨的檔案伺服器中時,Web應用接收到瀏覽器上傳的圖片之後可以通過NFS或者FTP協議將檔案同步到圖片伺服器,但是可能存在同步出錯或者延時的情況.當然,還可以開發一個簡單的網路服務程式運行於圖片伺服器上,專門用於接收上傳圖片.
其二, 如果圖片檔案儲存在分散式叢集檔案系統中,則直接使用檔案系統API將檔案寫入即可.
如何訪問圖片
針對第二個問題,圖片上傳之後訪問時如何與Web應用分離?
(1)如果只是單臺的圖片伺服器,可以直接使用nginx作為靜態檔案伺服器即可,簡單快捷,訪問效能有保證.
(2)如果圖片儲存到分散式叢集檔案系統中,則直接通過檔案系統API訪問即可.