В этой части серии мы рассмотрим, в чем разница между простой базой данных и высокодоступной базой данных в 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