Как настроить базу данных HA/DR в AWS? [4 — База данных HA].

В этой части серии мы рассмотрим, в чем разница между простой базой данных и высокодоступной базой данных в AWS, а также как создать ее с помощью Terraform.


Различия

Простая база данных будет развернута на одном AZ. Поэтому если этот AZ по каким-то причинам будет недоступен, база данных больше не сможет быть вызвана.

Чтобы избежать подобной проблемы, мы создаем кластеры баз данных. Один экземпляр будет главным с правами чтения/записи, а все остальные будут вторичными с правами только чтения. И каждый из этих экземпляров будет находиться на нескольких AZ.

При такой архитектуре, если основной экземпляр выйдет из строя, другой станет основным, а первый можно будет воссоздать.


Создание кластера

Определение группы подсетей

Чтобы знать, где мы будем размещать наши многочисленные экземпляры кластера, мы создадим группу подсетей.

Примечание: подсеть (которые определяются в модуле VPC) может находиться на нескольких AZ в одном регионе. Поэтому для лучшей практики убедитесь, что на каждый AZ приходится одна подсеть.

resource "aws_db_subnet_group" "default" {
  name       = "main"
  subnet_ids = [aws_subnet.frontend.id, aws_subnet.backend.id]

  tags = {
    Name = "My DB subnet group"
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Этот объект очень прост, у вас есть имя для группы подсетей и список идентификаторов подсетей.

Ссылки

  • Terraform doc aws_db_subnet_group : https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/db_subnet_group

Определение кластера

Теперь, когда мы знаем, где могут быть созданы все экземпляры, мы создадим кластер, а затем добавим все нужные нам экземпляры.

resource "aws_rds_cluster" "default" {
  cluster_identifier      = "aurora-cluster-demo"
  engine                  = "aurora-mysql"
  engine_version          = "5.7.mysql_aurora.2.03.2"
  availability_zones      = ["us-west-2a", "us-west-2b", "us-west-2c"]
  database_name           = "mydb"
  master_username         = "username"
  master_password         = "pwd"
  backup_retention_period = 5
  preferred_backup_window = "07:00-09:00"
}
Вход в полноэкранный режим Выход из полноэкранного режима

Это определение кластера является легким, и вы можете получить много общих параметров из aws_db_instance.

/! Основным моментом здесь является параметр availability_zones, убедитесь, что в этом списке есть только AZ, покрытые вашими подсетями.

Если вы хотите пойти дальше в своей конфигурации, вы можете добавить много вещей о безопасности (порт, vpc_security_group_ids, storage_encrypted…), обновлениях (backup_retention_period, preferred_backup_window, preferred_maintenance_window…) …

Безопасность

Если вы хотите иметь безопасный кластер, вы должны иметь :

  • storage_encrypted определено в true, чтобы быть уверенным, что данные будут зашифрованы при хранении
  • kms_key_id должен быть определен, чтобы знать, какой ключ шифрования должна использовать база данных
  • enabled_cloudwatch_logs_exports определено для того, чтобы некоторые журналы экспортировались в cloudwatch для проведения аудита
  • vpc_security_group_ids, чтобы иметь четкое определение того, кто может получить доступ к вашей базе данных.

Также еще одной хорошей конфигурацией является необходимость использования транспорта TLS. Для этого необходимо создать aws_rds_cluster_parameter_group и связать ее с вашим кластером в параметре db_cluster_parameter_group_name.

resource "aws_rds_cluster_parameter_group" "cluster_param_group" {
  name        = "cluster_param_group"
  family      = "aurora-mysql5.7"
  description = "cluster_param_group"

  parameter {
    name  = "require_secure_transport"
    value = "ON"
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Ссылки

  • Кластер AWS RDS : https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster
  • aws_rds_cluster_parameter_group : https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster_parameter_group
  • aws_kms_key : https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key

Определение экземпляров

Объявление экземпляра довольно простое и не имеет большого количества параметров.

Одним из основных является ссылка на кластер, с которым он связан.

resource "aws_rds_cluster_instance" "cluster_instances" {
  count                      = 2
  identifier                 = "aurora-cluster-demo-${count.index}"
  cluster_identifier         = aws_rds_cluster.default.id
  instance_class             = "db.r4.large"
  engine                     = aws_rds_cluster.default.engine
  engine_version             = aws_rds_cluster.default.engine_version
  db_subnet_group_name       = "db_subnet_group_name"
  db_parameter_group_name    = "db_parameter_group"
}
Вход в полноэкранный режим Выход из полноэкранного режима

На примере мы можем видеть :

  • ссылку на кластер в cluster_identifier
  • Определение движка и его версия. Для более чистого способа объявления и уверенности в том, что она совпадает с кластером, вы можете использовать : aws_rds_cluster.default.engine и aws_rds_cluster.default.engine_version
  • класс экземпляра для всех вычислений и ресурсов
  • а также имена подсетей и групп параметров, если они у вас есть.

Также в этом примере вы можете увидеть параметр count. Он не является обязательным, это параметр Terraform, позволяющий легко создавать несколько экземпляров с одним и тем же определением.

Здесь все одинаково, кроме имени, поэтому мы включаем индекс count в имя, чтобы быть уверенными в уникальности имен.

Ссылки

  • Документация Terraform rds_cluster_instance : https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster_instance

Запуск с

Как получить доступ к кластеру?

С кластером создаются 2 конечные точки:

  • одна для доступа к базе данных с правами чтения/записи
  • одна для доступа ко всем остальным базам данных с правами только на чтение.

С помощью этих конечных точек вы можете быть уверены, что у вас всегда есть экземпляр, доступный для ответа, если одна база данных/AZ не может быть вызвана.

Примечание: Если у вас в кластере 2 экземпляра и один из них выйдет из строя, обе конечные точки получат доступ к одной и той же базе данных. Но вы все равно не сможете выполнить обновление с конечной точки, доступной только для чтения.

Как проверить высокую доступность?

Когда вы используете кластер, всегда полезно знать, как можно протестировать высокую доступность и проверить, хорошо ли работают ваши сервисы в случае обхода отказа.

Итак, чтобы проверить это, в веб-консоли AWS для вашего кластера доступно действие Failover.

Когда вы нажмете на него, ваш экземпляр для чтения/записи станет экземпляром только для чтения, а случайный экземпляр для чтения станет экземпляром для чтения/записи.


Надеюсь, это поможет вам! ?

И до скорой встречи в следующей части этой серии. ?


Ссылка на серию

  • 1 — Начало : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-1-1ko7
  • 2 — Определения : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-2-definitions-93p
  • 3 — Простая база данных : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-3-simple-database-a9o
  • 4 — База данных HA : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-4-ha-database-4kek
  • 5 — База данных DR : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-5-dr-database-278b
  • 6 — Создание из моментального снимка : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-6-create-from-snapshot-2mbf
  • 7 — Динамическое определение бэкенда Terraform : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-7-dynamic-terraform-backend-definition-3aga
  • 8 — Несколько экземпляров в нескольких регионах : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-8-multiple-instances-in-multiple-regions-210d
  • 9 — Генерация случайного значения : https://dev.to/adaendra/how-to-setup-a-hadr-database-in-aws-9-generate-a-random-value-5g8a

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *