Deployment
如何使用 terraform.io 在不停機或數據失去的情況下更改有狀態伺服器的映像?
假設我有應用程序伺服器、數據庫伺服器和一些 dns-round-robin 負載平衡器。所有這些都由使用Packer創建的圖像提供支持,並使用Terraform管理部署。當實例被銷毀和重新創建時,如何更改數據庫伺服器的映像而不破壞它們的數據?
我能想到的最簡單的事情是關閉寫入,對數據庫進行快照,然後將快照恢復到新伺服器。但是像這樣依靠手動擺弄感覺真的不對,而且為了簡單的升級而關閉服務也感覺不對。有更清潔更好的方法,對吧?
這個問題沒有簡單的答案。
使用圍繞圖像設計的架構(通常稱為“不可變基礎架構”)非常適用於無狀態服務,例如您的應用程序伺服器。
絕對有可能使用正確的工具、故障轉移系統和升級路徑將其擴展到您的有狀態服務,但對於簡單系統(如您所描述的系統)來說,這些通常是矯枉過正的。
使用這些工具時要記住的一件事是,您不必“全力以赴”。Packer 和 Terraform 的設計目的是只在您想要它們的地方工作。它們不會故意在您的所有系統中強制執行某種模式。
實際上,處理此問題的最佳方法是在 Packer 之外以不同方式維護數據庫伺服器(建構初始映像,是的!但不一定以與無狀態 Web 伺服器相同的方式升級它們)或將狀態管理外包給某人別的。值得注意的選項包括 Heroku Postgres 或 AWS RDS。
完善它 - 是的,這是可能的,但使用我們目前的工具,它可能更麻煩,而不是更小規模或簡單架構。
Packer 和 Terraform 在同一基礎設施的其他方面仍然是一個巨大的福音——例如,Terraform 可以以非常直接的方式為您的 DigitalOcean 應用程序伺服器提供一個 Heroku 數據庫。Packer 可以處理升級和發布您的應用程序伺服器映像,同樣也可以用於開發。