一千萬個為什麽

搜索


DevOps中的很多人都使用牛不寵物不可變基礎設施並在需要更改時(而不是修改)重新部署。

配置管理的原理類似於冪等。什麽是不變性與陽痿比較的好處,相似性和缺點,哪個更有效?這些可以協同使用嗎(例如,使用配置管理定期刪除和重新部署VM或Docker容器?)

轉載註明原文: 冪等性與不變性的比較

一共有 2 個回答:

這兩個術語是非常不同的。

讓我們從 immutability 開始,它的字面意思是“沒有突變”或“沒有改變”。從DevOps的意義上來說,這意味著一旦你創建了一個工件,那就是一個容器鏡像,一個虛擬機鏡像,或者是一個來自編譯代碼的包 - 你聲明你永遠不會改變它。通常如果需要進行任何更改,則聲明將創建新版本的“thing”。

術語 idempotence 表示當應用多次次更改時,狀態會發生突變(更改),僅一次。首先,它已經假定將會有變化應用,這意味著你不能擁有不可變的東西,並且對它做出冪等的行為(沒有任何行動是通過契約來完成的)。

在使用配置管理工具時,在多次應用相同更改時,有時會使用 idempotence 。像添加 localhost/etc/hosts 文件的行,你並不需要多行這樣的行,如果已經存在,那麽不要嘗試再次追加。

idempotent 是一個術語,用於描述嘗試更改內容的動作,而 immutable 用於描述名詞 (對象),這些對象是針對對它們所做的更改設置的。


為什麽不可變對象有用?因為當你復制它時,例如從開發環境到qa到生產。你已經知道很多(但不是全部)關於它如何行事的知識。在許多情況下,正在工作的部件將保持一致,並且被破壞的部件也將保持一致。

為什麽 idempotent 操作有用?因為當你想改變某個對象的狀態時,在許多情況下,只驗證已經應用了更改並在需要時應用更改是很有用的。例如,如果文件中的配置項缺失或具有錯誤值,則只需添加一次或在多次應用操作時只更改一次即可。在許多其他情況下,例如日誌文件,您不希望執行冪等動作,因為每次發生某些事件時,您通常都希望追加另一行。

在我看來,不可變的基礎架構是配置管理的不同模式。雖然它們可以一起使用,但它們通過兩種不同的方式來解決問題。

Immutable Artifacts的概念源遠流長,Unix系統幾十年來一直在使用它們來部署軟件包。但是一旦部署了它們,配置文件就發生了變化,所以事情變得可變。冪等性為可變文件提供了一些很好的保證,我們可以知道事情何時發生變化,只需要更新需要更新的東西。然而它並沒有解決所有可變對象的問題,我們仍然需要迎合看似無限數量的邊緣情況。因為事情是可變的,而且我們是冪等的,所以我們需要首先確定需要做出什麽樣的改變,然後通常按照特定的順序執行它們。在部署軟件包時,尤其是在零停機時間部署時,我們需要仔細編排更改以防止任何請求被丟棄。

這種復雜性最終可以通過部署不可變的工件來避免,因為我們只是用另一個對象替換(無論是二進制還是容器還是虛擬機),將它們投入使用並退役。這只是零停機時間部署的一個例子。

隨著工具的進步,我們可以在很短的時間內將不可變的構件部署到數千個系統中,我們看到使用不可變的工具來管理系統比配置管理更加可行。但是工具還沒有出現,並且兩者都有一個用例。我在這個主題上做過一次談話,它解釋了從完全可變到完全不可變的,這是一個範圍,每個公司都會選擇最適合他們的地方。