【问题标题】:How can I manage a database server with Terraform如何使用 Terraform 管理数据库服务器
【发布时间】:2023-03-05 16:30:01
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 您正在进行哪些更改以强制销毁和重新创建数据库?
  • @ydaetskcoR 我对处理这种情况的公认方法更感兴趣。除非公认的方法是手动执行 SQL 转储然后 SQL 导入。但我认为有一种“Terraform”/自动化的方式来做事。这种情况可能是更改不支持滚动升级的服务器模型(例如 OVH)

标签: mysql database terraform


【解决方案1】:

管理状态很困难。

根据我的经验,最好的办法是尽可能将该状态卸载到托管服务,例如 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 卷上?
  • 是的。请记住,上述内容可能会从服务器中删除数据,因此除非您停止对数据库的活动,否则它将破坏事物。即使那样,尽管我希望崩溃恢复能够在新服务器启动时修复问题,但根据您的事务模型,您可能会丢失少量数据。此外,上述内容通常未经我测试,因为如前所述,我发现将状态卸载到单独的服务并以与我的无状态实例不同的方式管理它要容易得多。
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2012-04-19
  • 2021-04-13
  • 2012-09-04
  • 2021-06-21
相关资源
最近更新 更多