ЁЯПл The SchoolтА║ЁЯкк AWSтА║ЁЯЧГя╕П рдзрдбрд╛ 17 тАФ RDS: рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд▓реЗрд▓реЗ рджрдкреНрддрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯЧГя╕П рдзрдбрд╛ 17 тАФ RDS: рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд▓реЗрд▓реЗ рджрдкреНрддрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 20 рдкреИрдХреА рдзрдбрд╛ 17 ┬╖ рдорд╛рдЧреАрд▓: lesson-16-route53 ┬╖ рдкреБрдвреАрд▓: lesson-18-cloudwatch


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рдзрдбреЗ 01тАУ17. рдкреНрд░рддреНрдпреЗрдХ рдЦрд▒реНрдпрд╛ system рдЪреЗ stateful рд╣реГрджрдп тАФ рдЖрдгрд┐ "managed" рдЖрдкрд▓реА рдХрд┐рдВрдордд рд╡рд╕реВрд▓ рдХрд░рддреЗ рдЕрд╢реА рдкрд╣рд┐рд▓реА service.

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдиреЛрдВрджреА тАФ рдЧреБрдг, рдкреНрд░рд╡реЗрд╢, рдлреА тАФ рджрдкреНрддрд░ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдд ЁЯЧГя╕П рд░рд╛рд╣рддрд╛рдд: рдореНрд╣рдгрдЬреЗ database. рддреБрдордЪреНрдпрд╛рдХрдбреЗ рджреЛрди рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд:

  1. рд╕реНрд╡рддрдГ рдЪрд╛рд▓рд╡рд╛ рдПрдХрд╛ рдмрд╛рдХрд╛рд╡рд░ (EC2 рд╡рд░ Postgres): рддреБрдореНрд╣реАрдЪ рдХрд╛рд░рдХреВрди рдмрдирддрд╛. рд░рд╛рддреНрд░реАрдЪреНрдпрд╛ photocopies, software patches, рд╣реЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рдкрд╛рдгреНрдпрд╛рдЦрд╛рд▓реА рдЧреЗрд▓реНрдпрд╛рд╡рд░ рдПрдХ рдЬрд╛рджрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдп, рдкрд╣рд╛рдЯреЗ 3 рд╡рд╛рдЬрддрд╛рдЪреА recovery тАФ рд╕рдЧрд│реЗ рддреБрдореНрд╣реА, рдХрд╛рдпрдордЪреЗ.
  2. рдХрд╛рд░рдХреБрдирд╛рд╕рд╣ рдХрд╛рд░реНрдпрд╛рд▓рдп рднрд╛рдбреНрдпрд╛рдиреЗ рдШреНрдпрд╛ тАФ RDS. рддреБрдореНрд╣реА engine рдирд┐рд╡рдбрддрд╛ (Postgres, MySQLтАж) рдЖрдгрд┐ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪрд╛ рдЖрдХрд╛рд░; backups, patching рдЖрдгрд┐ failover рдЪреА рдХрд╡рд╛рдпрдд AWS рдХрд░рддреЛ.

рднрд╛рдбреЗрдХрд░реВрдЪреЗ рддреАрди рдлрд╛рдпрджреЗ:

рдЖрдгрд┐ рд╕рдВрдкреВрд░реНрдг course рдПрдХрддреНрд░ рдмрд╛рдВрдзрдгрд╛рд░рд╛ рдПрдХ рддрдкрд╢реАрд▓: рддреБрдордЪреНрдпрд╛ app рд▓рд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪрд╛ рдЖрдХрдбрд╛ рдХрдзреАрдЪ рдХрд│рдд рдирд╛рд╣реА тАФ рддреЗ endpoint рд▓рд╛ рдлреЛрди рдХрд░рддреЗ (рдПрдХ DNS рдирд╛рд╡, рдзрдбрд╛ 16 рдЪреА phonebook!) рдЬреЗ рдиреЗрд╣рдореА рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ primary рдХрдбреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд░рддреЗ. Reception-desk рдЪреА рдпреБрдХреНрддреА, state рд▓рд╛ рд▓рд╛рд╡рд▓реЗрд▓реА.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    app["ЁЯЦея╕П app (private wing)"]
    ep["тШОя╕П endpoint DNS<br/>school-db.xyz.rds.amazonaws.com"]
    p["ЁЯЧГя╕П primary office (AZ-a)<br/>private subnet, SG: app only"]
    m["ЁЯкЮ standby mirror (AZ-b)<br/>synced ┬╖ failover only, no reads"]
    bak["ЁЯУ╕ nightly photocopies<br/>+ point-in-time restore"]
    rr["ЁЯУЪ read replica(s)<br/>reports go here"]
    app -->|"1 dial the name"| ep -->|"2"| p
    p ==>|"3 sync"| m
    p -->|"4"| bak
    p -.->|"async"| rr

