ЁЯУЪ рдзрдбрд╛ 05 тАФ Replication: рдиреЛрдВрджрд╡рд╣реАрдЪреНрдпрд╛ рдкреНрд░рддреА
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 05 ┬╖ рдорд╛рдЧреЗ: lesson-04-failure-detection ┬╖ рдкреБрдвреЗ: lesson-06-quorums
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ04, рдЕрдзрд┐рдХ рднрд╛рдЧ 2 рд╕реБрд░реВ рд╣реЛрддреЛ: рдкреНрд░рддреА. рдПрдХ рд╢рд╛рдЦрд╛ leader рдЕрд╕рддреЗ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ write
рдШреЗрддреЗ; рдмрд╛рдХреАрдЪреНрдпрд╛ followers рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рддрд┐рдЪрд╛ log copy рдХрд░рддрд╛рдд. Synchronous,
asynchronous рдЖрдгрд┐ semi-synchronous replication, replication lag, failover рдордзреНрдпреЗ
рдХрд╛рдп рд╣рд░рд╡рддреЗ, рдЖрдгрд┐ split brain. dist/demo.py рдордзрд▓реЗ replication()
рдЖрдгрд┐ dist/sim.py рдордзрд▓реЗ Leader.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдкреБрдгреЗ рдореБрдЦреНрдп рдиреЛрдВрджрд╡рд╣реА ЁЯУТ рдареЗрд╡рддреЗ. рдлрдХреНрдд рдкреБрдгреЗрдЪ рддреНрдпрд╛рдд рдЧреБрдг рд▓рд┐рд╣рд┐рддреЗ. рдирд╛рд╢рд┐рдХ рдЖрдгрд┐ рдирд╛рдЧрдкреВрд░ рдкреНрд░рддреА ЁЯУЪ рдареЗрд╡рддрд╛рдд, рдореНрд╣рдгрдЬреЗ рдкреБрдгреНрдпрд╛рдд рдкреВрд░ рдЖрд▓рд╛ рддрд░реА рд╕рдЧрд│реЗ рдЧреБрдг рдирд╖реНрдЯ рд╣реЛрдд рдирд╛рд╣реАрдд.
рдкреБрдгреНрдпрд╛рддрд▓реА рдХрддрд░рд┐рдирд╛ рдЪрд╛рд░ рдЧреБрдг рд▓рд┐рд╣рд┐рддреЗ: g1, g2, g3, g4. рдкреНрд░рддреАрдВрдирд╛ рддреЗ рдХрд╕реЗ рдХрд│рддрд╛рдд?
- рдЬрд▓рдж рдорд╛рд░реНрдЧ (asynchronous): рдХрддрд░рд┐рдирд╛ рдЧреБрдг рд▓рд┐рд╣рд┐рддреЗ, рд╢рд┐рдХреНрд╖рд┐рдХреЗрд▓рд╛ рд▓рдЧреЗрдЪ "рдЭрд╛рд▓реЗ!" рд╕рд╛рдВрдЧрддреЗ, рдЖрдгрд┐ рддреЗ рдкрд╛рди рдкреНрд░рддреАрдВрдирд╛ рдирдВрддрд░ рдкрд╛рдард╡рддреЗ. рдЬрд▓рдж. рдкрдг рдПрдХреЗ рджрд┐рд╡рд╢реА рдлрдХреНрдд g1 рдЖрдгрд┐ g2 рдкрд╛рдард╡рд▓реЗ рдЧреЗрд▓реНрдпрд╛рд╡рд░рдЪ рдкреБрдгреНрдпрд╛рдд рдкреВрд░ рдпреЗрддреЛ. рдирд╛рдЧрдкреВрд░ рдирд╡реА рдореБрдЦреНрдп рдиреЛрдВрджрд╡рд╣реА рдмрдирддреЗ. g3 рдЖрдгрд┐ g4 рдЧреЗрд▓реЗ тАФ рдЖрдгрд┐ рд╢рд┐рдХреНрд╖рд┐рдХреЗрд▓рд╛ "рдЭрд╛рд▓реЗ!" рдЕрд╕реЗ рд╕рд╛рдВрдЧрд┐рддрд▓реЗ рдЧреЗрд▓реЗ рд╣реЛрддреЗ. ЁЯШ▒
- рдХрд╛рд│рдЬреАрдкреВрд░реНрд╡рдХ рдорд╛рд░реНрдЧ (synchronous): рдПрдЦрд╛рджреНрдпрд╛ рдкреНрд░рддреАрдХрдбреЗрд╣реА рддреЗ рдкрд╛рди рдкреЛрд╣реЛрдЪрд▓реНрдпрд╛рд╡рд░рдЪ рдХрддрд░рд┐рдирд╛ "рдЭрд╛рд▓реЗ!" рд╕рд╛рдВрдЧрддреЗ. рдкреБрдгреНрдпрд╛рдд рдкреВрд░ рдЖрд▓рд╛ рддрд░реА рдХрд╛рд╣реАрдЪ рд╣рд░рд╡рдд рдирд╛рд╣реА. рдкрдг рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдг рдирд┐рд░реЛрдкреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЛ. рдкреНрд░рддреАрдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛ рд░рд╕реНрддрд╛ рд╣рд│реВ рдЕрд╕реЗрд▓, рддрд░ рдкреНрд░рддреНрдпреЗрдХ рдЧреБрдг рд╣рд│реВ рд╣реЛрддреЛ.
- рдордзрд▓рд╛ рдорд╛рд░реНрдЧ (semi-synchronous): рд╕рдЧрд│реНрдпрд╛ рдирд╡реНрд╣реЗ, рдПрдХрд╛ рдкреНрд░рддреАрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рд╛.
рдЖрдгрд┐ рдЖрдгрдЦреА рдПрдХ рдзреЛрдХрд╛: рдкреБрд░рд╛рдирдВрддрд░ рдкреБрдгреЗ рдХреЛрд░рдбреЗ рд╣реЛрддреЗ рдЖрдгрд┐ рдЕрдЬреВрдирд╣реА рд╕реНрд╡рддрдГрд▓рд╛ рдореБрдЦреНрдп рдиреЛрдВрджрд╡рд╣реА рд╕рдордЬрддреЗ. рдЖрддрд╛ рджреЛрди рд╢рд╛рдЦрд╛ writes рдШреЗрддрд╛рдд. рдпрд╛рд▓рд╛рдЪ split brain рдореНрд╣рдгрддрд╛рдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
t["ЁЯСйтАНЁЯПл teacher"] -->|"write g1 g2 g3 g4"| lead["ЁЯУТ Pune тАФ leader<br/>says 'acknowledged' at once"]
lead -->|"shipped: g1 g2"| f1["ЁЯУЪ Nashik тАФ follower"]
lead -->|"shipped: g1 g2"| f2["ЁЯУЪ Nagpur тАФ follower"]
lead --> x["ЁЯТе Pune dies"]
x --> nl["new leader has g1 g2<br/>lost: g3 g4 тАФ already acknowledged"]
s["synchronous: 'acknowledged' only after a follower has it<br/>lost: nothing"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/distributed-systems/lesson-diagrams.html#l05
тЭУ рдХрд╛рдп
- Replication тАФ рдПрдХрд╛рдЪ data рдЪреА рдкреНрд░рдд рдЕрдиреЗрдХ nodes рд╡рд░ рдареЗрд╡рдгреЗ: рдПрдЦрд╛рджрд╛ node рд╣рд░рд╡рд▓рд╛ рддрд░реА рдЯрд┐рдХрдгреНрдпрд╛рд╕рд╛рдареА, рдЬрд╛рд╕реНрдд рдард┐рдХрд╛рдгрд╛рдВрд╣реВрди reads рджреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдгрд┐ users рдЪреНрдпрд╛ рдЬрд╡рд│ рд░рд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА.
- Leader-follower (primary-replica) тАФ рдПрдХ leader writes рд╕реНрд╡реАрдХрд╛рд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪреА log рдордзреНрдпреЗ рдиреЛрдВрдж рдХрд░рддреЛ; followers рддреЛрдЪ log рддреНрдпрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛рдд. Reads leader рдХрдбреЗ рдХрд┐рдВрд╡рд╛ followers рдХрдбреЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд.
- Synchronous replication тАФ рдХрд┐рдорд╛рди рдПрдХрд╛ follower рдХрдбреЗ write рдкреЛрд╣реЛрдЪрд▓реНрдпрд╛рд╡рд░рдЪ leader рддреЛ acknowledge рдХрд░рддреЛ. Acknowledged write leader рд╣рд░рд╡рд▓рд╛ рддрд░реА рдЯрд┐рдХрддреЛ. рдХрд┐рдВрдордд: рдкреНрд░рддреНрдпреЗрдХ write рдПрдХрд╛ round trip рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддреЛ, рдЖрдгрд┐ рд╣рд│реВ рдХрд┐рдВрд╡рд╛ рдмрдВрдж рдкрдбрд▓реЗрд▓рд╛ follower writes рдЕрдбрд╡рддреЛ.
- Asynchronous replication тАФ leader рд▓рдЧреЗрдЪ acknowledge рдХрд░рддреЛ рдЖрдгрд┐ log рдирдВрддрд░ рдкрд╛рдард╡рддреЛ. рдЬрд▓рдж. рдХрд┐рдВрдордд: failover рд╡рд░, leader рдиреЗ acknowledge рдХреЗрд▓реЗрд▓реЗ рдкрдг рдЕрдЬреВрди рди рдкрд╛рдард╡рд▓реЗрд▓реЗ writes рд╣рд░рд╡рддрд╛рдд.
- Semi-synchronous тАФ рд╕рдЧрд│реНрдпрд╛ рдирд╡реНрд╣реЗ, рдПрдХрд╛ (рдХрд┐рдВрд╡рд╛ рдХрд╛рд╣реА) followers рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рд╛. рд╕рд╛рдорд╛рдиреНрдп рдордзрд▓рд╛ рдорд╛рд░реНрдЧ:
рдПрдХ synchronous follower, рдмрд╛рдХреАрдЪреЗ asynchronous. (MySQL рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрд╡реГрддреНрддреАрд▓рд╛
"semisynchronous replication" рдореНрд╣рдгрддреЗ; PostgreSQL рд╣реЗ
synchronous_standby_namesрдиреЗ рдХрд░рддреЗ.) - Replication lag тАФ follower leader рдЪреНрдпрд╛ рдХрд┐рддреА рдорд╛рдЧреЗ рдЖрд╣реЗ. рд╕рд╣рд╕рд╛ milliseconds; рдЬрд╛рд╕реНрдд load рдЦрд╛рд▓реА рд╕реЗрдХрдВрдж рдХрд┐рдВрд╡рд╛ рдорд┐рдирд┐рдЯреЗ. рдорд╛рдЧреЗ рдкрдбрд▓реЗрд▓реНрдпрд╛ follower рдХрдбреВрди рдЖрд▓реЗрд▓реЗ reads stale (рдЬреБрдиреЗ) рдЕрд╕рддрд╛рдд (рдзрдбрд╛ 07).
- Failover тАФ leader рдмрдВрдж рдкрдбрд▓реНрдпрд╛рдЪрд╛ рд╕рдВрд╢рдп рдЖрд▓рд╛ рдХреА (рдзрдбрд╛ 04) рдПрдХрд╛ follower рд▓рд╛ leader рдмрдирд╡рд▓реЗ рдЬрд╛рддреЗ. Async replication рдордзреНрдпреЗ, рд╕рд░реНрд╡рд╛рдд рдЕрджреНрдпрдпрд╛рд╡рдд follower рдХрдбреВрдирд╣реА рдХрд╛рд╣реА writes рд╕реБрдЯрд▓реЗрд▓реЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд.
- Split brain тАФ рджреЛрди nodes рджреЛрдШреЗрд╣реА leader рд╕рд╛рд░рдЦреЗ рд╡рд╛рдЧрддрд╛рдд рдЖрдгрд┐ рджреЛрдШреЗрд╣реА writes рд╕реНрд╡реАрдХрд╛рд░рддрд╛рдд; рддреНрдпрд╛рдВрдЪрд╛ data рджреБрднрдВрдЧрддреЛ. рдЬреБрдирд╛ leader рдлрдХреНрдд рд╣рд│реВ рд╣реЛрддрд╛, рдмрдВрдж рдкрдбрд▓реЗрд▓рд╛ рдирд╡реНрд╣рддрд╛, рдЖрдгрд┐ рдкрд░рдд рдЖрд▓рд╛ рдХреА рдЕрд╕реЗ рд╣реЛрддреЗ. рдЙрдкрд╛рдп: рдмрд╣реБрдорддрд╛рдЪреЗ рдорддрджрд╛рди (рдзрдбрд╛ 09), fencing (рдзрдбрд╛ 10), рдХрд┐рдВрд╡рд╛ рдЬреБрдиреНрдпрд╛ leader рд▓рд╛ рддреЛрдбреВрди рдЯрд╛рдХрдгреЗ (рдХрдзреА рдХрдзреА рддреНрдпрд╛рд▓рд╛ STONITH рдореНрд╣рдгрддрд╛рдд тАФ "shoot the other node in the head", рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛рдЪреА рд╡реАрдЬ рдмрдВрдж рдХрд░рдгреЗ).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг "database рд▓рд╛ replica рдЖрд╣реЗ" рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрдиреЗрдХрджрд╛ "рдЖрдкрдг data рдЧрдорд╛рд╡реВ рд╢рдХрдд рдирд╛рд╣реА" рдЕрд╕рд╛ рдШреЗрддрд▓рд╛ рдЬрд╛рддреЛ тАФ рдЖрдгрд┐ asynchronous replication рд╡ automatic failover рдЕрд╕рддрд╛рдирд╛ рддреЗ рдЦреЛрдЯреЗ рдЖрд╣реЗ. 2012 рдЪреА рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз GitHub рдШрдЯрдирд╛: рдЬреБрдирд╛ рдЭрд╛рд▓реЗрд▓рд╛ рдПрдХ MySQL follower promote рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛; рддреНрдпрд╛рдиреЗ рдЬреБрдиреНрдпрд╛ leader рдиреЗ рдЖрдзреАрдЪ рджрд┐рд▓реЗрд▓реНрдпрд╛ primary keys рдкреБрдиреНрд╣рд╛ рд╡рд╛рдкрд░рд▓реНрдпрд╛, рдЖрдгрд┐ рддреНрдпрд╛рдЪ keys рдПрдХрд╛ Redis store рдордзреНрдпреЗрд╣реА рд╡рд╛рдкрд░рд▓реНрдпрд╛ рд╣реЛрддреНрдпрд╛, рддреНрдпрд╛рдореБрд│реЗ рдХрд╛рд╣реА рдЦрд╛рд╕рдЧреА data рдЪреБрдХреАрдЪреНрдпрд╛ users рдирд╛ рджрд┐рд╕рд▓рд╛. Sync рдЖрдгрд┐ async рдордзрд▓реА рдирд┐рд╡рдб рдореНрд╣рдгрдЬреЗ write latency рдЖрдгрд┐ acknowledged writes рдЧрдорд╛рд╡рдгреЗ рдпрд╛рдВрдЪреНрдпрд╛рддрд▓реА рдирд┐рд╡рдб, рдЖрдгрд┐ рддреА рддреБрдореНрд╣реА рдЬрд╛рдгреАрд╡рдкреВрд░реНрд╡рдХ рдХрд░рд╛рдпрд▓рд╛ рд╣рд╡реА.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
dist/sim.py рдордзрд▓реЗ Leader(followers, sync=False) рдПрдХ log рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ follower рд╕рд╛рдареА рдПрдХ
list рдареЗрд╡рддреЗ. write(item) log рдордзреНрдпреЗ рдЬреЛрдбрддреЗ рдЖрдгрд┐ рд▓рдЧреЗрдЪ 'acknowledged' рдкрд░рдд рджреЗрддреЗ;
sync=True рдЕрд╕реЗрд▓ рддрд░ рддреЗ рдЖрдзреА рдкреНрд░рддреНрдпреЗрдХ follower рдордзреНрдпреЗрд╣реА рдЬреЛрдбрддреЗ. ship(upto) log рдордзрд▓реНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛
upto entries followers рдХрдбреЗ copy рдХрд░рддреЗ (async рдирд┐рд░реЛрдкреНрдпрд╛). fail_over() рд╕рд░реНрд╡рд╛рдд рд▓рд╛рдВрдм рдкреНрд░рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛
follower рд▓рд╛ promote рдХрд░рддреЗ рдЖрдгрд┐ (its copy, the writes it lacks) рдкрд░рдд рджреЗрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dist/demo.py replication
python3 - <<'EOF'
import sys; sys.path.insert(0, "dist"); from sim import Leader
for shipped in (0, 2, 3, 4):
L = Leader(["nashik", "nagpur"])
for g in ("g1", "g2", "g3", "g4"): L.write(g)
L.ship(shipped)
survivor, lost = L.fail_over()
print(f"async, {shipped} of 4 shipped before the crash тЖТ new leader has {survivor}, lost {lost}")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
replication рд╣реЗ print рдХрд░рддреЗ:
тФАтФА asynchronous replication: 4 grades acknowledged, then Pune (leader) dies тЖТ new leader has ['g1', 'g2'], lost ['g3', 'g4']
тФАтФА synchronous replication: 4 grades acknowledged, then Pune (leader) dies тЖТ new leader has ['g1', 'g2', 'g3', 'g4'], lost []
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
async, 0 of 4 shipped before the crash тЖТ new leader has [], lost ['g1', 'g2', 'g3', 'g4']
async, 2 of 4 shipped before the crash тЖТ new leader has ['g1', 'g2'], lost ['g3', 'g4']
async, 3 of 4 shipped before the crash тЖТ new leader has ['g1', 'g2', 'g3'], lost ['g4']
async, 4 of 4 shipped before the crash тЖТ new leader has ['g1', 'g2', 'g3', 'g4'], lost []
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
Async replication рдордзреНрдпреЗ, failover рдордзреНрдпреЗ рдЬреЗ рд╣рд░рд╡рддреЗ рддреЗ рдореНрд╣рдгрдЬреЗ crash рдЪреНрдпрд╛ рдХреНрд╖рдгреАрдЪрд╛ рдиреЗрдордХрд╛ replication lag: 0 рдкрд╛рдард╡рд▓реЗ тЖТ рдЪрд╛рд░рд╣реА acknowledged рдЧреБрдг рд╣рд░рд╡рд▓реЗ; 4 рдкрд╛рдард╡рд▓реЗ тЖТ рдПрдХрд╣реА рдирд╛рд╣реА. рд╢рд┐рдХреНрд╖рд┐рдХреЗрдиреЗ рдЪрд╛рд░рд╣реА рд╡реЗрд│рд╛ "acknowledged" рдРрдХрд▓реЗ рд╣реЛрддреЗ. Synchronous replication рдордзреНрдпреЗ рдХрд╛рд╣реАрдЪ рд╣рд░рд╡рд▓реЗ рдирд╛рд╣реА, рдХрд╛рд░рдг "acknowledged" рдиреЗ рдПрдХрд╛ рдкреНрд░рддреАрдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рд┐рд▓реА рд╣реЛрддреА.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдЧрдорд╛рд╡реВ рди рд╢рдХрдгрд╛рд▒реНрдпрд╛ data рд╕рд╛рдареА (рдкреИрд╕реЗ, рдЧреБрдг) async replication + automatic failover
- рдХреЛрдгрддрд╛рд╣реА рд░рд╛рдЦреАрд╡ рдирд╕рддрд╛рдирд╛ рдПрдХрд╛рдЪ follower рдХрдбреЗ synchronous replication тАФ рддреЛ рдмрдВрдж рдкрдбрд▓рд╛ рдХреА writes рдерд╛рдВрдмрддрд╛рдд
- рдЬреБрдиреНрдпрд╛ leader рд▓рд╛ fencing рдирд╛рд╣реА, рддреНрдпрд╛рдореБрд│реЗ рддреЛ рдкрд░рдд рдпреЗрддреЛ рдЖрдгрд┐ writes рдШреЗрддреЛ (split brain)
- leader рд╡рд░ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рдирдВрддрд░ рд▓рдЧреЗрдЪ follower рдХрдбреВрди рд╡рд╛рдЪрдгреЗ (рдзрдбрд╛ 07)
- failover рдХрдзреАрдЪ test рди рдХрд░рдгреЗ, рддреНрдпрд╛рдореБрд│реЗ рдкрд╣рд┐рд▓рд╛ failover рдереЗрдЯ outage рджрд░рдореНрдпрд╛рди рд╣реЛрддреЛ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
PostgreSQL тАФ streaming replication default рдиреБрд╕рд╛рд░ asynchronous рдЕрд╕рддреЗ. On a real account,
primary рд╡рд░рдЪреНрдпрд╛ postgresql.conf рдордзреНрдпреЗ рджреЛрди standbys рдкреИрдХреА рдПрдХ synchronous рдХрд░рд╛:
synchronous_standby_names = 'FIRST 1 (nashik, nagpur)' # wait for the first one in the list that is connected
synchronous_commit = on # a commit waits until that standby has flushed the WAL to disk
рдХрд┐рдВрд╡рд╛ 'ANY 1 (nashik, nagpur)' тАФ рдЬреЛ рдЖрдзреА рдЙрддреНрддрд░ рджреЗрдИрд▓ рддреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рд╛ (quorum commit).
synchronous_commit рд╣реЗ remote_apply (standby рдиреЗ рддреЗ рд▓рд╛рдЧреВ рдХрд░реЗрдкрд░реНрдпрдВрдд рдерд╛рдВрдмрд╛,
рдореНрд╣рдгрдЬреЗ рддрд┐рдерд▓реЗ reads рддреЗ рдкрд╛рд╣рддрд╛рдд), remote_write, local рдЖрдгрд┐ off рд╕реБрджреНрдзрд╛ рд╕реНрд╡реАрдХрд╛рд░рддреЗ, рдЖрдгрд┐ рддреЗ рдкреНрд░рддреНрдпреЗрдХ
transaction рд╕рд╛рдареА рд╡реЗрдЧрд│реЗ рдард░рд╡рддрд╛ рдпреЗрддреЗ тАФ рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдЧрдорд╛рд╡рд▓реА рддрд░реА рдЪрд╛рд▓реЗрд▓ рдЕрд╢рд╛ log line рд╕рд╛рдареА SET LOCAL synchronous_commit = off;.
Lag рд╡рд░ рд▓рдХреНрд╖ рдареЗрд╡рд╛:
SELECT application_name, state, sync_state, write_lag, flush_lag, replay_lag
FROM pg_stat_replication;
MySQL тАФ semisynchronous replication рд╣реЗ рдПрдХ plugin рдЖрд╣реЗ: рдХрд┐рдорд╛рди рдПрдХрд╛
replica рд▓рд╛ transaction рдорд┐рд│реЗрдкрд░реНрдпрдВрдд source рдерд╛рдВрдмрддреЛ (rpl_semi_sync_source_wait_for_replica_count).
Managed failover тАФ Amazon RDS Multi-AZ рджреБрд╕рд▒реНрдпрд╛ Availability Zone рдордзреНрдпреЗ рдПрдХ synchronous standby рдареЗрд╡рддреЗ рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ fail over рдХрд░рддреЗ; RDS read replicas asynchronous рдЕрд╕рддрд╛рдд рдЖрдгрд┐ рдЖрдкреЛрдЖрдк fail over рдХрд░рдд рдирд╛рд╣реАрдд. Patroni рд╕рд╛рд░рдЦреА tools рдПрдХрдЪ leader рдХреЛрдг рд╣реЗ рдард░рд╡рдгреНрдпрд╛рд╕рд╛рдареА etcd рдХрд┐рдВрд╡рд╛ ZooKeeper (рдзрдбреЗ 09тАУ10) рд╡рд╛рдкрд░реВрди PostgreSQL failover рдЪрд╛рд▓рд╡рддрд╛рдд.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ database рд╕рд╛рдареА рд▓рд┐рд╣реВрди рдареЗрд╡рд╛: sync рдХреА async, рдХрд┐рддреА synchronous рдкреНрд░рддреА, failover рдХреЛрдг рдард░рд╡рддреЛ, рдЖрдгрд┐ рдЬреБрдиреНрдпрд╛ leader рд▓рд╛ writes рдШреЗрдгреНрдпрд╛рдкрд╛рд╕реВрди рдХрд╕реЗ рд░реЛрдЦрд▓реЗ рдЬрд╛рддреЗ. рдордЧ failover drill рдЪрд╛рд▓рд╡рд╛ рдЖрдгрд┐ рдХрд╛рдп рд╣рд░рд╡рд▓реЗ рддреЗ рдореЛрдЬрд╛.
тПня╕П рдкреБрдвреЗ
рдПрдХрдЪ leader рдореНрд╣рдгрдЬреЗ bottleneck рдЖрдгрд┐ рдирд┐рд░реНрдгрдпрд╛рдЪреЗ рдПрдХрдЪ рдард┐рдХрд╛рдг. рджреБрд╕рд░рд╛ рдорд╛рд░реНрдЧ: рдЕрдиреЗрдХ рдкреНрд░рддреАрдВрд╡рд░ рд▓рд┐рд╣рд╛, рдЕрдиреЗрдХ рдкреНрд░рддреАрдВрдХрдбреВрди рд╡рд╛рдЪрд╛, рдЖрдгрд┐ рдЖрдХрдбреНрдпрд╛рдВрдирд╛рдЪ рд╣рдореА рджреЗрдК рджреНрдпрд╛ рдХреА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд░реНрд╡рд╛рдд рдирд╡реЗ рджрд┐рд╕реЗрд▓. Quorums.
git checkout lesson-06-quorums