如何使用 terraform.io 在不停机或不丢失数据的情况下更改有状态服务器的图像?

jpa*_*dvo 6 image deployment infrastructure packer terraform

假设我有应用程序服务器、数据库服务器和一些 dns-round-robin 负载平衡器。所有这些都由使用Packer创建的图像提供支持,并使用Terraform管理部署。当实例被破坏和重新创建时,如何更改数据库服务器的图像而不破坏它们的数据?

我能想到的最简单的事情是关闭写入,对数据库进行快照,然后将快照还原到新服务器。但是像那样依赖手动摆弄感觉真的很不对,为了简单的升级而将服务下线也感觉不对。有一种更清洁更好的方法,对吧?

小智 5

这个问题没有简单的答案。

使用围绕图像设计的架构(通常称为“不可变基础架构”)非常适用于无状态服务,例如您的应用程序服务器。

绝对有可能使用正确的工具、故障转移系统和升级路径将其扩展到您的有状态服务,但对于简单系统(如您所描述的那样)而言,这些通常是过度的。

使用这些工具时要记住的一件事是,您不必“全力以赴”。Packer 和 Terraform 非常适合只在您需要的地方工作。它们不会故意在您的所有系统中强制执行某种模式。

实际上,处理此问题的最佳方法是在 Packer 之外以不同方式维护数据库服务器(构建初始映像,是的!但不一定以与无状态 Web 服务器相同的方式升级它们)或将状态管理外包给某人别的。值得注意的选项包括 Heroku Postgres 或 AWS RDS。

完善它 - 是的,这是可能的,但是使用我们当前的工具,它可能比较小规模或简单架构的价值更麻烦。

Packer 和 Terraform 在相同基础设施的其他方面仍然是一个巨大的福音——例如,Terraform 可以以非常直接的方式提供 Heroku 数据库以在您的 DigitalOcean 应用程序服务器中使用。Packer 可以处理升级和发布您的应用程序服务器映像,同样用于开发。