如何使用 Terraform 管理数据库服务器

How can I manage a database server with Terraform

我刚刚开始学习 Terraform,我对公认的处理数据库服务器的方式有疑问。

假设您有 1 台数据库服务器。在 terraform 中对其进行更改需要销毁并重新创建该服务器。

如何使用 terraform 将数据从以前的数据库服务器传输到新的服务器?

谢谢!

管理状态很难。

根据我的经验,最好的办法是尽可能将状态卸载到托管服务,例如 Amazon 的 RDS。然后,RDS 允许您就地修改您在典型使用模式下会做的大多数事情(增加实例的大小、移动到 HA 对、升级引擎版本),根据正在执行的操作,几乎没有停机时间。

如果您必须在 instances/VMs 上管理状态,您将希望以与无状态、更短暂的实例截然不同的方式处理这些实例,在这些实例中,如果您有一些 automation/a 服务允许您维持正常运行时间目标,例如使用 blue/green 部署模式或滚动部署。

有了状态,您将需要安全地管理实际的有状态部分,它通常是某种形式的磁盘,希望以某种方式连接到网络并且可以重新连接到不同的实例。

一个非常基本的示例可能如下所示:

resource "aws_volume_attachment" "database_volume" {
  device_name = "/dev/sdh"
  volume_id   = "${aws_ebs_volume.database.id}"
  instance_id = "${aws_instance.database.id}"
}

resource "aws_instance" "database" {
  ami               = "ami-21f78e11"
  availability_zone = "us-west-2a"
  instance_type     = "t1.micro"

  tags {
    Name = "Database Server"
  }
}

resource "aws_ebs_volume" "database" {
  availability_zone = "us-west-2a"
  size              = 1

  lifecycle {
    prevent_destroy
  }
}

这将创建一个 EC2 实例和一个单独的 EBS 卷,该卷将通过 Terraform 附加到该实例。如果实例需要被 Terraform 替换,那么 Terraform 将在新实例出现时处理将卷附加到新实例。您还可以将它与实例资源上的 create_before_destroy 结合使用,使 Terraform 替换实例并在销毁旧实例之前重新附加卷。

如果您不能像上面那样使用网络附加存储,那么您基本上不得不让 Terraform 转储数据库,然后在新实例上重新导入它。