在terraform中,appAutoScaling属性与自动缩放属性有什么区别



我正在尝试使用terraform为Aurora扩展RDS集群。

我正在设置一个RDS实例,有3个服务器——1个写入器和2个读取副本。这是我的要求

  • 当任何服务器出现故障时,添加一个新服务器,使复制副本始终至少有3台服务器。

  • 当任何主机的CPU使用率超过50%时,请将新服务器添加到集群中。服务器的最大数量为4。

  1. 是否可以创建一个策略,以便在3台服务器中的任何一台出现故障时,为该RDS实例创建一个新服务器?如果是,如何监控服务器故障?

  2. 我需要使用appAutoScaling还是同时使用autoScaling?这是与我的用例相匹配的链接:https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/appautoscaling_policy

我为您的问题开发了一个地形配置文件的示例。它已准备好使用,但应仅作为学习和测试目的的示例。它在us-east-1区域使用默认的专有网络进行了测试,该专有网络的地形为0.13,AWS提供商为3.6。

示例terraform配置文件创建的关键资源是:

  • 公共MySQL极光集群1个写入程序和2个副本
  • Aurora副本的应用程序自动扩展策略基于CPU利用率(50%),最小和最大容量分别为2和4
  • SNS主题和订阅该主题的SQS队列。通过该队列,无需配置电子邮件或lambda即可轻松查看SNS消息
  • 两个RDS事件订阅。一个(例如故障)用于集群级事件,第二个用于实例级事件。在这两种情况下,事件都会发布到SNS主题,然后在SQS中可供查看

下面我详细介绍了所问的问题和示例配置文件。

Aurora MySQL集群,包含1个写入程序和2个副本

群集将配备1个写入程序和2个副本。

复制副本的自动调整策略

一种基于CCD_ 2的CCD_。扩展策略基于复制副本的总体CPU利用率(50%),而不是单个复制副本。

这是一个很好的做法,因为aurora复制品在连接级别自动实现负载平衡。这意味着,在使用reader-enpoint的条件下,新的连接将大致均匀地分布在可用的副本中。

此外,一旦复制副本被移入/移出活动或故障替换,您可能应用于单个复制副本的任何警报或扩展策略都将无效。这是因为任何扩展策略都将绑定到特定的数据库实例。一旦实例消失,警报将不起作用。

与AWS代表您创建的策略相关的警报可以在CLoudWatch警报控制台中查看。

Aurora数据库实例故障

如果任何数据库实例失败,Aurora将自动继续修复问题,包括重新启动数据库实例、将读取副本升级为新主机、重新限制MySQL或完全替换失败的实例。

您可以自己模拟这些事件,如使用故障注入查询测试Amazon Aurora中所述。

测试故障转移以读取复制副本

aws rds failover-db-cluster --db-cluster-identifier aurora-cluster-demo

主实例测试崩溃

这将导致实例的自动重启

mysql -h <endpoint> -u root -e "ALTER SYSTEM CRASH INSTANCE;"

读取器实例测试崩溃

这将导致重新启动MySQL。

mysql -h <endpoint> -u root -e "ALTER SYSTEM SIMULATE 100 PERCENT READ REPLICA FAILURE TO ALL FOR INTERVAL 10 MINUTE;"

测试读取器的更换

您可以通过在中手动删除读卡器实例来模拟其完全失败控制台。一旦删除,Aurora将自动提供替换

监视器群集故障

您可以使用Amazon RDS事件通知自动检测并响应与Aurora集群及其实例相关的各种事件。故障是RDS事件通知机制捕获的事件之一。

您可以订阅感兴趣的事件类别,并接收SNS的通知。一旦检测到事件并将其发布到SNS中,您就可以随心所欲地使用它。例如,调用lambda事件来分析事件和Aurora集群的当前状态,执行纠正措施或发送电子邮件通知。

例如,当您像以前那样手动强制故障切换时,您将收到一条消息带有以下信息(仅显示片段):

"Event Message":"Started cross AZ failover to DB instance: aurora-cluster-demo-1"

以及更高版本:

"Event Message":"Completed failover to DB instance: aurora-cluster-demo-1"}"

