Восстановить реплику при воссоздании мастера - PullRequest
1 голос
/ 27 мая 2020

У меня есть настройка QA с мастером и репликой. Оба имеют AWS RDS MySQL. Он снабжен Terraform, и суть такая:


data "aws_db_snapshot" "latest_prod_snapshot" {
  db_instance_identifier = var.production_instance_id
  most_recent            = true
}

resource "aws_db_instance" "qa_master" {
  apply_immediately                     = true
  snapshot_identifier                   = data.aws_db_snapshot.latest_prod_snapshot.id
  availability_zone                     = var.qa_master_zone
  instance_class                        = var.master_instance_class
  identifier                            = var.master_name
  parameter_group_name                  = var.parameter_group_name
  auto_minor_version_upgrade            = false
  multi_az                              = false
  performance_insights_enabled          = true
  performance_insights_retention_period = 7
  vpc_security_group_ids                = [var.security_group_id]
  option_group_name                     = var.option_group_name
  backup_retention_period               = 5
  skip_final_snapshot                   = true
  enabled_cloudwatch_logs_exports       = ["audit", "error", "slowquery"]
}

resource "aws_db_instance" "qa_replica" {
  apply_immediately                     = true
  replicate_source_db                   = aws_db_instance.qa_master.id
  availability_zone                     = var.qa_replica_zone
  instance_class                        = var.replica_instance_class
  identifier                            = var.replica_name
  parameter_group_name                  = var.parameter_group_name
  auto_minor_version_upgrade            = false
  multi_az                              = false
  performance_insights_enabled          = true
  performance_insights_retention_period = 7
  vpc_security_group_ids                = [var.security_group_id]
  skip_final_snapshot                   = true
  enabled_cloudwatch_logs_exports       = ["audit", "error", "slowquery"]
}

Когда я хочу обновить его из нового снимка, мастер всегда помечается для воссоздания, а реплика - для «изменения на месте». Но репликация перестает работать после обновления. Есть ли обходной путь для этого? Я здесь что-то странное делаю? Могу ли я каким-то образом принудительно воссоздать реплику?

До сих пор я делал terraform destroy перед тем, как делать terraform apply.

1 Ответ

0 голосов
/ 27 мая 2020

Чтобы инициировать воссоздание реплики, вам потребуется параметр ForceNew при изменении ресурса реплики при изменении не реплики.

В RDS есть атрибут resource_id, который обычно не появляются в местах, о которых заботятся люди (вы не указываете его, вы не используете его для подключения к нему, и он не отображается в консоли RDS), но отличается для каждого экземпляра базы данных (по сравнению с обычным identifier, который

Затем мы переходим к другой части, которая заключается в том, что этот атрибут должен быть в параметре ForceNew ресурса реплики. Очевидным выбором здесь являются параметры identifier или identifier_prefix. Самое большое влияние здесь заключается в том, что они также используются для идентификации экземпляра базы данных от других, но также используются как часть адреса DNS для подключения к базе данных в форме ${identifier}.${random_hash_of_account_and_region}.${region}.rds.amazonaws.com. Поэтому, если вам нужно подключиться к экземпляру, вам либо нужно, чтобы клиент обнаружил адрес реплики, поскольку теперь он будет содержать случайно сгенерированный resource_id экземпляра без реплики, либо вам нужно будет создать Terraform запись DNS, которая либо CNAME, либо псевдоним адреса RDS.

Так что в вашем случае вам может понадобиться что-то вроде этого:


data "aws_db_snapshot" "latest_prod_snapshot" {
  db_instance_identifier = var.production_instance_id
  most_recent            = true
}

resource "aws_db_instance" "qa_master" {
  apply_immediately                     = true
  snapshot_identifier                   = data.aws_db_snapshot.latest_prod_snapshot.id
  availability_zone                     = var.qa_master_zone
  instance_class                        = var.master_instance_class
  identifier                            = var.master_name
  parameter_group_name                  = var.parameter_group_name
  auto_minor_version_upgrade            = false
  multi_az                              = false
  performance_insights_enabled          = true
  performance_insights_retention_period = 7
  vpc_security_group_ids                = [var.security_group_id]
  option_group_name                     = var.option_group_name
  backup_retention_period               = 5
  skip_final_snapshot                   = true
  enabled_cloudwatch_logs_exports       = ["audit", "error", "slowquery"]
}

resource "aws_db_instance" "qa_replica" {
  apply_immediately                     = true
  replicate_source_db                   = aws_db_instance.qa_master.id
  availability_zone                     = var.qa_replica_zone
  instance_class                        = var.replica_instance_class
  identifier                            = "${var.replica_name}-${aws_db_instance.qa_master.resource_id}"
  parameter_group_name                  = var.parameter_group_name
  auto_minor_version_upgrade            = false
  multi_az                              = false
  performance_insights_enabled          = true
  performance_insights_retention_period = 7
  vpc_security_group_ids                = [var.security_group_id]
  skip_final_snapshot                   = true
  enabled_cloudwatch_logs_exports       = ["audit", "error", "slowquery"]
}

resource "aws_route53_zone" "example" {
  name = "example.com"
}

resource "aws_route53_record" "replica_instance" {
  zone_id = data.aws_route53_zone.example.zone_id
  name    = "qa-replica-database.${data.aws_route53_zone.example.name}"
  type    = "CNAME"
  ttl     = 60
  records = [aws_db_instance.replica_qa.address]
}

Теперь, если производственный снимок изменится, то qa_master Ресурс экземпляра базы данных будет воссоздан, что приведет к воссозданию ресурса экземпляра базы данных qa_replica, а затем запись Route53 для экземпляра qa_replica будет обновлена ​​с новым адресом, что позволит вам всегда подключаться к реплике по адресу qa-replica-database.example.com.

...