ЁЯУП рдзрдбрд╛ 07 тАФ Consistency models: рдкреНрд░рддреНрдпреЗрдХ рдЬрдг рд╡рд╛рдЪрдгрд╛рд▒реНрдпрд╛рд▓рд╛ рдХрд╛рдп рд╡рдЪрди рджреЗрддреЛ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 07 ┬╖ рдорд╛рдЧреЗ: lesson-06-quorums ┬╖ рдкреБрдвреЗ: lesson-08-cap-pacelc
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ06, рдЕрдзрд┐рдХ data рдЪреНрдпрд╛ рдкреНрд░рддреА рдЕрд╕рддрд╛рдирд╛ рд╡рд╛рдЪрдгрд╛рд▒реНрдпрд╛рд▓рд╛ рдХрд╛рдп рд╡рдЪрди рдорд┐рд│рддреЗ рддреНрдпрд╛рдЪреА рдирд╛рд╡реЗ:
linearizable, sequential, causal, read-your-writes, monotonic reads рдЖрдгрд┐
eventual consistency тАФ рд╕рд░реНрд╡рд╛рдд рдордЬрдмреВрдд рдкрд╛рд╕реВрди рд╕рд░реНрд╡рд╛рдд рдХрдордХреБрд╡рдд рдкрд░реНрдпрдВрдд тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреА рдХрд┐рдВрдордд рдХрд╛рдп.
dist/demo.py рдордзрд▓реЗ models() рддреНрдпрд╛рдВрдЪреА рдпрд╛рджреА рджреЗрддреЗ; рдЦрд╛рд▓рдЪрд╛ snippet рдзрдбрд╛ 06 рдордзрд▓реЗ
QuorumStore рд╡рд╛рдкрд░реВрди рддреНрдпрд╛рдкреИрдХреА рджреЛрди рдЬрд╛рдгреВрдирдмреБрдЬреВрди рдореЛрдбрддреЛ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╕рдЧрд│реЗ рдПрдХрдЪ рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рддрд╛рдд: "Exam рдХреЛрдгрддреНрдпрд╛ рджрд┐рд╡рд╢реА рдЖрд╣реЗ?" рд╢рд╛рдЦрд╛ рдЙрддреНрддрд░рд╛рдмрджреНрджрд▓ рд╡реЗрдЧрд╡реЗрдЧрд│реА рд╡рдЪрдиреЗ рджреЗрдК рд╢рдХрддрд╛рдд.
- ЁЯеЗ "рдЬрдгреВ рдПрдХрдЪ рдиреЛрдВрджрд╡рд╣реА рдЖрд╣реЗ." рдПрдХрджрд╛ рдХреЛрдгреАрд╣реА "Tuesday" рдкрд╛рд╣рд┐рд▓реЗ рдХреА, рдХреБрдареЗрд╣реА рдХреЛрдгрд╛рд▓рд╛рдЪ рдкреБрдиреНрд╣рд╛ рдХрдзреАрдЪ "Monday" рджрд┐рд╕рдгрд╛рд░ рдирд╛рд╣реА. (linearizable)
- ЁЯеИ "рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рдмрджрд▓ рдПрдХрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ рджрд┐рд╕рддрд╛рдд." рдХрджрд╛рдЪрд┐рдд рдереЛрдбреЗ рдЙрд╢рд┐рд░рд╛, рдкрдг рдХрдзреАрдЪ рд╡реЗрдЧрд│реНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдирд╛рд╣реА. (sequential)
- ЁЯеЙ "рдХрд╛рд░рдг рдЖрдзреА, рдкрд░рд┐рдгрд╛рдо рдирдВрддрд░." рддреБрдореНрд╣реА "exam рдкреБрдвреЗ рдврдХрд▓рд▓реА" рд╣реА notice рдкрд╛рд╣рд┐рд▓реА рдЕрд╕реЗрд▓, рддрд░ рддреА рдЬреНрдпрд╛ рдирд╡реНрдпрд╛ timetable рдмрджреНрджрд▓ рдмреЛрд▓рддреЗ рддреЛрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рджрд┐рд╕реЗрд▓. (causal)
- ЁЯЩЛ "рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ рдмрджрд▓ рджрд┐рд╕рддреЛ." рджреАрдкрд┐рдХрд╛рдиреЗ notice рдмрджрд▓рд▓реА, рдореНрд╣рдгреВрди рджреАрдкрд┐рдХрд╛рд▓рд╛ рддрд┐рдЪрд╛ рдмрджрд▓ рдиреЗрд╣рдореА рджрд┐рд╕рддреЛ. рдЗрддрд░рд╛рдВрдирд╛ рдЕрдЬреВрди рдЬреБрдиреА рджрд┐рд╕реВ рд╢рдХрддреЗ. (read-your-writes)
- тПй "рдХрдзреАрдЪ рдорд╛рдЧрдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рдирд╛рд╣реА." рдХрддрд░рд┐рдирд╛рдиреЗ рдПрдХрджрд╛ Tuesday рдкрд╛рд╣рд┐рд▓реЗ рдХреА, рддрд┐рд▓рд╛ рдирдВрддрд░ Monday рджрд┐рд╕рдгрд╛рд░ рдирд╛рд╣реА. (monotonic reads)
- ЁЯМля╕П "рд╢реЗрд╡рдЯреА рд╕рдЧрд│реЗ рд╕рд╣рдордд рд╣реЛрддрд╛рдд." рд▓реЛрдХрд╛рдВрдиреА рдмрджрд▓ рдХрд░рдгреЗ рдерд╛рдВрдмрд╡рд▓реЗ рддрд░ рд╕рдЧрд│реНрдпрд╛ рдкреНрд░рддреА рдЬреБрд│рддреАрд▓ тАФ рдХрдзреАрддрд░реА. рддреЛрдкрд░реНрдпрдВрдд рдХрд╛рд╣реАрд╣реА рджрд┐рд╕реВ рд╢рдХрддреЗ. (eventual)
рдордЬрдмреВрдд рд╡рдЪрдиреЗ рдЫрд╛рди рдЕрд╕рддрд╛рдд. рддреНрдпрд╛рдВрдирд╛ рдЬрд╛рд╕реНрдд рдерд╛рдВрдмрд╛рд╡реЗ рд▓рд╛рдЧрддреЗ рдЖрдгрд┐ рдЬрд╛рд╕реНрдд рдирд┐рд░реЛрдкреЗ рд▓рд╛рдЧрддрд╛рдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart TB
lin["ЁЯеЗ linearizable<br/>one copy, real-time order"] --> seq["ЁЯеИ sequential<br/>one order for all, maybe late"]
seq --> cau["ЁЯеЙ causal<br/>cause before effect"]
cau --> ryw["ЁЯЩЛ read-your-writes<br/>you see your own change"]
cau --> mr["тПй monotonic reads<br/>never back in time"]
ryw --> ev["ЁЯМля╕П eventual<br/>copies agree when writes stop"]
mr --> ev
cost["тмЖя╕П stronger = more coordination<br/>more latency, less availability"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/distributed-systems/lesson-diagrams.html#l07
тЭУ рдХрд╛рдп
- Consistency model тАФ data store рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рд╡рд╛рдЪрдгрд╛рд░реЗ рдпрд╛рдВрдЪреНрдпрд╛рддрд▓рд╛ рдХрд░рд╛рд░: рдЬреЗ writes рдЭрд╛рд▓реЗ рддреЗ рдкрд╛рд╣рддрд╛, read рдХреЛрдгрддреНрдпрд╛ values рдкрд░рдд рджреЗрдК рд╢рдХрддреЛ.
- Linearizable (strong consistency, "atomic") тАФ рдкреНрд░рддреНрдпреЗрдХ operation рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рдд рдЖрдгрд┐ рд╢реЗрд╡рдЯ рдпрд╛рдВрдЪреНрдпрд╛рдордзрд▓реНрдпрд╛ рдПрдХрд╛ рдХреНрд╖рдгреА рдШрдбрд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ рджрд┐рд╕рддреЗ, рдЦрд▒реНрдпрд╛ рд╡реЗрд│реЗрд╢реА рдЬреБрд│рдгрд╛рд▒реНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ. рдПрдХрджрд╛ write рдкреВрд░реНрдг рдЭрд╛рд▓рд╛ рдХреА, рдирдВрддрд░рдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ read (рдХреЛрдгрд╛рдЪрд╛рд╣реА) рддреЛ рдХрд┐рдВрд╡рд╛ рддреНрдпрд╛рд╣реВрди рдирд╡реЗ рдХрд╛рд╣реАрддрд░реА рдкрд╛рд╣рддреЛ. рддреЗ рдЬрдгреВ рдПрдХрдЪ рдкреНрд░рдд рдЕрд╕рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ рд╡рд╛рдЧрддреЗ. CAP рдордзрд▓реЗ "C" рд╣реЗрдЪ (рдзрдбрд╛ 08).
- Sequential тАФ рд╕рдЧрд│реЗ nodes рд╕рдЧрд│реЗ operations рдПрдХрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ рдкрд╛рд╣рддрд╛рдд, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ client рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ operations рддреНрдпрд╛ client рдиреЗ рддреЗ рдЬреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рдХреЗрд▓реЗ рддреНрдпрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ рджрд┐рд╕рддрд╛рдд. Linearizable рдЪреНрдпрд╛ рдЙрд▓рдЯ, рддреЛ рдХреНрд░рдо рдЦрд▒реНрдпрд╛ рд╡реЗрд│реЗрд╢реА рдЬреБрд│рд╛рдпрд▓рд╛рдЪ рд╣рд╡рд╛ рдЕрд╕реЗ рдирд╛рд╣реА: read рдереЛрдбрд╛ рдорд╛рдЧреЗ рдЕрд╕реВ рд╢рдХрддреЛ.
- Causal тАФ causally related (рдзрдбрд╛ 03) operations рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рддреНрдпрд╛рдЪ рдХреНрд░рдорд╛рдиреЗ рджрд┐рд╕рддрд╛рдд. Concurrent operations рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ nodes рдирд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рджрд┐рд╕реВ рд╢рдХрддрд╛рдд. Network partition рджрд░рдореНрдпрд╛рди available рд░рд╛рд╣реВ рд╢рдХрдгрд╛рд░рд╛ рд╣рд╛ рд╕рд░реНрд╡рд╛рдд рдордЬрдмреВрдд model рдЖрд╣реЗ.
- Read-your-writes (read-your-own-writes) тАФ client рд▓рд╛ рдиреЗрд╣рдореА рддреНрдпрд╛рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдЖрдзреАрдЪреЗ writes рджрд┐рд╕рддрд╛рдд. рдЗрддрд░ clients рдирд╛ рдХрджрд╛рдЪрд┐рдд рдЕрдЬреВрди рдирд╛рд╣реА.
- Monotonic reads тАФ client рд▓рд╛ рдирд╡реА value рдкрд╛рд╣рд┐рд▓реНрдпрд╛рдирдВрддрд░ рдХрдзреАрдЪ рдЬреБрдиреА value рджрд┐рд╕рдд рдирд╛рд╣реА. рдПрдХрд╛рдЪ user рдЪреЗ reads рд╡реЗрдЧрд╡реЗрдЧрд│рд╛ lag рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ replicas рдХрдбреЗ рдЧреЗрд▓реЗ рдХреА рд╣реЗ рд╕рд╣рд╕рд╛ рдореЛрдбрддреЗ.
- Eventual тАФ writes рдерд╛рдВрдмрд▓реЗ рддрд░ рд╕рдЧрд│реНрдпрд╛ рдкреНрд░рддреА рдХрдзреАрддрд░реА рдПрдХрд╛рдЪ value рд╡рд░ рдпреЗрддрд╛рдд. рдХреЗрд╡реНрд╣рд╛ рдпрд╛рдЪреЗ рд╡рдЪрди рдирд╛рд╣реА, рдЖрдгрд┐ рдордзрд▓реНрдпрд╛ рдХрд╛рд│рд╛рдд read рдХрд╛рдп рдкрд░рдд рджреЗрдИрд▓ рдпрд╛рдЪреЗрд╣реА рд╡рдЪрди рдирд╛рд╣реА.
- Session guarantees тАФ read-your-writes, monotonic reads (рдЖрдгрд┐ рдЖрдгрдЦреА рджреЛрди: monotonic writes, writes-follow-reads) рд╣реА рдкреНрд░рддреНрдпреЗрдХ client session рд╕рд╛рдареАрдЪреА рд╡рдЪрдиреЗ рдЖрд╣реЗрдд; eventual consistency рд╡рд░ рддреА рдЬреЛрдбрдгреЗ рд╕реНрд╡рд╕реНрдд рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде рдПрдХрд╛ user рдЪреЗ reads рдПрдХрд╛рдЪ replica рдХрдбреЗ рдкрд╛рдард╡реВрди.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг "consistent" рдЪрд╛ рдЕрд░реНрде рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рд▓реЛрдХрд╛рдВрд╕рд╛рдареА рд╡реЗрдЧрд╡реЗрдЧрд│рд╛ рдЕрд╕рддреЛ, рдЖрдгрд┐ bugs рддреНрдпрд╛ рдлрд░рдХрд╛рдд рд░рд╛рд╣рддрд╛рдд. рдПрдЦрд╛рджреА item рджрд╛рдЦрд╡рдгрд╛рд░рд╛, рдордЧ рд▓рдкрд╡рдгрд╛рд░рд╛, рдордЧ рдкреБрдиреНрд╣рд╛ рджрд╛рдЦрд╡рдгрд╛рд░рд╛ cart monotonic reads рдореЛрдбрддреЛ. рдЖрдкрд▓реЗ profile save рдХрд░реВрди рдЬреБрдиреЗрдЪ profile рдкрд╛рд╣рдгрд╛рд░реА user read-your-writes рдореЛрдбрд▓реЗрд▓реЗ рдкрд╛рд╣рддреЗ. рджреЛрдирджрд╛ book рдЭрд╛рд▓реЗрд▓реА seat linearizability рдореЛрдбрддреЗ. рдкреНрд░рддреНрдпреЗрдХ data рдЪреНрдпрд╛ рддреБрдХрдбреНрдпрд╛рд▓рд╛ рдХреЛрдгрддреЗ рд╡рдЪрди рд╣рд╡реЗ рддреЗ рдирд╛рд╡ рджреНрдпрд╛, рдЖрдгрд┐ рдордЬрдмреВрдд рд╡рдЪрдирд╛рдВрдЪреА рдХрд┐рдВрдордд рдлрдХреНрдд рдЬрд┐рдереЗ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ рдЖрд╣реЗ рддрд┐рдереЗрдЪ рдореЛрдЬрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
dist/demo.py рдордзрд▓реЗ models() "exam рдХреЛрдгрддреНрдпрд╛ рджрд┐рд╡рд╢реА рдЖрд╣реЗ?" рд╕рд╛рдареА рдкрд╛рдЪ рд╡рдЪрдиреЗ print рдХрд░рддреЗ.
Snippet рдзрдбрд╛ 06 рдордзрд▓реЗ QuorumStore рд╡рд╛рдкрд░рддреЛ, рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреАрдВрдХрдбреВрди R = 1 reads рд╕рд╣:
рдлрдХреНрдд copy 0 рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪрд▓реЗрд▓рд╛ рдПрдХ write, рдордЧ copy 0 рдЖрдгрд┐ copy 2 рдХрдбреВрди reads. рдлрдХреНрдд рдЬрд┐рдереЗ
рд▓рд┐рд╣рд┐рд▓реЗ рддрд┐рдереВрдирдЪ рд╡рд╛рдЪрд▓реЗ рддрд░ read-your-writes рдорд┐рд│рддреЗ; рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рддреАрдВрдХрдбреВрди рд╡рд╛рдЪрд▓реЗ рддрд░ monotonic
reads рдореЛрдбрддреЗ; repair рд╕рд╣ R = 3 read рд╕рдЧрд│реНрдпрд╛ рдкреНрд░рддреА рдПрдХрддреНрд░ рдЖрдгрддреЛ (convergence).
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dist/demo.py models
python3 - <<'EOF'
import sys; sys.path.insert(0, "dist"); from sim import QuorumStore
s = QuorumStore(3); s.write(1, "Monday", 3)
s.write(2, "Tuesday", 1, reachable=[0]) # Dipika's change reached only copy 0
print("copies:", s.copies)
print("Dipika reads her own copy 0 тЖТ", s.read(1, order=[0], repair=False)[0], "(read-your-writes holds)")
print("Aishwarya reads copy 2 тЖТ", s.read(1, order=[2], repair=False)[0], "(eventual: stale for now)")
first = s.read(1, order=[0], repair=False)[0]
second = s.read(1, order=[2], repair=False)[0]
print(f"Katrina reads copy 0, then copy 2 тЖТ {first} then {second} (monotonic reads broken: time went backwards)")
print("R=3 read of all copies тЖТ", s.read(3, repair=True)[0], "┬╖ after repair:", s.copies)
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
models рд╣реЗ print рдХрд░рддреЗ:
тФАтФА the same question тАФ 'what is the exam day?' тАФ under different promises:
linearizable every read sees the latest completed write, as if there were one copy
sequential everyone sees the same order, maybe a little late
causal if you saw the cause (the change notice), you will see its effect (the new timetable)
read-your-writes Dipika always sees the change SHE made, others may lag
eventual copies agree when writes stop тАФ meanwhile anything goes
stronger promises cost coordination (latency, availability) тАФ pick per piece of data
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
copies: [(2, 'Tuesday'), (1, 'Monday'), (1, 'Monday')]
Dipika reads her own copy 0 тЖТ Tuesday (read-your-writes holds)
Aishwarya reads copy 2 тЖТ Monday (eventual: stale for now)
Katrina reads copy 0, then copy 2 тЖТ Tuesday then Monday (monotonic reads broken: time went backwards)
R=3 read of all copies тЖТ Tuesday ┬╖ after repair: [(2, 'Tuesday'), (2, 'Tuesday'), (2, 'Tuesday')]
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рддреНрдпрд╛рдЪ рддреАрди рдкреНрд░рддреАрдВрдиреА рддреАрди рд╡реЗрдЧрд╡реЗрдЧрд│реЗ рдЕрдиреБрднрд╡ рджрд┐рд▓реЗ. рджреАрдкрд┐рдХрд╛рд▓рд╛ read-your-writes рдорд┐рд│рд╛рд▓реЗ рддреЗ рдлрдХреНрдд рддрд┐рдиреЗ рдЬреНрдпрд╛ рдкреНрд░рддреАрд╡рд░ рд▓рд┐рд╣рд┐рд▓реЗ рддреАрдЪ рд╡рд╛рдЪрд▓реНрдпрд╛рдореБрд│реЗ тАФ рд╣реА рдПрдХ session рдпреБрдХреНрддреА рдЖрд╣реЗ, store рдЪрд╛ рдЧреБрдгрдзрд░реНрдо рдирд╛рд╣реА. рдХрддрд░рд┐рдирд╛рд▓рд╛ рд╡реЗрд│ рдорд╛рдЧреЗ рдЬрд╛рддрд╛рдирд╛ рджрд┐рд╕рд▓реА рдХрд╛рд░рдг рддрд┐рдЪреЗ рджреЛрди reads рджреЛрди рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреНрд░рддреАрдВрдХрдбреЗ рдЧреЗрд▓реЗ. рдЖрдгрд┐ store рддрд░реАрд╣реА "eventually consistent" рд╣реЛрддрд╛: repair рд╕рд╣ рдПрдХрд╛ рдкреВрд░реНрдг read рдиреЗ рд╕рдЧрд│реНрдпрд╛ рдкреНрд░рддреА рдЬреБрд│рд╡рд▓реНрдпрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдХреЛрдгрддрд╛ model рддреЗ рди рд╕рд╛рдВрдЧрддрд╛ "consistent" рдореНрд╣рдгрдгреЗ
- рдПрдХрд╛ user рдЪреЗ reads рд╡реЗрдЧрд╡реЗрдЧрд│рд╛ lag рдЕрд╕рд▓реЗрд▓реНрдпрд╛ replicas рдордзреНрдпреЗ load-balance рдХрд░рдгреЗ (monotonic reads рдореЛрдбрддреЗ)
- write рдирдВрддрд░ рд▓рдЧреЗрдЪ replica рдХрдбреВрди рд╡рд╛рдЪрдгреЗ (read-your-writes рдореЛрдбрддреЗ)
- рдЬрд┐рдереЗ eventual рдкреБрд░реЗрд╕реЗ рдЖрд╣реЗ рдЕрд╢рд╛ data рд╕рд╛рдареА (likes, view counts) linearizable reads рдЪреА рдХрд┐рдВрдордд рдореЛрдЬрдгреЗ
- setting рдЪреНрдпрд╛ рдирд╛рд╡рд╛рдд "strong" рдЖрд╣реЗ рдореНрд╣рдгреВрди store linearizable рдЖрд╣реЗ рдЕрд╕реЗ рдорд╛рдирдгреЗ тАФ рддреЗ рдХрд╛рдп рд╡рдЪрди рджреЗрддреЗ рддреЗ рд╡рд╛рдЪрд╛
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Amazon DynamoDB тАФ reads default рдиреБрд╕рд╛рд░ eventually consistent рдЕрд╕рддрд╛рдд. Strongly consistent read рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреА рдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ write рдЪрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд░рдд рджреЗрддреЛ. On a real account:
aws dynamodb get-item --table-name notices \
--key '{"id": {"S": "exam"}}' --consistent-read
Strongly consistent read рд▓рд╛ eventually consistent read рдЪреНрдпрд╛ рджреБрдкреНрдкрдЯ read capacity рд▓рд╛рдЧрддреЗ,
рдЖрдгрд┐ рддреЗ global secondary indexes рд╡рд░ рдЙрдкрд▓рдмреНрдз рдирд╛рд╣реА. query рдЖрдгрд┐ scan рд╕реБрджреНрдзрд╛
--consistent-read рдШреЗрддрд╛рдд.
PostgreSQL replicas рд╕рд╣ read-your-writes тАФ user рдиреЗ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рдирдВрддрд░, рдереЛрдбреНрдпрд╛ рд╡реЗрд│рд╛рд╕рд╛рдареА рддрд┐рдЪреЗ reads primary рдХрдбреЗ рдкрд╛рдард╡рд╛; рдХрд┐рдВрд╡рд╛ рддрд┐рдЪреНрдпрд╛ write рдирдВрддрд░ primary рдЪреА WAL position рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛ рдЖрдгрд┐ replica рдиреЗ рддрд┐рдердкрд░реНрдпрдВрдд replay рдХреЗрд▓реНрдпрд╛рд╡рд░рдЪ рддреНрдпрд╛ replica рдХрдбреВрди рд╡рд╛рдЪрд╛:
-- on the primary, after the write:
SELECT pg_current_wal_lsn(); -- for example 0/3000148, kept in her session
-- on a replica, before reading:
SELECT pg_last_wal_replay_lsn() >= '0/3000148'::pg_lsn; -- true тЖТ safe to read here
Monotonic reads тАФ рдПрдХрд╛ user рдЪреЗ reads рдПрдХрд╛рдЪ replica рд▓рд╛ "sticky" рдХрд░рд╛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, user ID рдЪреНрдпрд╛ hash рдиреЗ replica рдирд┐рд╡рдбрд╛), рдореНрд╣рдгрдЬреЗ рддреА рдХрдзреАрдЪ рдЬрд╛рд╕реНрдд рдорд╛рдЧреЗ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреАрдХрдбреЗ рдЙрдбреА рдорд╛рд░рдд рдирд╛рд╣реА.
Linearizable reads тАФ etcd reads default рдиреБрд╕рд╛рд░ linearizable рдЕрд╕рддрд╛рдд (leader рдЖрдзреА рдЦрд╛рддреНрд░реА рдХрд░рддреЛ рдХреА
рддреЛ рдЕрдЬреВрди leader рдЖрд╣реЗ); etcdctl get --consistency=s local member рдХрдбреВрди рдЬрд▓рдж, рдХрджрд╛рдЪрд┐рдд рдЬреБрдирд╛
serializable read рдорд╛рдЧрддреЗ. QUORUM reads рдЖрдгрд┐ writes рд╕рд╣ Cassandra
рд╕рд░реНрд╡рд╛рдд рдирд╡реНрдпрд╛ value рдЪреЗ reads рджреЗрддреЗ (рдзрдбрд╛ 06), рдкрдг рдкреВрд░реНрдг linearizability рдирд╛рд╣реА; рддреНрдпрд╛рд╕рд╛рдареА рддреНрдпрд╛рдЪреЗ lightweight
transactions (INSERT ... IF NOT EXISTS) Paxos рд╡рд╛рдкрд░рддрд╛рдд.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рддреБрдордЪреНрдпрд╛ data рдЪреЗ рдПрдХ table рдмрдирд╡рд╛ тАФ balances, seats, profiles, carts, counters тАФ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рд▓рд╛ рдЪрд╛рд▓реВ рд╢рдХреЗрд▓ рдЕрд╕рд╛ рд╕рд░реНрд╡рд╛рдд рдХрдордХреБрд╡рдд model рд▓рд┐рд╣рд╛. рдордЧ store рдЖрдгрд┐ read path рддреЛ рдЦрд░реЛрдЦрд░ рджреЗрддрд╛рдд рдХрд╛ рддреЗ рддрдкрд╛рд╕рд╛.
тПня╕П рдкреБрдвреЗ
рдордЬрдмреВрдд models рд╕рд╛рдареА рдкреНрд░рддреАрдВрдирд╛ рдПрдХрдореЗрдХрд╛рдВрд╢реА рдмреЛрд▓рд╛рд╡реЗ рд▓рд╛рдЧрддреЗ. рддреНрдпрд╛рдВрдЪреНрдпрд╛рдордзрд▓рд╛ рд░рд╕реНрддрд╛ рддреБрдЯрд▓рд╛ рддрд░? рдордЧ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд┐рд╡рдбрд╛рд╡реЗ рд▓рд╛рдЧрддреЗ: рдирдХрд╛рд░ рджреНрдпрд╛рдпрдЪрд╛, рдХреА рдХрджрд╛рдЪрд┐рдд рдЬреБрдиреЗ рдЕрд╕рд▓реЗрд▓реЗ рдХрд╛рд╣реАрддрд░реА рдЙрддреНрддрд░ рджреНрдпрд╛рдпрдЪреЗ. CAP рдЖрдгрд┐ PACELC.
git checkout lesson-08-cap-pacelc