示例terraform配置文件订阅了许多类别。因此,你必须根据自己的需要对它们进行微调。您还可以订阅所有这些,并让lambda函数在它们发生时对它们进行分析,并决定是只存档它们,还是该函数执行一些自动过程。

应用自动缩放或自动缩放

Aurora读取复制是使用应用程序自动缩放进行缩放的,而不是自动缩放(我认为这里的意思是EC2自动缩放)。EC2自动缩放仅用于常规EC2实例,不用于RDS。

地形配置文件示例

provider "aws" {
# YOUR DATA
region  = "us-east-1"
}
data "aws_vpc" "default" {
default = true
}
resource "aws_rds_cluster" "default" {
cluster_identifier      = "aurora-cluster-demo"
engine                  = "aurora-mysql"
engine_version          = "5.7.mysql_aurora.2.03.2"
database_name           = "myauroradb"
master_username         = "root"
master_password         = "bar4343sfdf233"
vpc_security_group_ids  = [aws_security_group.allow_mysql.id]
backup_retention_period = 1
skip_final_snapshot     = true
}
resource "aws_rds_cluster_instance" "cluster_instances" {
count               = 3
identifier          = "aurora-cluster-demo-${count.index}"
cluster_identifier  = aws_rds_cluster.default.id
instance_class      = "db.t2.small"
publicly_accessible = true
engine              = aws_rds_cluster.default.engine
engine_version      = aws_rds_cluster.default.engine_version
}
resource "aws_security_group" "allow_mysql" {
name        = "allow_mysql"
description = "Allow Mysql inbound Internet traffic"
vpc_id      = data.aws_vpc.default.id
ingress {
description = "Mysql poert"
from_port   = 3306
to_port     = 3306
protocol    = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port   = 0
to_port     = 0
protocol    = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_appautoscaling_target" "replicas" {
service_namespace  = "rds"
scalable_dimension = "rds:cluster:ReadReplicaCount"
resource_id        = "cluster:${aws_rds_cluster.default.id}"
min_capacity       = 2
max_capacity       = 4
}
resource "aws_appautoscaling_policy" "replicas" {
name               = "cpu-auto-scaling"  
service_namespace  = aws_appautoscaling_target.replicas.service_namespace
scalable_dimension = aws_appautoscaling_target.replicas.scalable_dimension
resource_id        = aws_appautoscaling_target.replicas.resource_id
policy_type        = "TargetTrackingScaling"
target_tracking_scaling_policy_configuration {
predefined_metric_specification {
predefined_metric_type = "RDSReaderAverageCPUUtilization"
}
target_value       = 50
scale_in_cooldown  = 300
scale_out_cooldown = 300
}
}
resource "aws_sns_topic" "default" {
name = "rds-events"
}
resource "aws_sqs_queue" "default" {
name = "aurora-notifications"
}
resource "aws_sns_topic_subscription" "user_updates_sqs_target" {
topic_arn = aws_sns_topic.default.arn
protocol  = "sqs"
endpoint  = aws_sqs_queue.default.arn
}
resource "aws_sqs_queue_policy" "test" {
queue_url = aws_sqs_queue.default.id
policy = <<POLICY
{
"Version": "2012-10-17",
"Id": "sqspolicy",
"Statement": [
{
"Sid": "First",
"Effect": "Allow",
"Principal": "*",
"Action": "sqs:SendMessage",
"Resource": "${aws_sqs_queue.default.arn}",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "${aws_sns_topic.default.arn}"
}
}
}
]
}
POLICY
}
resource "aws_db_event_subscription" "cluster" {
name      = "cluster-events"
sns_topic = aws_sns_topic.default.arn
source_type = "db-cluster"
event_categories = [
"failover",  "failure", "deletion", "notification"
]
}

resource "aws_db_event_subscription" "instances" {
name      = "instances-events"
sns_topic = aws_sns_topic.default.arn
source_type = "db-instance"
event_categories = [
"availability",
"deletion",
"failover",
"failure",
"low storage",
"maintenance",
"notification",
"read replica",
"recovery",
"restoration",
]
}
output "endpoint" {
value = aws_rds_cluster.default.endpoint
}
output "reader-endpoint" {
value = aws_rds_cluster.default.reader_endpoint
}

最新更新