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

3

我正在学习terraform,有关处理数据库服务器的接受方式的问题。

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

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

谢谢!


你做了什么样的更改导致数据库需要被销毁和重建? - ydaetskcoR
@ydaetskcoR 我更感兴趣的是处理这种情况的通用方法。除非通用方法是手动执行 SQL Dump 然后 SQL Import。但我想应该有一种“Terraform”/自动化的方式来处理这些事情。这种情况可能是更改不支持滚动升级(例如 OVH)的服务器型号。 - Chaos
1个回答

5
管理状态很难。根据我的经验,最好的方法是尽可能地将状态卸载到托管服务(例如Amazon的RDS)中。然后,RDS允许您在执行操作时进行大部分典型使用模式下的现场修改(增加实例大小、移动到HA对、升级引擎版本),具体取决于正在执行的操作,几乎没有停机时间。
如果必须在实例/虚拟机上管理状态,您将需要非常不同的处理方式来处理这些有状态的部分,而这些无状态的更短暂实例可以轻松地定期丢弃并替换为另一个实例(假设您有一些自动化/服务,允许您保持可用性目标,例如使用蓝/绿部署模式或滚动部署)。
对于状态,您需要安全地管理实际的有状态部分,这通常是某种形式的磁盘,希望以某种方式网络连接,并且可以重新连接到不同的实例。
一个非常基本的示例可能如下所示:
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 将数据库转储并在新实例上重新导入它。

谢谢!这真的很有帮助。我想你会将MySQL的数据目录调整到EBS卷上吧? - Chaos
是的。请注意,以上操作可能会从服务器中删除数据,因此除非您停止对数据库的活动,否则它将破坏事物。即使如此,我希望崩溃恢复在新服务器启动时修复问题,但根据您的事务模型,您可能会损失少量数据。此外,由于我通常将状态卸载到单独的服务并以不同方式管理它,因此上述操作通常未经过我的测试。 - ydaetskcoR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接