Hvorfor PostgreSQL? Lenke til overskrift

La oss anta at du allerede har bestemt deg for PostgreSQL som din database. Hvorfor? Fordi det er et kraftig, open-source objekt-relasjonelt databasesystem med over 30 års aktiv utvikling, ikke sant? Vi lar problemet med hvor og hvordan lagre data til en annen gang.

RDS Aurora (PostgreSQL Compatible) eller RDS PostgreSQL Lenke til overskrift

Hvis det ikke er spesifikke krav, kan vi velge Aurora som standardalternativ. Lagringssystemene er nøkkelforskjellen mellom de to. Du trenger ikke å bekymre deg for å gå tom for plass. Aurora hjelper deg. Aurora vil automatisk skalere lagringen opp til 128 TB (november 2024). “Dataene replikeres automatisk på tvers av Availability Zones, dataene dine er svært holdbare med mindre mulighet for datatap.” Du kan ha én instans med data på 3 forskjellige steder. Hvis du vil legge til en annen region, vil det gi oss seks forskjellige steder i verden hvor data lagres. Magi, ikke sant?

PostgreSQL-parametere Lenke til overskrift

Det finnes mange parametere som kan endres. Men la oss fokusere på de viktigste og mest populære. Vennligst opprett to egendefinerte parametergrupper for cluster og for instans på forhånd, og ikke bruk standardgruppene. Vi kan ikke endre standardene, og noen parametere krever omstart av cluster/instans.

  • log_min_duration_statement = 4000 - Varigheten av uttalelsen i millisekunder utover hvilken uttalelser vil bli logget. 0 logger alle uttalelser. Standard er -1, logging er deaktivert. Mer info
  • rds.force_ssl = 1 - Tvinger bruk av SSL for alle tilkoblinger. Standard er 0 (av). Tving kryptering i transitt. Mer info
  • log_lock_waits = 1 - Logger lange låseventetider. Standard er av. Mer info
  • max_locks_per_transaction - Setter maks antall låser per transaksjon. Standard er 64. Mer info
  • shared_preload_libraries = pg_stat_statements,pgaudit - Spesifiserer en eller flere delte biblioteker som skal lastes inn i serverminnet ved oppstart. Standard er en tom streng. Mer info: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Extensions.html
  • idle_in_transaction_session_timeout = 300000 - Avslutter enhver sesjon med en åpen transaksjon som har vært inaktiv lengre enn angitt varighet i millisekunder. Standard er 0 (av). Mer info
  • log_autovacuum_min_duration = 60000 - Setter minimum kjøretid over hvilken autovacuum-handlinger vil bli logget. Standard er -1, logging er deaktivert. Mer info

Opprettelse fra konsollprosessen Lenke til overskrift

La oss anta at våre akutte behov og mangel på tid og kunnskap tvinger oss til å bruke konsollen. Hva er best å velge, hvor skal man klikke?

  1. Velg alltid produksjonsmalen. Fiks DB cluster-identifikatoren, den vil bli brukt i tilkoblingsstrengen. Bruk et hvilket som helst root-brukernavn. Følg standardene for AWS Secrets Manager Integration. Det vil legge til automatisk rotpassordrotasjon.

Image

  1. Størrelse og lagring. Bruk Aurora Standard og en hvilken som helst T-klasse for å optimalisere budsjettet litt. Du kan endre det senere.

Image

  1. Serverless v2. Hvis du bruker det veldig sjelden og ikke har peiling på belastningen, kan du bruke serverless v2. Det vil skalere automatisk. Fra 0 til himmelen. Mye dyrere, men veldig fleksibelt.

Image

  1. Tilkobling. OPPMERKSOMHET! Ikke bruk standard VPC her. Det tar rundt 5-10 minutter å klikke seg gjennom en separat VPC. Og etter databaseopprettelse kan du ikke endre dens VPC. Viktig moment. Å flytte en produksjonsdatabase kan koste deg mange timer. Det samme gjelder offentlig tilgang. Unngå det. Bruk VPN-er, Direct Connect, Balancers og RDS Proxy. Det tar tid å forstå hva som konsumerer databasen fra utsiden.

Image

  1. Tilkobling igjen. Ikke bruk standard sikkerhetsgruppe (brannmur). Bare opprett en ny. Selv om reglene blir dårlige og feil, er det bedre å ha en separat enhet som kun brukes for denne databasen.

Image

  1. Databaseparametere. Velg de egendefinerte parametergruppene som ble opprettet ovenfor. Ikke standard. Det er mulig å endre, men krever omstart av instans/cluster.

  2. Kryptering i ro. Opprett alltid en separat multi-region KMS-nøkkel. Minst én Customer Managed KMS-nøkkel kan hjelpe mye. Vi kan ikke endre krypteringsparametere etter databaseopprettelse. Det samme gjelder performance insights.