тЭУ рдХрд╛рдп

ЁЯдФ рдХрд╛

State рдордзреНрдпреЗ cloud рдЪреНрдпрд╛ рдЪреБрдХрд╛ рд╣рд╕рдгреНрдпрд╛рд╡рд╛рд░реА рдиреЗрддрд╛ рдпреЗрдд рдирд╛рд╣реАрдд. рд╣рд░рд╡рд▓реЗрд▓рд╛ stateless рдмрд╛рдХ = рдЦрд╛рдВрджреЗ рдЙрдбрд╡рдгреЗ (рдзрдбрд╛ 12 рддреЛ рдмрджрд▓рддреЛ). рд╣рд░рд╡рд▓реЗрд▓реЗ рджрдкреНрддрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп = рд╢рд╛рд│реЗрдХрдбреЗ рдЧреБрдгрдЪ рдирд╛рд╣реАрдд. рд╣рд╛ рдЕрд╕рдорддреЛрд▓ рд╣рд╛рдЪ рдХрд╛рд░рдХреБрдирд╛рд▓рд╛ рдкреИрд╕реЗ рджреЗрдгреНрдпрд╛рдЪрд╛ рд╕рдВрдкреВрд░реНрдг рдпреБрдХреНрддрд┐рд╡рд╛рдж рдЖрд╣реЗ: рдЬреЗ рднрд╛рдЧ рдХреЛрдгрд╛рдЪреЗ рддрд░реА рдкреВрд░реНрдгрд╡реЗрд│ рдХреМрд╢рд▓реНрдп рдЖрд╣реЗрдд тАФ рдЦрд░реЛрдЦрд░ restore рд╣реЛрдгрд╛рд░реЗ backups, рдЦрд░реЛрдЦрд░ failover рд╣реЛрдгрд╛рд░реЗ failovers тАФ рддреЗ рднрд╛рдбреНрдпрд╛рдиреЗ, рддрдкрд╛рд╕рд▓реЗрд▓реЗ рдЖрдгрд┐ рдХрдВрдЯрд╛рд│рд╡рд╛рдгреЗ рдорд┐рд│рддрд╛рдд.

ЁЯФз рдХрд╕реЗ

aws rds describe-db-instances --query \
  'DBInstances[].{id:DBInstanceIdentifier,engine:Engine,size:DBInstanceClass,multiAZ:MultiAZ,endpoint:Endpoint.Address}'
# the failover drill (Multi-AZ instances):
aws rds reboot-db-instance --db-instance-identifier school-db --force-failover

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (~20 рдорд┐рдирд┐рдЯреЗ, db.t4g.micro free tier рд╡рд░ ~рдореЛрдлрдд тАФ рдирдВрддрд░ DESTROY рдХрд░рд╛)

рддреБрдордЪреНрдпрд╛ lab VPC рдЪреНрдпрд╛ private subnets рдордзреНрдпреЗ db.t4g.micro Postgres рдмрдирд╡рд╛, рдПрдХрд╛ рдмрд╛рдХрд╛рд╡рд░реВрди endpoint рдирд╛рд╡рд╛рд▓рд╛ psql рдХрд░рд╛, рдПрдХ row insert рдХрд░рд╛, --force-failover рдиреЗ reboot рдХрд░рд╛, рдЖрдгрд┐ рддреЗрдЪ рдирд╛рд╡ рджреБрд╕рд▒реНрдпрд╛ рдЗрдорд╛рд░рддреАрддреВрди рдЙрддреНрддрд░ рджреЗрддрд╛рдирд╛ рдкрд╛рд╣рд╛. рдордЧ рддреЗ delete рдХрд░рд╛ (lab рдордзреНрдпреЗ final snapshot рд╡рдЧрд│рд╛, рдЖрдгрд┐ рддреЗ рдЦрд░реЛрдЦрд░ рдЧреЗрд▓реЗ рдХрд╛ рддреЗ рддрдкрд╛рд╕рд╛ тАФ рдХрд╛ рддреЗ рдзрдбрд╛ 20 рд╕рд╛рдВрдЧрддреЛ).

тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ

psql -h ENDPOINT private рдмрд╛рдХрд╛рд╡рд░реВрди connect рд╣реЛрддреЗ; reboot-db-instance --force-failover рдирдВрддрд░ рддреЛрдЪ endpoint рджреБрд╕рд▒реНрдпрд╛ AZ рдордзреВрди рдкреБрдиреНрд╣рд╛ рдЙрддреНрддрд░ рджреЗрддреЛ.

ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ тАФ рдЪрд╛рд▓реВ рдареЗрд╡реВ рдирдХрд╛

