docker解決數據存儲問題的方案

   

現在docker在雲計算領域發展的勢頭很猛,各個公司不論大小都開始研究這個開源工具和技術,圍繞docker的開源項目和創業公司也多如牛毛,就是一個簡單管理container的web ui都有很多開源項目。不過還是一個人說的好,docker必須要是集羣纔好玩,而且越大越好玩。當然這是從玩技術的人眼中看待的問題,如果要真正用於生產還是有很多問題需要解決,很多方案需要設計,很多容錯需要處理。今天看資料學習到了docker是怎樣解決容器裏面數據存儲的問題的方案,以前做PAAS遇到過這種問題,不過自己也設計了相應的方案解決了問題。不過docker提供的volumes解決方案好像感覺更加完美和靈活一些,但是總體架構和思路其實都是一樣的。

下面就根據自己的理解說說docker的volumes解決方案,官方文檔有詳細的使用說明,如果想要嘗試一把,請自行google或者直接訪問docker官方問題:https://docs.docker.com/userguide/dockervolumes/
在介紹具體方案以前先說說基於container運行的程序有什麼樣的數據存儲問題。傳統的軟件開發人員都習慣了使用本地磁盤保存文件等數據,如果程序掛了以後重新啓動以後那麼數據還在(硬盤沒壞的情況下),你可能會說爲什麼不使用雲存儲或者分佈式文件系統或者數據庫之類的,首先傳統行業開發者可能還沒有接受或者接觸雲存儲系統和概念,其次小公司或者個人開發者不一定能夠可以自己使用的雲存儲系統(第三方往往需要收費,而且不一定好用),數據庫不合適存儲文件。所以這些問題就需要PAAS平臺(不管是公有還是私有,當然這裏把docker也算在內了)去解決,如果PAAS平臺是基於container運行應用的架構那麼就存在本地數據存儲的問題。因爲PAAS平臺需要合理利用資源,那麼就需要動態調度運行程序到不同的主機上去運行,那麼在應用被從一個container調度另一個container運行的時候,怎樣保證數據也被同樣遷移過去,而且遷移後的container和以前的container可能根本不在同一個主機上。那麼數據遷移就是一個很大的問題,想要很優雅的解決這個問題不是那麼容易的。
先看看我以前是怎麼解決這個問題的(其實你會發現和docker的解決方案是那麼驚人的相似),我們爲開發者提供一個目錄,承諾在這個目錄下存放的文件保證在大多數情況下不會丟失(極端情況可能會丟失一些數據,例如硬盤壞掉而且這時數據剛好還沒有成功備份,當然也有解決方案,不過需要犧牲用戶體驗和性能:就是同步寫雲存儲),然後我們有一個文件系統的監聽agent會監控這些目錄的變化,如果在一個固定間隔時間內有文件變化就會定期把這個目錄壓縮成一個壓縮文件然後上傳雲存儲,當用戶的應用被遷移到另一個container中去的時候在從雲存儲下載並且解壓到相應目錄即可。這裏爲了解決用戶不停的寫文件導致頻繁的進行壓縮和上傳操作,我們設置了一個時間間隔來做這些操作。如果在這個時間間隔內有數據寫入並且還沒有執行壓縮上傳操作的時候主機掛掉或者硬盤壞掉那麼部分數據丟失。爲了解決上傳過多文件到雲存儲每次都是覆蓋以前老的文件,即一個應用只有一個壓縮文件被存放在雲存儲。通過這種方案我們解決了基本上99%以上的數據存儲問題。
  

下面我們在來看看docker的解決方案,他們的方案優越的一點就是在同一臺主機的多個container之間可以共享數據。這個優點也是和他們的解決方案直接相關的,因爲docker在創建啓動container的時候可以指定一個主機目錄作爲volume,其他容器也可以繼續使用這個volume,那麼在同一個主機上的所有container都可以通過這個volume來共享數據。但是還是有上面同樣的問題,一旦你的應用程序和數據關聯起來以後在遷移這些container的時候(跨主機)就需要考慮數據遷移,docker沒有提供完整的解決方案(也不能提供,除非你直接使用docker公司自己部署的系統),不過它提供了更加靈活的方式來支持,把這個交給使用docker系統的人和開發者。就是在啓動或者創建或者使用volume的時候可以執行一些命令來操作這些數據,這些命令完全可以是自己開發的程序,例如把volume裏面的數據備份到雲存儲系統。這個就是docker裏面提供的volume的backup、restore和migrate功能。功能是提供了,怎麼使用還是需要看各個使用者自己的需求和系統設計了。
 
對比了docker的數據存儲方案和我們以前自己的方案,思路和架構基本上一樣,我們也同樣可以做到同主機的container共享數據,但是因爲我們的需求並沒有這一條所以就沒做了。不過數據的備份和恢復始終是一門藝術(說藝術是因爲可以做得很複雜很強大,也可以很簡單,主要根據需求和數據的重要性),想要100%解決掉這個問題很難,特別是在持續增長的大數據領域尤爲困難(同時保證數據高可靠性和高性能)。
  

剛開始說了docker集羣越大越好玩,我想其中解決各個container數據存儲的問題就是其中個玩耍的點吧。現在docker自身系統應該還不能誇機器的container共享數據吧,要做其實也簡單,通過網絡共享volume。但是爲什麼docker現在沒有做(不知道是不是我不知道而已),我想這種需求有嗎?如果有分佈式文件系統就可以解決這個問題,只不過docker使用的volume是分佈式文件系統的客戶端吧。例如使用glusterfs。而且如果做了誇機器的container共享volume,那麼docker的複雜度會增加不少,爲了保證各種異常下的正確處理方法,一旦系統涉及到分佈式,複雜度直接指數級別上漲。所以docker把誇機器的數據共享和遷移交給第三方去做吧。
  

以上分析純屬個人見解,如果有不同意見歡迎PK。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章