【问题标题】:How to prevent data loss in persistent volume when server is recreated重新创建服务器时如何防止持久卷中的数据丢失
【发布时间】:2019-04-09 06:00:59
【问题描述】:

我正在使用 terraform 和 openstack 并使用持久卷来存储数据。仅重新创建服务器并重新附加相同的卷时,此数据有时会损坏/丢失。如何防止这种情况发生?

我污染了服务器,然后 terraform 申请重新创建。这将分离 vol ,销毁服务器,重新创建并附加卷。但是,有时卷中的数据会丢失或损坏。本卷包含 postgreSQL DB 文件。

我尝试使用 terraform destroy - 但这也会导致卷被销毁。

这是模块

data "template_file" "init-config" {
  template = "${file("modules/postgres-server/init-config.tpl")}"

  vars {
    instance_name = "${var.instance_name}"
    tenant_name   = "${var.tenant_name}"
  }
}

# Define instance properties.
# You should provide the variables in main.tf
resource "openstack_compute_instance_v2" "server" {
  name            = "${var.instance_name}"
  image_name      = "${var.image_name}"
  flavor_name     = "${var.flavor_name}"
  key_pair        = "${var.key_name}"
  security_groups = ["default", "${var.secgroup_name}"]
  user_data       = "${data.template_file.init-config.rendered}"
  stop_before_destroy = "true"

  network {
        name = "${var.tenant_name}-net"
  }
}

# Define a floating ip resoruce
resource "openstack_networking_floatingip_v2" "server_float" {
  pool = "net-iaas-external-dev"
}

# Associate the instance and floating ip resources
resource "openstack_compute_floatingip_associate_v2" "server_float_assoc" {
  floating_ip = "${openstack_networking_floatingip_v2.server_float.address}"
  instance_id = "${openstack_compute_instance_v2.server.id}"
}

# Create persistent vol
resource "openstack_blockstorage_volume_v2" "pgvol" {
  name = "postgreSQL-DATA-${var.instance_name}"
  description = "Data Vol for ${var.instance_name}"
  size = 50
}

# Attach the persistent data to the instance
resource "openstack_compute_volume_attach_v2" "pgvol_attach" {
  instance_id = "${openstack_compute_instance_v2.server.id}"
  volume_id = "${openstack_blockstorage_volume_v2.pgvol.id}"
  device = "/dev/vdc"
}

这是main.tf

module "postgre-server" {
  source = "./modules/postgres-server"

  instance_name = "INST_NAME"
  image_name    = "centos7"
  flavor_name   = "r1.medium"
  key_name      = "${module.keypair.output_key_name}"
  secgroup_name = "${module.secgroup.output_secgroup_name}"
  tenant_name   = "${var.tenant_name}"
}

预期结果是卷数据没有丢失,当我连接回新创建的服务器时,该卷中的文件系统和所有数据都在那里。

谢谢。感谢您对如何做到这一点的任何见解。

【问题讨论】:

    标签: terraform terraform-provider-openstack


    【解决方案1】:

    当我在使用 terraform 重新创建实例之前卸载 vol 中的文件系统时,这是有效的。我认为 stop_before_destroy = "true" 会优雅地停止实例并分离 vol,但在我的情况下它不起作用:)

    【讨论】:

      【解决方案2】:

      一种快速的方法是将代码分成两个堆栈,一个堆栈(模块 #1)仅管理存储,另一个(模块 #2)管理其余部分。

      拆分后,您可以随时更改模块#2,无论应用或销毁。

      在两个堆栈之间,您可以通过多种方式引用存储资源。

      方式一:

      来自数据源terraform_remote_state的引用,您需要设置如下输出

      output "persistant_storage_id" {
        value = "${openstack_blockstorage_volume_v2.pgvol.id}"
      }
      

      然后在模块 2 中使用下面的代码来引用持久存储。

      data "terraform_remote_state" "persistent_storage" {
        backend = "xxx"
        config {
          name = "hashicorp/persistent-storage"
        }
      }
      

      所以模块 #2 可以将其引用为 ${data.terraform_remote_state.persistent_storage.persistent_storage_id}"

      方式二:

      直接用数据源openstack_blockstorage_availability_zones_v3引用持久化存储卷id

      方式三:

      方式#3 与#1 相似。

      您需要在模块#1 中输出值"${openstack_blockstorage_volume_v2.pgvol.id}"

      output "persistant_storage_id" {
        value = "${openstack_blockstorage_volume_v2.pgvol.id}"
      }
      

      调用模块#1

      module "persistent_storage" {
         ...
      }
      

      然后将其引用为${module.persistent_storage.persistent_storage_id}"

      【讨论】:

      • 这不能回答问题。虽然他们应该考虑拆分他们的 Terraform 代码,以便更简单地替换实例,而不是替换不是他们正在努力解决的存储。
      • 拆分后,你可以随时在模块#2上运行,无论应用或销毁
      • 对我来说主要问题是重新创建实例后数据丢失。我在卷上有 3 个分区,但在重新附加后,有时它们在那里,有时它们丢失.. 有时它们在那里但已损坏。一直在进一步测试 - 如果我在销毁实例并重新创建之前停止实例并使用 openstack 命令分离 vol,我的数据在重新附加 vol 后就在那里。如果没有更多的测试,我不能 100% 确定。不过,我试图避免这种情况——因为我更愿意让 terraform 运行所有这些
      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多