持久化存儲:容器時代的長期記憶
已發表: 2023-04-17持久存儲是指以非易失性方式保留數據,以便即使在設備或應用程序關閉或重新啟動後數據仍然可用。 數據的存儲和檢索允許 Web 應用程序保存用戶信息和狀態並可靠地運行。
在單體應用程序中,存儲訪問很簡單,因為服務器和存儲在一起。 然而,地理分佈式系統使訪問變得更加複雜,因為存儲系統必須對全球所有組件保持可用。
容器化使問題進一步複雜化,因為容器是輕量級的、無狀態的和短暫的——不適合存儲數據的特性。 因此,任何持久存儲解決方案都必須能夠與容器無縫協作,從而增加了另一層複雜性。
本文通過探索其類型、架構和用例來深入研究持久性存儲。 它還提供了一個動手演示,說明了 Docker 中的捲存儲和持久卷存儲之間的區別。
持久存儲的類型
非易失性存儲有多種類型,包括傳統的旋轉磁盤(硬盤驅動器或 HDD)、固態驅動器 (SSD)、網絡附加存儲 (NAS) 和存儲區域網絡 (SAN)。
- HDD是機電數據存儲設備,使用旋轉的磁介質磁盤存儲和檢索數字數據。 磁盤使用可移動致動器臂上的磁頭來讀取和寫入數據。
- SSD有時也稱為半導體存儲設備、固態設備或固態磁盤,使用集成電路組件持久存儲數據,通常使用不包含移動部件的互連閃存設備。 它們的固定特性使它們比 HDD 更快、更可靠。
- 網絡附加存儲是一組 HDD、SSD 或兩者,使用新技術文件系統 (NTFS) 或第四擴展文件系統 (EXT4) 等文件系統通過本地網絡連接。
- SAN是聯網的高速塊級存儲設備,如磁帶庫或磁盤陣列。 它們的連接在操作系統看來是本地存儲,無法通過局域網 (LAN) 訪問。
持久存儲架構
持久存儲有三種方法,每種方法都有獨特的用例和局限性。
對象持久架構
對象持久架構方法使用對象關係映射 (ORM) 將數據作為對象存儲在關係數據庫或鍵值數據庫中。 當數據沒有定義的模式時,這種方法很有用,因為 ORM 會處理它的存儲和檢索。
塊持久架構
塊持久化架構使用塊級存儲設備,這在存儲大文件時很有用。 這種方法在存儲大量數據時很有用,因為您可以使用多個塊來增加存儲容量。
文件存儲持久化架構
顧名思義,文件存儲持久架構方法使用文件系統來存儲數據。 一種方法涉及使用數據庫服務器,它提供了一種集中存儲數據的方式。 像 Kinsta 這樣的雲託管解決方案使用可以輕鬆連接到應用程序並提供持久性的數據庫服務器。
Filestore 持久架構在需要頻繁檢索文件的應用程序以及需要管理它們的界面時很有用。
持久存儲用例
本節討論每種存儲類型的一些用例。
對象持久存儲
- 雲存儲:對象持久存儲通常用於雲存儲解決方案中,用於存儲和檢索大量非結構化數據,例如圖像、視頻和文檔。 雲提供商使用對象存儲為客戶提供可擴展、高度可用且持久的存儲服務。
- 大數據分析:對象持久存儲用於大數據分析,以存儲和管理通常用於數據分析、機器學習和 AI 的大型數據集。 對象存儲允許快速高效地訪問數據,使其成為大數據架構的關鍵組件。
- 內容分發網絡:對象持久存儲在內容分發網絡 (CDN) 中用於在全球服務器網絡中存儲和分發內容,例如圖像、視頻和靜態文件。 對象存儲允許 CDN 向世界各地的用戶提供高速內容,無論用戶位於何處。
塊持久存儲
- 高性能計算 (HPC) :HPC 環境可快速高效地處理大量數據。 塊持久存儲允許 HPC 集群存儲和檢索大型數據集,例如科學模擬、天氣建模和財務分析。 塊存儲通常是 HPC 的首選,因為它提供高性能、低延遲的數據訪問,並允許並行輸入/輸出 (I/O) 操作,這可以顯著縮短處理時間。
- 視頻編輯:視頻編輯應用程序需要對大型視頻文件進行高性能和低延遲訪問。 它們還必須適應每秒大量的 I/O 操作和低延遲,以實時渲染和編輯視頻文件。 塊存儲提供了這些功能,使其成為視頻編輯工作流的理想解決方案。
- 遊戲:遊戲應用程序還需要高性能和低延遲來訪問遊戲資產和玩家數據。 塊存儲可快速存儲和檢索大量數據,確保遊戲環境能夠及時加載並在遊戲過程中保持響應。
文件存儲持久存儲
- 媒體和娛樂:視頻編輯、動畫和渲染應用程序通常使用持久存儲。 這些應用程序需要對視頻、音頻和圖像等大型媒體文件進行高性能和低延遲訪問。 Filestore 提供了一個可以被多個客戶端訪問的共享文件系統,使其成為這些應用程序的理想存儲解決方案。
- Web 內容管理: Web 內容管理系統 (CMS) 使用共享文件系統中的文件存儲持久存儲來存儲和管理網站內容,例如文本、圖像和多媒體文件。 Filestore 為網站內容提供了一個中心位置,使管理和更新變得更加容易。 它還使多個用戶能夠同時處理相同的內容,從而提高協作和生產力。
容器中的持久存儲
容器輕巧、便攜、安全且直接,提供了不同應用程序之間的融合。 他們必須有一種機制來在容器重新啟動和刪除之間保留數據。 容器與傳統應用程序一樣具有文件存儲或文件系統,但每當您使用新更改重建它們時,您都會丟失所有非持久性數據。
這就是容器提供包含卷存儲或安裝存儲卷的選項的原因。 容器將存儲卷視為一個目錄。 寫入卷的任何數據都會進入主機文件系統。
容器的持久存儲必須以這種方式工作,因為重新啟動容器會創建一個新實例並丟棄舊實例。 如果容器沒有數據的一致視圖,則當容器重新啟動時數據將消失。 存儲卷在會話和容器重啟之間保留數據,允許容器即使在移動或重啟時也能保持其狀態。
體積與持久體積
容器提供了兩種存儲持久數據的方式:使用捲和持久卷。 它們之間存在顯著差異。 容器管理卷存儲中的數據。 當您停止容器時,數據會保留並在您重新啟動容器時可用。 但是,當您刪除或刪除容器時,數據會丟失,因為您還會刪除基礎卷存儲。
持久卷存儲或綁定掛載是一種將數據存儲在容器文件系統之外的方法。 這樣,即使您刪除容器,數據也不會丟失。 它一直存在,直到被手動刪除。
以下部分通過示例演示了這兩種卷類型。
容器持久存儲演示
我們創建了一個小型 Web 應用程序來演示 Docker 容器的持久存儲。 您可以安裝 Docker 並從此 GitHub 存儲庫獲取代碼。
該應用程序是一個基本表單,包含 2 個用於用戶輸入的字段:
- 標題
- 文檔文本
保存用戶輸入後,您可以通過使用標題字段中提供的名稱打開反饋目錄中的文件來訪問它。 文檔文本字段的輸入是文件的內容。
如何使用卷存儲
在您自己的機器上安裝應用程序後,它可以使用Dockerfile中所示的捲存儲。
現在,您構建映像並運行容器。 為此,請執行以下命令。
docker build -t feedback-node:volumes . docker run -d -p 3000:80 --name feedback-app feedback-node:volumes
應用程序運行後,導航到 localhost:3000 以提交反饋。
單擊保存並導航到localhost:3000/feedback/test.txt以查看輸入是否成功存儲。
刪除並重新啟動容器以查看輸入是否仍然存在。
docker stop feedback-app docker start feedback-app
如果您現在訪問相同的 URL,您會看到反饋仍然存在。 但是如果你刪除容器並重新啟動它會發生什麼?
docker stop feedback-app docker rm feedback-app docker run -d -p 3000:80 --name feedback-app feedback-node:volumes
重新啟動後,如果您返回到該 URL,它不再存在,因為在您刪除容器時數據丟失了。 卷數據僅在停止容器時保留,而不是在刪除容器時保留。
為了緩解這個問題並在您刪除容器時保留數據,您必須使用持久卷存儲或命名存儲。 首先,您應該清理容器和圖像。
docker stop feedback-app docker rm feedback-app docker rmi feedback-node:volumes
如何使用持久卷存儲
在對此進行測試之前,您必須從 Dockerfile 中刪除 VOLUME 屬性並重建映像。
docker build -t feedback-node:volumes . docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes
如您所見,在第二個命令中,您使用-v
標誌定義容器外部的持久卷,即使您移除容器,該卷仍然存在。
與上一步一樣,嘗試添加反饋並在停止、刪除和重新啟動容器後訪問它。
docker stop feedback-app docker rm feedback-app docker run -d -p 3000:80 --name feedback-app -v feedback:/app/feedback feedback-node:volumes
如您所見,即使在停止並刪除容器後,數據仍可訪問並保留。
概括
持久存儲對於容器化應用程序至關重要,因為它允許在容器生命週期之外持久保存數據。 容器化應用程序的兩種主要持久存儲類型是捲和綁定掛載,每種都有其優點和用例。
卷存儲在容器的文件系統中,而綁定掛載可直接在主機上訪問。
持久存儲使數據能夠在容器之間共享,從而可以構建複雜的多層應用程序。 持久化存儲對於確保容器化應用程序的穩定性和連續性至關重要,它提供了一種可靠且靈活的方式來存儲關鍵數據。
如果您使用 Docker 來開發 Web 應用程序,您會發現使用 Kinsta 的應用程序託管服務配置 Dockerfile 部署非常簡單。