ЁЯУб рдзрдбрд╛ 16 тАФ Replication рдЖрдгрд┐ failover: рдЦреЛрд▓реАрдЪреНрдпрд╛ рдкреНрд░рддреА
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 16 ┬╖ рдорд╛рдЧреАрд▓: lesson-15-inside-the-engine ┬╖ рдкреБрдвреАрд▓: lesson-17-app-code
рднрд╛рдЧ 3 тАФ рдЕрдзрд┐рдХ рдЦреЛрд▓рд╛рдд. рдзрдбреЗ 01тАУ12 рдиреА рд░реЗрдХреЙрд░реНрдб рд░реВрдо рдмрд╛рдВрдзрд▓реА рдЖрдгрд┐ рдЪрд╛рд▓рд╡рд▓реА. рдзрдбреЗ 13тАУ18 рд╣реЗ interviews рдЖрдгрд┐ incidents рдордзреНрдпреЗ рд╡рд┐рдЪрд╛рд░рд▓реЗ рдЬрд╛рдгрд╛рд░реЗ рд╡рд┐рд╖рдп рдЖрд╣реЗрдд тАФ рдкреНрд░рддреНрдпреЗрдХ рддреНрдпрд╛рдЪ
school.dbрд╡рд░ рдкреНрд░рддреНрдпрдХреНрд╖ рдЪрд╛рд▓рддреЛ.
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ16, рдЖрдгрд┐ db/demo.py рдордзрд▓реЗ replica(). рд╣реЗ рдПрдХ simulation рдЖрд╣реЗ:
school.db primary рдЪреА рднреВрдорд┐рдХрд╛ рдХрд░рддреЗ, memory рдордзрд▓реА рдПрдХ рдкреНрд░рдд replica рдЪреА, рдЖрдгрд┐ рдПрдХ Python list
рдкрд╛рдард╡рд▓реЗрд▓реНрдпрд╛ log рдЪреА. рддреЗ replication lag, рдорд╛рдЧреЗ рдкрдбрд▓реЗрд▓реЗ рднрд░реВрди рдХрд╛рдврдгреЗ, рдЖрдгрд┐ рдПрдХ write рдЧрдорд╛рд╡рдгрд╛рд░рд╛ async failover рджрд╛рдЦрд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│рд╛ рджреБрд╕рд▒реНрдпрд╛ рдЗрдорд╛рд░рддреАрдд рд░реЗрдХреЙрд░реНрдб рд░реВрдордЪреА рдПрдХ рдкреНрд░рдд рдареЗрд╡рддреЗ. рдореБрдЦреНрдп рдЦреЛрд▓реАрдд рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдмрджрд▓ рдЭрд╛рд▓рд╛ рдХреА рдПрдХ рдирд┐рд░реЛрдкреНрдпрд╛ рдбрд╛рдпрд░реАрддрд▓реНрдпрд╛ рдУрд│реА (рдзрдбрд╛ 15) рддрд┐рдХрдбреЗ рдШреЗрдКрди рдЬрд╛рддреЛ. рд╣реА рдкреНрд░рдд рд╡рд╛рдЪрдгрд╛рд▒реНрдпрд╛рдВрд╕рд╛рдареА рдЙрдкрдпреЛрдЧреА рдЖрд╣реЗ тАФ рдЖрдгрд┐ рдореБрдЦреНрдп рдЦреЛрд▓реА рдЬрд│реВрди рдЧреЗрд▓реА, рддрд░ рд╣реА рдкреНрд░рддрдЪ рдореБрдЦреНрдп рдЦреЛрд▓реА рдмрдирддреЗ.
рдкрдг рдирд┐рд░реЛрдкреНрдпрд╛рд▓рд╛ рд╡реЗрд│ рд▓рд╛рдЧрддреЛ. рдПрдХ рдкрд╛рд▓рдХ рджрд┐рдпрд╛рдЪреЗ рдирд╛рд╡ рдиреЛрдВрджрд╡рддрд╛рдд, рдЖрдгрд┐ рдирд┐рд░реЛрдкреНрдпрд╛ рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЖрдзреАрдЪ рдкреНрд░рддреАрд╡рд░реВрди page reload рдХрд░рддрд╛рдд тАФ "рджрд┐рдпрд╛ рдХреБрдареЗ рдЖрд╣реЗ?" рд╣рд╛рдЪ replication lag. рдЖрдгрд┐ рдПрдЦрд╛рджреА рдУрд│ рдЕрдЬреВрди рдирд┐рд░реЛрдкреНрдпрд╛рдЪреНрдпрд╛ рдкрд┐рд╢рд╡реАрдд рдЕрд╕рддрд╛рдирд╛ рдореБрдЦреНрдп рдЦреЛрд▓реА рдЬрд│рд╛рд▓реА, рддрд░ рддреА рдУрд│ рд╣рд░рд╡рддреЗ. рдЬреЛрдкрд░реНрдпрдВрдд office "рдЭрд╛рд▓реЗ" рдореНрд╣рдгрдгреНрдпрд╛рдЖрдзреА рдкреНрд░рддреАрдиреЗ "рдорд┐рд│рд╛рд▓реЗ" рдореНрд╣рдгрдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рдд рдирд╛рд╣реА тАФ synchronous replication тАФ рдЬреЗ рдЬрд╛рд╕реНрдд рд╕реБрд░рдХреНрд╖рд┐рдд рдкрдг рд╣рд│реВ рдЖрд╣реЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
p["ЁЯЧДя╕П primary<br/>all writes"]
r1["ЁЯУЦ replica 1<br/>lag 0.2 s"]
r2["ЁЯУЦ replica 2<br/>lag 3 s"]
p -->|WAL stream| r1
p -->|WAL stream| r2
p -. "ЁЯТе dies" .-> f["ЁЯЪС promote a replica<br/>async: last writes may be lost"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/database/lesson-diagrams.html#l16
тЭУ рдХрд╛рдп
- Streaming replication тАФ primary рдЖрдкрд▓рд╛ log replicas рдХрдбреЗ рдкрд╛рдард╡рддреЛ, рдЖрдгрд┐ рддреЗ рддреЛ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рддрд╛рдд (Postgres physical replication, MySQL binlog replication). Replicas reads рджреЗрддрд╛рдд.
- Replication lag тАФ replica рдХрд┐рддреА рдорд╛рдЧреЗ рдЖрд╣реЗ. рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ writes primary рд╡рд░реВрди рд╡рд╛рдЪрд╛, рдХрд┐рдВрд╡рд╛ replica рдмрд░реЛрдмрд░реАрд▓рд╛ рдпреЗрдИрдкрд░реНрдпрдВрдд рдерд╛рдВрдмрд╛.
- Asynchronous (default) тАФ рдХреЛрдгрддреНрдпрд╛рд╣реА replica рдХрдбреЗ рдмрджрд▓ рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЖрдзреАрдЪ COMMIT рдкрд░рдд рдпреЗрддреЛ. рдЬрд▓рдж; failover рд╡реЗрд│реА рд╢реЗрд╡рдЯрдЪреЗ writes рдЧрдорд╛рд╡рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд (RPO > 0, рдзрдбрд╛ 09).
- Synchronous тАФ COMMIT рдХрд┐рдорд╛рди рдПрдХрд╛ replica рдЪреНрдпрд╛ acknowledgement рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЛ. Failover рд╡реЗрд│реА commit рдЭрд╛рд▓реЗрд▓реЗ рдХрд╛рд╣реАрдЪ рдЧрдорд╛рд╡рд▓реЗ рдЬрд╛рдд рдирд╛рд╣реА (RPO = 0); рдкреНрд░рддреНрдпреЗрдХ commit рд▓рд╛ рдПрдХ network round trip рд▓рд╛рдЧрддреЛ, рдЖрдгрд┐ рдЖрдЬрд╛рд░реА replica writes рдЕрдбрд╡реВ рд╢рдХрддреЛ.
- Failover тАФ рдПрдХрд╛ replica рд▓рд╛ primary рдмрдирд╡рд╛ рдЖрдгрд┐ apps рддреНрдпрд╛рдЪреНрдпрд╛рдХрдбреЗ рд╡рд│рд╡рд╛ (DNS name рдХрд┐рдВрд╡рд╛ proxy). Managed services рд╣реЗ рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рдХрд░рддрд╛рдд (AWS school L17: Multi-AZ).
- CAP, рдПрдХрд╛ рдУрд│реАрдд тАФ network рдлреБрдЯрд▓реЗ рдЕрд╕рддрд╛рдирд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд┐рд╡рдб рдХрд░рд╛рд╡реА рд▓рд╛рдЧрддреЗ: рдХрд╛рд╣реА writes рдирд╛рдХрд╛рд░рд╛ (consistent рд░рд╛рд╣рд╛) рдХрд┐рдВрд╡рд╛ рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛ writes рд╕реНрд╡реАрдХрд╛рд░рд╛ рдЖрдгрд┐ рдирдВрддрд░ рдЬреБрд│рд╡рд╛ (available рд░рд╛рд╣рд╛).
ЁЯдФ рдХрд╛
рдкреНрд░рддреНрдпреЗрдХ production database рдЪреА рдПрдХ рдкреНрд░рдд рдЕрд╕рддреЗ; рдкреНрд░рд╢реНрди рдЕрд╕рд╛ рдХреА рддреА рдХрд┐рддреА рддрд╛рдЬреА рдЖрд╣реЗ рдЖрдгрд┐ failover рдЪреА рдХрд┐рдВрдордд рдХрд╛рдп. Sync рд╡рд┐рд░реБрджреНрдз async рдорд╛рд╣реАрдд рдЕрд╕рд▓реЗ рдХреА outage рдордзреНрдпреЗ рдХрд╛рдп рдЧрдорд╛рд╡рд▓реЗ рдЬрд╛рддреЗ рд╣реЗ рддреБрдореНрд╣реА рдЖрдХрдбреНрдпрд╛рд╕рд╣ рд╕рд╛рдВрдЧреВ рд╢рдХрддрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
db/demo.py рдордзрд▓реЗ replica() primary рд╡рд░ рджрд┐рдпрд╛рдЪреА рдиреЛрдВрдж рдХрд░рддреЗ, рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдирд╛
рд╡рд┐рджреНрдпрд╛рд░реНрдереА рдореЛрдЬрддреЗ, log рдкрд╛рдард╡рддреЗ, рдордЧ рдЗрд╢рд╛рдирд▓рд╛ рд▓рд┐рд╣рд┐рддреЗ рдЖрдгрд┐ log рдкрд╛рдард╡рдгреНрдпрд╛рдЖрдзреАрдЪ primary рд▓рд╛ "рдорд╛рд░рддреЗ".
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 db/demo.py replica
# then change replica() so ship() is called inside write() тАФ that is synchronous replication.
# Run it again: Ishaan survives the failover.
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
primary: 6 students ┬╖ replica, before the log arrives: 5 тАФ replication lag, рдордЧ log рдкрд╛рдард╡рд▓реНрдпрд╛рд╡рд░
6, рдордЧ failover рдирдВрддрд░ Ishaan is LOST. рддреБрдордЪреНрдпрд╛ synchronous рдмрджрд▓рд╛рд╕рд╣
рдЗрд╢рд╛рди рддрд┐рдереЗ рдЕрд╕рддреЛ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреБрдореНрд╣реА lag, рд╕реНрд╡рддрдГрдЪреЗ writes рд╡рд╛рдЪрдгреЗ, рдЖрдгрд┐ async failover рдиреЗрдордХреЗ рдХреЛрдгрддреЗ writes рдЧрдорд╛рд╡рддреЛ рд╣реЗ рд╕рдордЬрд╛рд╡реВ рд╢рдХрддрд╛ тАФ рдЖрдгрд┐ рддреЗ рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА synchronous replication рдЪреА рдХрд┐рдВрдордд рдХрд╛рдп рд╣реЗрд╣реА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╕реНрд╡рддрдГрдЪрд╛ рддрд╛рдЬрд╛ write replica рд╡рд░реВрди рд╡рд╛рдЪрдгреЗ рдЖрдгрд┐ рддреЛ "рд╣рд░рд╡рдгреЗ"
- replica рдореНрд╣рдгрдЬреЗ backup рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рдгреЗ тАФ
DELETEрд╕реБрджреНрдзрд╛ replicate рд╣реЛрддреЛ; backups (рдзрдбрд╛ 09) рд╡реЗрдЧрд│реЗ рдЖрд╣реЗрдд - рдкреНрд░рддреНрдпреЗрдХ commit рд╡рд░ рджреВрд░рдЪреНрдпрд╛ region рдХрдбреЗ synchronous replication
- рдЦрд▒реНрдпрд╛ outage рдкрд░реНрдпрдВрдд failover рдХрдзреАрдЪ test рди рдХрд░рдгреЗ
- failover рд╣рд▓рд╡реВ рд╢рдХреЗрд▓ рдЕрд╢рд╛ name рдРрд╡рдЬреА apps рдордзреНрдпреЗ primary рдЪрд╛ IP hard-coded
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: RPO/RTO targets sync рд╡рд┐рд░реБрджреНрдз async рдард░рд╡рддрд╛рдд; failover drills рдЖрдгрд┐ replica-lag alerts рдкреНрд░рддреНрдпреЗрдХ database runbook рд╡рд░ рдЕрд╕рддрд╛рдд.
тПня╕П рдкреБрдвреЗ
git checkout lesson-17-app-code тАФ app рдордзреВрди рджрд┐рд╕рдгрд╛рд░рд╛ database.