Snowflake Server
2012 年 7 月 10 日
讓生產用伺服器持續運作可能是一件繁瑣的事。你必須確保作業系統和任何其他依賴的軟體都已適當修補,以保持最新狀態。託管的應用程式需要定期升級。通常需要變更設定才能調整環境,使其能有效率地運作並與其他系統正確通訊。這需要結合命令列呼叫、在 GUI 畫面之間切換以及編輯文字檔。
結果就是一個獨一無二的雪花,對滑雪場來說很好,但對資料中心來說很糟。
雪花伺服器的第一個問題是難以複製。如果你的硬體開始出問題,這表示難以啟動另一台伺服器來支援相同的功能。如果你需要執行叢集,你會遇到讓叢集中的所有執行個體保持同步的困難。你無法輕鬆地複製你的生產環境以進行測試。當你遇到生產故障時,你無法透過在開發環境中複製交易執行來調查問題。 [1]
製作雪花的磁碟映像可以某種程度地解決這個問題。但這些映像很容易因為設定中不必要的元素而變得雜亂,更不用說錯誤會不斷發生。
然而,當你需要變更雪花時,才會發現它們真正的脆弱性。雪花很快就會變得難以理解和修改。一個位元軟體的升級會造成無法預測的連鎖效應。你無法確定設定的哪些部分很重要,或只是多年前開箱即用的樣子。它們的脆弱性會導致冗長、令人感到壓力的除錯。你需要手動流程和文件來支援任何稽核需求。這就是你經常看到重要軟體在古老作業系統上執行的其中一個原因。
避免雪花的良好方法是將伺服器的整個作業設定保存在某種自動化指令中。最近有兩個工具因此變得非常熱門,分別是 Puppet 和 Chef。這兩者都允許你使用 特定領域語言 的形式來定義作業環境,並輕鬆將其套用至特定系統。
使用指令的目的不只是你可以輕鬆地重建伺服器(你也可以使用映像來做到這一點),你還可以輕鬆了解其設定,因此可以更輕鬆地修改它。此外,由於這個設定是一個文字檔,你可以將它保存在版本控制中,並享有所有帶來的優點。
如果您停用對伺服器的任何直接 shell 存取,並強制執行所有組態變更,以從版本控制執行指令,您將擁有絕佳的稽核機制,確保環境中的每個變更都會記錄下來。這種方法在受規範的環境中會非常受到歡迎。
應用程式部署應遵循類似的方法:完全自動化,所有變更都在版本控制中。透過避免雪花,讓測試環境成為生產環境的真正複製會容易得多,減少因組態差異而造成的生產錯誤。
確保避免雪花的一個好方法是使用 PhoenixServers。使用版本控制的指令定義伺服器組態是 持續交付 的重要部分。
進一步閱讀
Visible Ops Handbook 是開創性的書籍,討論了雪花造成的危險以及如何避免它們。 持續交付 說明這種方法如何成為健全建置和交付流程的必要部分。 真正的藝術家,然而,偏好雪花。
備註
1: 我聽過另一個比喻是,您應該將您的伺服器視為牲畜,而不是寵物。雖然我承認當這個比喻被我的素食同事使用時,我感到很奇怪。