組態同步

2013 年 6 月 13 日

自動化組態工具(例如 CFEnginePuppetChef)可讓您透過提供描述伺服器元素組態的範本,避免 雪花伺服器。組態同步會持續套用這些規格,無論是在定期排程或變更時,套用到伺服器執行個體的整個生命週期。如果有人在工具外變更伺服器,下次伺服器同步時,會將其還原為中央指定的組態。如果需要變更某些組態,會在組態規格(範本、清單或特定組態工具所稱呼的名稱)中進行變更,然後套用至基礎架構中的所有相關伺服器。

理論上,一旦建立伺服器,組態同步會持續讓伺服器保持最新,套用升級和修補程式,並防止 組態漂移,而且可能維持很長的壽命。

然而,實際上使用目前的自動化組態管理工具,無法讓伺服器完全一致,因此組態同步會隨著時間導致不一致。 [1]

由自動化工具管理的伺服器組態的每個元素,都需要撰寫、測試和維護範本或清單。使用這些工具管理典型伺服器中的每個元素,根本不切實際。這些元素實在太多了。而且,您指定的每個額外元素,其所涉及的工作會因為這些元素之間的潛在互動、整合和相依性,而呈非線性成長。

軟體套件是一項特別的挑戰,因為它們可能相依於更多套件。yum、apt-get、gems 等工具會自動找出相依性,並從儲存庫安裝這些相依性。因此,系統中大量的套件僅透過隱含的方式管理,而且可能在未通知的情況下變更。雖然您可以微觀管理已安裝軟體套件的版本和相依性,但考量到所涉及的套件數量,這是一項難以處理的工作。

如果管理您想要在伺服器上擁有的東西很困難,那麼管理您不想要的東西會更糟,因為它們的數量實際上是無限的。目前的組態管理工具要求您明確列出您希望在找到時移除的每個檔案、套件或其他元素。這表示可以手動將其他東西新增到某些伺服器上,造成不一致且意外的行為。

實際上,使用自動化組態工具的人在不指定伺服器可組態表面積的 100% 的情況下也能很好地執行。團隊將 80/20 法則套用於自動化組態,將 80%(或更像是 95%)的注意力放在定義與其特定需求最相關的 20%(或 5%)的系統上,其餘部分則留給基本作業系統安裝的預設值。因此,系統的大部分不在自動化組態之下,而且通常這是有用的。不幸的是,當它沒有用時 - 當未由自動化工具管理的系統某個部分確實造成問題時,其影響是意外的,而且可能很難追蹤。

這個問題會隨著伺服器的使用壽命和變更頻率而惡化。伺服器停機時間越長,它可能與其他伺服器(特別是較新的伺服器)的差異就越大。

這個問題導致一些人使用 PhoenixServers。透過確保伺服器的使用壽命保持短暫,經常從基本映像重新建置新的伺服器,組態偏移的可能性會保持較小,而且不需要在管理工具中指定比實際上更必要的伺服器組態的開銷。將鳳凰伺服器推論到其邏輯結論會導致 ImmutableServers,避免在伺服器的使用壽命期間進行任何變更。

備註

1: 供應商願景

我的同事 Max Lincoln 提供了這些參考,說明組態工具供應商對總體系統組態的願景

  • "建立您的基礎架構藍圖 - 因此它可以在幾分鐘內從頭開始建置或重建" - Opscode Chef
  • "消除組態偏移並減少中斷" - Puppetlabs
  • "CFEngine 然後會持續修正組態偏移,讓系統符合其所需狀態。" - CFEngine