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

时间:2018-04-20 06:11:54

标签: mysql database terraform

我正在学习terraform,我对处理数据库服务器的方式有疑问。

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

如何处理从先前数据库服务器向具有terraform的新数据库传输数据?

谢谢!

1 个答案:

答案 0 :(得分:3)

管理状态很难。

根据我的经验,最好的办法就是尽可能将状态卸载到托管服务,例如亚马逊的RDS。然后,RDS允许您在适当的位置修改您在典型使用模式中执行的大多数操作(增加实例的大小,移动到HA对,升级引擎版本),几乎没有停机时间,具体取决于正在执行的操作。< / p>

如果你必须在实例/虚拟机上管理状态,你将需要处理这些与你的无状态,更短暂的实例,这些实例可以很容易地被丢弃,并替换为另一个实例,假设你有一些自动化/服务,允许您维护正常运行时间目标,例如使用蓝/绿部署模式或滚动部署。

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

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

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转储出数据库,然后在新实例上重新导入它。