單程序容器 無狀態容器

2022-09-14 23:03:28 字數 2329 閱讀 9350

**自 mafeifan 的技術部落格-docker常見問題

使用容器時,要盡量使用單程序容器,所謂單程序容器,是指在容器執行時,只有乙個工作程序。

如果需要存在多個程序協作的時候,要部署為兩個容器,比如 php 乙個容器,mysql 乙個容器,而不要在乙個容器中執行這兩者。

因為,docker本身就是乙個非常好的守護程序,它可以完美地管理乙個程序,但是如果乙個容器中存在多個程序時,你就需要自己維護兩個程序的執行狀態,比如使用 supervisord ,但這就大大增加了容器維護的難度和不穩定性。

比如在乙個容器中同時執行 php 和 mysql,那麼如果php異常退出了,容器該不該連同mysql一起退出?如果不退出,而是不斷重啟php,那麼在容器之外,比如執行 docker ps 是無法了解到php執行狀態的。

所以,使用docker,就要習慣於單程序容器的方式,既簡單,又穩健。

所謂狀態,是指程式在執行過程中生成的中間資料,而無狀態容器,是指容器在執行時,不在容器中儲存任何資料,而將資料統一儲存在容器外部,比如資料庫中。

因為有狀態的容器異常重啟就會造成資料丟失,也無法多副本部署,無法實現負載均衡。

比如php的session資料預設儲存在磁碟上,比如 /tmp 目錄,而多副本負載均衡時,多個php容器的目錄是彼此隔離的。比如存在兩個副本a和b,使用者第一次請求時候,流量被**到a,並生成了session,而第二次請求時,流量可能被負載均衡器**到b上,而b是沒有session資料的,所以就會造成會話超時等bug。

如果採用主機卷的方式,多個容器掛載同乙個主機目錄,就可以共享session資料,但是如果多主機負載均衡場景,就需要將session儲存於外部資料庫或redis中了。

除了檔案,還有記憶體資料,比如node.js專案中使用了全域性變數暫存資料,那麼這個容器也是有狀態的,也會出現類似bug,所以要使用無狀態容器。

**自 docker不適合部署資料庫的7大原因

個人對部分問題是否真的存在存疑,僅做參考

不要將資料儲存在容器中,這也是 docker 官方容器使用技巧中的一條。容器隨時可以停止、或者刪除。當容器被rm掉,容器裡的資料將會丟失。為了避免資料丟失,使用者可以使用資料卷掛載來儲存資料。

但是容器的 volumes 設計是圍繞 union fs 映象層提供持久儲存,資料安全缺乏保證。如果容器突然崩潰,資料庫未正常關閉,可能會損壞資料。

大家都知道,mysql 屬於關係型資料庫,對io要求較高。當一台物理機跑多個時,io就會累加,導致io瓶頸,大大降低 mysql 的讀寫效能。

在一次docker應用的十大難點專場上,某國有銀行的一位架構師也曾提出過:「資料庫的效能瓶頸一般出現在io上面,如果按 docker 的思路,那麼多個docker最終io請求又會出現在儲存上面。現在網際網路的資料庫多是share nothing的架構,可能這也是不考慮遷移到 docker 的乙個因素吧」。

針對性能問題有些同學可能也有相對應的方案來解決:

(1)資料庫程式與資料分離

如果使用docker 跑 mysql,資料庫程式與資料需要進行分離,將資料存放到共享儲存,程式放到容器裡。如果容器有異常或 mysql 服務異常,自動啟動乙個全新的容器。另外,建議不要把資料存放到宿主機裡,宿主機和容器共享捲組,對宿主機損壞的影響比較大。

(2)跑輕量級或分布式資料庫

docker 裡部署輕量級或分布式資料庫,docker 本身就推薦服務掛掉,自動啟動新容器,而不是繼續重啟容器服務。

(3)合理布局應用

對於io要求比較高的應用或者服務,將資料庫部署在物理機或者kvm中比較合適。目前tx雲的tdsql和阿里的oceanbase都是直接部署在物理機器,而非docker 。

要理解 docker 網路,您必須對網路虛擬化有深入的了解。也必須準備應付好意外情況。

網路對於資料庫複製是至關重要的,其中需要主從資料庫間 24/7 的穩定連線。未解決的 docker 網路問題在1.9版本依然沒有得到解決。

在 docker 中水平伸縮只能用於無狀態計算服務,而不是資料庫。

docker 快速擴充套件的乙個重要特徵就是無狀態,具有資料狀態的都不適合直接放在 docker 裡面,如果 docker 中安裝資料庫,儲存服務需要單獨提供。和1類似。

目前,tx雲的tdsql(金融分布式資料庫)和阿里雲的oceanbase(分布式資料庫系統)都直接執行中在物理機器上,並非使用便於管理的 docker 上。

資源隔離方面,docker 確實不如虛擬機器kvm,docker是利用cgroup實現資源限制的,只能限制資源消耗的最大值,而不能隔絕其他程式占用自己的資源。如果其他應用過渡占用物理機資源,將會影響容器裡 mysql 的讀寫效率。

我們沒有看到任何針對資料庫的隔離功能,那為什麼我們應該把它放在容器中呢?

React之UI元件 容器元件以及無狀態元件

1.ui元件 只負責頁面的渲染 2.容器元件 只負責業務邏輯和資料的處理 3.無狀態元件 把ui元件用函式表示 可以省去生命週期函式,優化 二 具體 1.普通元件todolist.js 拆分成todolistui.js ui元件 和todolist.js 容器元件 importreact from ...

微服務化之無狀態化與容器化

此文已由作者劉超授權網易雲社群發布。一 為什麼要做無狀態化和容器化 很多應用拆分成微服務,是為了承載高併發,往往乙個程序扛不住這麼大的量,因而需要拆分成多組程序,每組程序承載特定的工作,根據併發的壓力用多個副本公共承擔流量。將乙個程序變成多組程序,每組程序多個副本,需要程式的修改支撐這種分布式的架構...

Redux 狀態容器

redux 狀態容器 redux 的適用場景 多互動 多資料來源。從元件角度看,如果你的應用有以下場景,可以考慮使用 redux。某個元件的狀態,需要共享 某個狀態需要在任何地方都可以拿到 乙個元件需要改變全域性狀態 乙個元件需要改變另乙個元件的狀態 redux 的設計思想很簡單,就兩句話。1 we...