Image

Opprettelse fra Terraform Lenke til overskrift

Det samme som ovenfor, men som kode. Det er ikke nødvendig å gjenta det igjen. Denne koden er allerede tilgjengelig. https://github.com/terraform-aws-modules/terraform-aws-rds-aurora/blob/master/examples/postgresql/main.tf

provider "aws" {
  region = local.region
}

data "aws_availability_zones" "available" {}

locals {
  name   = "ex-${basename(path.cwd)}"
  region = "eu-west-1"

  vpc_cidr = "10.0.0.0/16"
  azs      = slice(data.aws_availability_zones.available.names, 0, 3)

  tags = {
    Example    = local.name
  }
}

################################################################################
# RDS Aurora Module
################################################################################

module "aurora" {
  source  = "terraform-aws-modules/rds-aurora/aws"
  version = "~> 9.0"

  name            = local.name
  engine          = "aurora-postgresql"
  engine_version  = "16.3"
  master_username = "pgroot"
  storage_encrypted = true
  kms_key_id        = module.kms.key_id
  instances = {
    1 = {
      instance_class          = "db.t4.medium"
    }
  }
  vpc_id               = module.vpc.vpc_id
  db_subnet_group_name = module.vpc.database_subnet_group_name
  security_group_rules = {
    vpc_ingress = {
      cidr_blocks = module.vpc.private_subnets_cidr_blocks
    }
  }

  apply_immediately   = true

  engine_lifecycle_support = "open-source-rds-extended-support-disabled"

  create_db_cluster_parameter_group      = true
  db_cluster_parameter_group_name        = local.name
  db_cluster_parameter_group_family      = "aurora-postgresql16"
  db_cluster_parameter_group_description = "${local.name} example cluster parameter group"
  db_cluster_parameter_group_parameters = [
    {
      name         = "log_min_duration_statement"
      value        = 4000
      apply_method = "immediate"
      }, {
      name         = "rds.force_ssl"
      value        = 1
      apply_method = "immediate"
      }, {
      name         = "log_lock_waits"
      value        = "1"
      apply_method = "immediate"
      }, {
      name         = "max_locks_per_transaction"
      value        = "1000"
      apply_method = "pending-reboot"
      }, {
      name         = "shared_preload_libraries"
      value        = "pg_stat_statements,pgaudit"
      apply_method = "pending-reboot"
      }, {  
      name         = "idle_in_transaction_session_timeout"
      value        = "300000" # Max 5 minutes per transaction
      apply_method = "immediate"
      }, {
      name         = "log_autovacuum_min_duration"
      value        = "60000" # 1m, minimum execution time above which autovacuum actions will be logged
      apply_method = "immediate"
    }
  ]

  create_db_parameter_group      = true
  db_parameter_group_name        = local.name
  db_parameter_group_family      = "aurora-postgresql16"
  db_parameter_group_description = "${local.name} example DB parameter group"
  db_parameter_group_parameters = [
    {
      name         = "log_min_duration_statement"
      value        = 4000
      apply_method = "immediate"
    }
  ]

  enabled_cloudwatch_logs_exports = ["postgresql"]
  create_cloudwatch_log_group     = true

  cloudwatch_log_group_tags = {
    Sensitivity = "high"
  }

  tags = local.tags
}

################################################################################
# Supporting Resources
################################################################################

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "~> 5.0"

  name = local.name
  cidr = local.vpc_cidr

  azs              = local.azs
  public_subnets   = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k)]
  private_subnets  = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 3)]
  database_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 6)]

  tags = local.tags
}

module "kms" {
  source  = "terraform-aws-modules/kms/aws"
  version = "~> 2.0"

  deletion_window_in_days = 7
  description             = "KMS key for ${local.name} cluster activity stream."
  enable_key_rotation     = true
  is_enabled              = true
  key_usage               = "ENCRYPT_DECRYPT"

  aliases = [local.name]

  tags = local.tags
}

Hva nå? Andre alternativer? Lenke til overskrift

I dag dekket vi PostgreSQL på RDS Aurora. Men det finnes mange andre alternativer. Det billigste er å lagre rådata som S3-objekter. Holdbart og replikasjon er tilgjengelig, men det kan være tregt. Nøkkel-verdi-lagre som DynamoDB. Det er raskt, men det er ikke en relasjonsdatabase. Det viktigste er å starte med problemet og deretter velge riktig verktøy for det.