DB instance delete рдХрд░рд╛ (lab рдордзреНрдпреЗ final snapshot рд╡рдЧрд│рд╛) рдЖрдгрд┐ describe-db-instances рд░рд┐рдХрд╛рдореЗ рдЖрд╣реЗ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рд╛ тАФ RDS рддрд╛рд╕рд╛рдкреНрд░рдорд╛рдгреЗ bill рдХрд░рддреЗ

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

рдмрд╛рдХ, files, рдЧрд░реНрджреА, рдирд╛рд╡реЗ, рдиреЛрдВрджреА тАФ рд╕рдЧрд│реЗ рдЪрд╛рд▓реВ. рдкрдг рдкрд╣рд╛рдЯреЗ 3 рд╡рд╛рдЬрддрд╛ рдпрд╛ рд╕рдЧрд│реНрдпрд╛рд╡рд░ рд▓рдХреНрд╖ рдХреЛрдг рдареЗрд╡рддреЗ? рдзрдбрд╛ 18: CloudWatch тАФ рдкреНрд░рдЧрддрд┐рдкреБрд╕реНрддрдХреЗ, рдбрд╛рдпрд▒реНрдпрд╛ рдЖрдгрд┐ рдзреЛрдХреНрдпрд╛рдЪреНрдпрд╛ рдШрдВрдЯрд╛.

ЁЯЧГя╕П Lesson 17 тАФ RDS: the record office you rent

ЁЯУН You are here: Lesson 17 of 20 ┬╖ Previous: lesson-16-route53 ┬╖ Next: lesson-18-cloudwatch


ЁЯУж What's in this branch

Lessons 01тАУ17. The stateful heart of every real system тАФ and the first service where "managed" earns its price tag.

ЁЯзТ Explain like I'm 5

The school's records тАФ grades, enrollments, fees тАФ live in the record office ЁЯЧГя╕П: the database. You have two choices:

  1. Run it yourself on a desk (Postgres on EC2): YOU become the clerk. Nightly photocopies, software patches, a spare office when this one floods, 3 AM recoveries тАФ all you, forever.
  2. Rent the office WITH a clerk included тАФ RDS. You pick the engine (Postgres, MySQLтАж) and the office size; AWS does backups, patching, and the failover drill.

The three renter's perks:

And one detail that ties the whole course: your app never learns the office's number тАФ it dials the endpoint (a DNS name, lesson 16's phonebook!) which always points at the current primary. The reception-desk trick, applied to state.

ЁЯЧ║я╕П Diagram

flowchart LR
    app["ЁЯЦея╕П app (private wing)"]
    ep["тШОя╕П endpoint DNS<br/>school-db.xyz.rds.amazonaws.com"]
    p["ЁЯЧГя╕П primary office (AZ-a)<br/>private subnet, SG: app only"]
    m["ЁЯкЮ standby mirror (AZ-b)<br/>synced ┬╖ failover only, no reads"]
    bak["ЁЯУ╕ nightly photocopies<br/>+ point-in-time restore"]
    rr["ЁЯУЪ read replica(s)<br/>reports go here"]
    app -->|"1 dial the name"| ep -->|"2"| p
    p ==>|"3 sync"| m
    p -->|"4"| bak
    p -.->|"async"| rr

тЭУ What

ЁЯдФ Why

State is where cloud mistakes stop being funny. A lost stateless desk = a shrug (lesson 12 replaces it). A lost record office = the school has no grades. That asymmetry is the whole argument for paying the clerk: the parts that are someone's full-time craft тАФ backups that restore, failovers that fail over тАФ come rented, tested, and boring.

ЁЯФз How

aws rds describe-db-instances --query \
  'DBInstances[].{id:DBInstanceIdentifier,engine:Engine,size:DBInstanceClass,multiAZ:MultiAZ,endpoint:Endpoint.Address}'
# the failover drill (Multi-AZ instances):
aws rds reboot-db-instance --db-instance-identifier school-db --force-failover

ЁЯзк Try it (~20 min, ~free on db.t4g.micro free tier тАФ DESTROY after)

Create a db.t4g.micro Postgres in your lab VPC's private subnets, psql to the endpoint name from a desk, insert a row, reboot with --force-failover, watch the same name answer from the other building. Then delete it (skip the final snapshot in a lab, and check it's gone тАФ lesson 20 explains why).

тЬЕ Verify тАФ what you should see

psql -h ENDPOINT connects from a private desk; after reboot-db-instance --force-failover the same endpoint answers again from the other AZ.

ЁЯз╣ Clean up тАФ do not leave running

delete the DB instance (skip the final snapshot in a lab) and confirm describe-db-instances is empty тАФ RDS bills hourly

тЪая╕П Common mistakes

тПня╕П Next

Desks, files, crowds, names, records тАФ running. But who's watching it all at 3 AM? Lesson 18: CloudWatch тАФ report cards, diaries, and alarm bells.

тЖР Previousroute53Next тЖТcloudwatch

This page is the lesson's README from the lesson-17-rds branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.