ЁЯСС рдзрдбрд╛ 09 тАФ Consensus & Raft: рдПрдХ leader, рдПрдХ log
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧреЗ: lesson-08-cap-pacelc ┬╖ рдкреБрдвреЗ: lesson-10-locks-leases
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08, рдЖрдгрд┐ рднрд╛рдЧ 3 рд╕реБрд░реВ рд╣реЛрддреЛ: рдПрдХрдордд. Consensus рдЕрдиреЗрдХ nodes рдирд╛ рдПрдХрд╛ value рд╡рд░
рдПрдХрдордд рдХрд░рд╛рдпрд▓рд╛ рд▓рд╛рд╡рддреЗ тАФ рдЗрдереЗ, рдПрдХ leader рдЖрдгрд┐ рдмрджрд▓рд╛рдВрдЪрд╛ рдПрдХ log тАФ рдХрд╛рд╣реА nodes рдмрдВрдж рдЕрд╕рд▓реНрдпрд╛
рдХрд┐рдВрд╡рд╛ рддреБрдЯрд▓реЗрд▓реНрдпрд╛ рдЕрд╕рд▓реНрдпрд╛ рддрд░реАрд╣реА. Raft рд╣реЗ terms, randomized election timeouts,
RequestVote, majorities, AppendEntries рдЖрдгрд┐ commit index рд╡рд╛рдкрд░реВрди рдХрд░рддреЗ.
dist/demo.py рдордзреАрд▓ raft() рдЖрдгрд┐ dist/sim.py рдордзреАрд▓ Raft.
тЪая╕П Lab рдордзреАрд▓
Raftрд╣реЗ рдПрдХ рд╕реЛрдкреЗ рдХреЗрд▓реЗрд▓реЗ model рдЖрд╣реЗ: рдмрд╣реБрдорддрд╛рдЪрд╛ рдирд┐рдпрдо рджрд╛рдЦрд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреЗ рдорддреЗ рдЖрдгрд┐ рдкреНрд░рддреА рдореЛрдЬрддреЗ. рддреНрдпрд╛рдд timers рдирд╛рд╣реАрдд, рдкреНрд░рддреНрдпреЗрдХ node рдЪреЗ рд╡реЗрдЧрд│реЗ logs рдирд╛рд╣реАрдд, рдЖрдгрд┐ рдордд рджреЗрддрд╛рдирд╛ log рдЪреА рддрдкрд╛рд╕рдгреА рдирд╛рд╣реА. рдЦрд▒реНрдпрд╛ Raft рдордзреНрдпреЗ рд╣реЗ рддрд┐рдиреНрд╣реА рдЕрд╕рддрд╛рдд; рддреНрдпрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдЦрд╛рд▓реА рджрд┐рд▓реЗ рдЖрд╣реЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдЖрддрд╛ рдкрд╛рдЪ рд╢рд╛рдЦрд╛ рдЖрд╣реЗрдд: рдкреБрдгреЗ, рдирд╛рд╢рд┐рдХ, рдирд╛рдЧрдкреВрд░, рдХреЛрд▓реНрд╣рд╛рдкреВрд░ рдЖрдгрд┐ рд╕рд╛рддрд╛рд░рд╛. рддреНрдпрд╛рдВрдирд╛ рдкреНрд░рддреНрдпреЗрдХ рдмрджрд▓рд╛рдЪрд╛ рдХреНрд░рдо рдард░рд╡рдгрд╛рд░реЗ рдПрдХ рдореБрдЦреНрдп office рд╣рд╡реЗ рдЖрд╣реЗ. ЁЯСС
рдирд┐рдпрдо: рдПрдЦрд╛рджреА рд╢рд╛рдЦрд╛ рдореБрдЦреНрдп office рддреЗрд╡реНрд╣рд╛рдЪ рдмрдирддреЗ рдЬреЗрд╡реНрд╣рд╛ рдмрд╣реБрдордд тАФ 5 рдкреИрдХреА 3 тАФ рддрд┐рд▓рд╛ рдордд рджреЗрддрд╛рдд. рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд╡рдбрдгреВрдХ рдлреЗрд░реАрдд рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдПрдХрджрд╛рдЪ рдордд рджреЗрддреЗ. рдкреНрд░рддреНрдпреЗрдХ рдлреЗрд░реАрд▓рд╛ рдПрдХ рдХреНрд░рдорд╛рдВрдХ рдЕрд╕рддреЛ, рддреЛ рдореНрд╣рдгрдЬреЗ term.
рдирд╛рд╢рд┐рдХ term 1 рдордзреНрдпреЗ рдорддреЗ рдорд╛рдЧрддреЗ. рдкрд╛рдЪрд╣реА рдЬрдг рд╣реЛрдХрд╛рд░ рджреЗрддрд╛рдд. рдирд╛рд╢рд┐рдХ рдореБрдЦреНрдп office рдмрдирддреЗ. ЁЯОЙ
рдЖрддрд╛ рдирд╛рд╢рд┐рдХ "exam рдордВрдЧрд│рд╡рд╛рд░реА" рдЕрд╕реЗ рд▓рд┐рд╣рд┐рддреЗ рдЖрдгрд┐ рддреЗ рдЗрддрд░рд╛рдВрдирд╛ рдкрд╛рдард╡рддреЗ. 5 рдкреИрдХреА 3 рдЬрдгрд╛рдВрдиреА (рдирд╛рд╢рд┐рдХ рдЖрдгрд┐ рдЖрдгрдЦреА рджреЛрди) рддреЗ рд▓рд┐рд╣реВрди рдШреЗрддрд▓реЗ рдХреА рддреЗ committed рд╣реЛрддреЗ тАФ рдЕрдВрддрд┐рдо, рдХрдзреАрдЪ рдорд╛рдЧреЗ рди рдШреЗрддрд▓реЗ рдЬрд╛рдгрд╛рд░реЗ.
рдордЧ рд╡рд╛рджрд│ рд░рд╕реНрддрд╛ рддреЛрдбрддреЗ: рдПрдХрд╛ рдмрд╛рдЬреВрд▓рд╛ {рдирд╛рд╢рд┐рдХ, рдкреБрдгреЗ}, рджреБрд╕рд▒реНрдпрд╛ рдмрд╛рдЬреВрд▓рд╛ {рдирд╛рдЧрдкреВрд░, рдХреЛрд▓реНрд╣рд╛рдкреВрд░, рд╕рд╛рддрд╛рд░рд╛}.
- рдирд╛рд╢рд┐рдХрдЪреА рдмрд╛рдЬреВ рдорддреЗ рдорд╛рдЧрддреЗ: рдлрдХреНрдд 2. рдмрд╣реБрдордд рдирд╛рд╣реА. рддрд┐рдереЗ рдореБрдЦреНрдп office рдирд╛рд╣реА.
- рдирд╛рдЧрдкреВрд░рдЪреА рдмрд╛рдЬреВ рдорд╛рдЧрддреЗ: 3 рдорддреЗ. рдирд╛рдЧрдкреВрд░ term 3 рд╕рд╛рдареА рдореБрдЦреНрдп office рдмрдирддреЗ.
5 рдкреИрдХреА 3 рдЪреЗ рдХреЛрдгрддреЗрд╣реА рджреЛрди рдЧрдЯ рдХрд┐рдорд╛рди рдПрдХ рд╢рд╛рдЦрд╛ рд╡рд╛рдЯреВрди рдШреЗрддрд╛рддрдЪ. рдореНрд╣рдгреВрди рдПрдХрд╛рдЪ term рдордзреНрдпреЗ рдХрдзреАрдЪ рджреЛрди рдореБрдЦреНрдп offices рдЕрд╕реВ рд╢рдХрдд рдирд╛рд╣реАрдд. рд▓рд╣рд╛рди рдмрд╛рдЬреВрд▓рд╛ рдерд╛рдВрдмрд╛рд╡реЗ рд▓рд╛рдЧрддреЗ. тП│
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph minority["2 of 5 тАФ cannot elect or commit"]
na["ЁЯПл Nashik<br/>term 2: got 2/5"]
pu["ЁЯПл Pune"]
end
subgraph majority["3 of 5 тАФ can elect"]
ng["ЁЯСС Nagpur<br/>term 3: elected 3/5"]
ko["ЁЯПл Kolhapur"]
sa["ЁЯПл Satara"]
end
na -.-x|"тЬВя╕П road cut"| ng
ng -->|"AppendEntries"| ko
ng -->|"AppendEntries"| sa
ЁЯЧ║я╕П рд░реЗрдЦрд╛рдЯрд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/distributed-systems/lesson-diagrams.html#l09
тЭУ рдХрд╛рдп
- Consensus тАФ nodes рдЪреНрдпрд╛ рдЧрдЯрд╛рд▓рд╛ рдПрдХрд╛ value рд╡рд░ рдПрдХрдордд рдХрд░рд╛рдпрд▓рд╛ рд▓рд╛рд╡рдгреЗ (рдЖрдгрд┐ рддреА рдХрдзреАрдЪ рди рдмрджрд▓рдгреЗ), рдХрд╛рд╣реА nodes crash рдЭрд╛рд▓реНрдпрд╛ рдХрд┐рдВрд╡рд╛ messages рд╣рд░рд╡рд▓реЗ рддрд░реАрд╣реА. Log рдЕрд╕реЗрд▓ рддрд░ рддреЗ рдкреНрд░рддреНрдпреЗрдХ slot рдордзреАрд▓ value рд╡рд░ рдПрдХрдордд рдХрд░рддрд╛рдд: рдмрджрд▓рд╛рдВрдЪрд╛ рдПрдХ рдХреНрд░рдо. рдкреНрд░рддреНрдпреЗрдХ node рддреЛ log рдЖрдкрд▓реНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдкреНрд░рддреАрд╡рд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ тАФ рд╣реАрдЪ replicated state machine.
- Raft (Diego Ongaro рдЖрдгрд┐ John Ousterhout, 2014) тАФ рд╕рдордЬрд╛рдпрд▓рд╛ рд╕реЛрдкрд╛ рдЕрд╕рд╛рд╡рд╛ рдореНрд╣рдгреВрди design рдХреЗрд▓реЗрд▓рд╛ consensus algorithm. рдкреНрд░рддреНрдпреЗрдХ node рдПрдХрддрд░ follower, candidate рдХрд┐рдВрд╡рд╛ leader рдЕрд╕рддреЗ.
- Term тАФ рдлрдХреНрдд рд╡рд╛рдврдд рдЬрд╛рдгрд╛рд░рд╛ рдХреНрд░рдорд╛рдВрдХ; рдкреНрд░рддреНрдпреЗрдХ term рдордзреНрдпреЗ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдПрдХрдЪ leader рдЕрд╕рддреЛ. рдкреНрд░рддреНрдпреЗрдХ message рдордзреНрдпреЗ рдкрд╛рдард╡рдгрд╛рд▒реНрдпрд╛рдЪрд╛ term рдЕрд╕рддреЛ; рдореЛрдард╛ term рдкрд╛рд╣рдгрд╛рд░реА node follower рдмрдирддреЗ рдЖрдгрд┐ рддреЛ term рд╕реНрд╡реАрдХрд╛рд░рддреЗ.
- Randomized election timeout тАФ рдЬреНрдпрд╛ follower рд▓рд╛ рдЖрдкрд▓реНрдпрд╛ election timeout рдЗрддрдХреНрдпрд╛ рдХрд╛рд│рд╛рдд (рдПрдХ random value, рдЙрджрд╛. Raft paper рдордзреНрдпреЗ 150тАУ300 ms) leader рдХрдбреВрди рдХрд╛рд╣реАрдЪ рдРрдХреВ рдпреЗрдд рдирд╛рд╣реА, рддреА candidate рдмрдирддреЗ. Random timeouts рдореБрд│реЗ рджреЛрди candidates рдПрдХрд╛рдЪ рд╡реЗрд│реА рд╕реБрд░реВ рд╣реЛрдКрди рдорддреЗ рд╡рд┐рднрд╛рдЧрдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдХрдореА рд╣реЛрддреЗ.
- RequestVote тАФ candidate term рдордзреНрдпреЗ 1 рдорд┐рд│рд╡рддреЗ, рд╕реНрд╡рддрдГрд▓рд╛ рдордд рджреЗрддреЗ, рдЖрдгрд┐ рдЗрддрд░рд╛рдВрдирд╛ рдорд╛рдЧрддреЗ. рдкреНрд░рддреНрдпреЗрдХ node рдкреНрд░рддреНрдпреЗрдХ term рдордзреНрдпреЗ рдЬрд╛рд╕реНрддреАрдд рдЬрд╛рд╕реНрдд рдПрдХ рдордд рджреЗрддреЗ, рдЖрдгрд┐ рддреЗрд╣реА рдлрдХреНрдд рдЬреНрдпрд╛ candidate рдЪрд╛ log рддрд┐рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ log рдЗрддрдХрд╛ рддрд░реА рдЕрджреНрдпрдпрд╛рд╡рдд рдЖрд╣реЗ рддрд┐рд▓рд╛рдЪ (рдЖрдзреА рд╢реЗрд╡рдЯрдЪреНрдпрд╛ entry рдЪрд╛ term рддреБрд▓рдирд╛ рдХрд░рд╛, рдордЧ log рдЪреА рд▓рд╛рдВрдмреА).
- Majority тАФ candidate рд╕рд░реНрд╡ nodes рдЪреНрдпрд╛ рдЕрд░реНрдзреНрдпрд╛рд╣реВрди рдЬрд╛рд╕реНрдд рдорддрд╛рдВрдиреА рдЬрд┐рдВрдХрддреЗ тАФ рддреА рдкреЛрд╣реЛрдЪреВ рд╢рдХрддреЗ рддреНрдпрд╛ nodes рдЪреНрдпрд╛ рдЕрд░реНрдзреНрдпрд╛рд╣реВрди рдирд╡реНрд╣реЗ. 5 nodes рдирд╛ 3 рд╣рд╡реЗ; 3 nodes рдирд╛ 2; 4 nodes рдирд╛ 3. 2f + 1 nodes рдЪрд╛ cluster f failures рдордзреНрдпреЗ рдЯрд┐рдХрддреЛ (3 тЖТ 1, 5 тЖТ 2). рд╕рдо рд╕рдВрдЦреНрдпрд╛ рдХреЛрдгрддреАрд╣реА рдЬрд╛рд╕реНрдд рд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рджреЗрдд рдирд╛рд╣реА: 4 nodes рд╕реБрджреНрдзрд╛ рдлрдХреНрдд 1 рдордзреНрдпреЗрдЪ рдЯрд┐рдХрддрд╛рдд.
- AppendEntries тАФ leader рдирд╡реНрдпрд╛ log entries followers рдирд╛ рдкрд╛рдард╡рддреЛ (рдЖрдгрд┐ рд░рд┐рдХрд╛рдореНрдпрд╛ entries heartbeats рдореНрд╣рдгреВрди, рдзрдбрд╛ 04). Follower рддреЗрд╡реНрд╣рд╛рдЪ рд╕реНрд╡реАрдХрд╛рд░рддреЗ рдЬреЗрд╡реНрд╣рд╛ рдирд╡реНрдпрд╛ entries рдЪреНрдпрд╛ рдЕрдЧрджреА рдЖрдзреАрдЪреНрдпрд╛ entry рд╡рд░ рддрд┐рдЪрд╛ log leader рдЪреНрдпрд╛ log рд╢реА рдЬреБрд│рддреЛ; рдирд╛рд╣реАрддрд░ leader рдорд╛рдЧреЗ рд╕рд░рдХрддреЛ рдЖрдгрд┐ рд░рд┐рдХрд╛рдореА рдЬрд╛рдЧрд╛ рднрд░рддреЛ.
- Commit index тАФ leader рдиреЗ entry рдмрд╣реБрдорддрд╛рд╡рд░ рд╕рд╛рдард╡рд▓реА рдХреА рддреА committed рд╣реЛрддреЗ. Committed entries рдХрдзреАрдЪ рд╣рд░рд╡рдд рдирд╛рд╣реАрдд рдЖрдгрд┐ state machine рд╡рд░ рд▓рд╛рдЧреВ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд. (рдПрдХ рдмрд╛рд░рдХрд╛рд╡рд╛: leader рдЕрд╢рд╛ рдкреНрд░рдХрд╛рд░реЗ replicas рдлрдХреНрдд рддреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ term рдордзреАрд▓ entries рд╕рд╛рдареАрдЪ рдореЛрдЬрддреЛ.)
- Leader completeness тАФ рдирдВрддрд░рдЪреНрдпрд╛ term рдордзреАрд▓ рдХреЛрдгрддреНрдпрд╛рд╣реА leader рдХрдбреЗ рдкреНрд░рддреНрдпреЗрдХ committed entry рдЖрдзреАрдЪ рдЕрд╕рддреЗ. рдХрд╛: committed entry рдмрд╣реБрдорддрд╛рд╡рд░ рдЕрд╕рддреЗ; рдЬрд┐рдВрдХрдгрд╛рд▒реНрдпрд╛рд▓рд╛ рдмрд╣реБрдорддрд╛рдЪреА рдорддреЗ рд▓рд╛рдЧрддрд╛рдд; рд╣реА рджреЛрди рдмрд╣реБрдорддреЗ рдПрдХ node рд╡рд╛рдЯреВрди рдШреЗрддрд╛рдд; рддреА node рдлрдХреНрдд рдЕрд╢рд╛рдЪ candidate рд▓рд╛ рдордд рджреЗрддреЗ рдЬрд┐рдЪрд╛ log рддрд┐рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ log рдЗрддрдХрд╛ рддрд░реА рдЕрджреНрдпрдпрд╛рд╡рдд рдЖрд╣реЗ.
- FLP (Fischer, Lynch рдЖрдгрд┐ Paterson, 1985) тАФ рдкреВрд░реНрдгрдкрдгреЗ asynchronous network рдордзреНрдпреЗ рдПрдХрд╣реА crash рдЕрд╕реЗрд▓ рддрд░ рдХреЛрдгрддрд╛рд╣реА deterministic algorithm consensus рдкреВрд░реНрдг рд╣реЛрдИрд▓ рдпрд╛рдЪреА рд╣рдореА рджреЗрдК рд╢рдХрдд рдирд╛рд╣реА. Raft рдиреЗрд╣рдореА рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╛рд╣рддреЛ рдЖрдгрд┐ timing рдкреБрд░реЗрд╕реЗ рдЪрд╛рдВрдЧрд▓реЗ рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ (timeouts рддреНрдпрд╛рдВрдЪреЗ рдХрд╛рдо рдХрд░рддрд╛рдд) рдкреВрд░реНрдг рд╣реЛрддреЛ.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг "leader рдХреЛрдг?" рдЖрдгрд┐ "рдмрджрд▓рд╛рдВрдЪрд╛ рдХреНрд░рдо рдХрд╛рдп?" рд╣реЗрдЪ рдкреНрд░рд╢реНрди failover (рдзрдбрд╛ 05), locks (рдзрдбрд╛ 10) рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ CP system (рдзрдбрд╛ 08) рдпрд╛рдВрдЪреНрдпрд╛рдорд╛рдЧреЗ рдЖрд╣реЗрдд. рдлрдХреНрдд heartbeat рдиреЗ рддреНрдпрд╛рдВрдЪреА рдЙрддреНрддрд░реЗ рджрд┐рд▓реА рддрд░ split brain рд╣реЛрддреЛ. рдмрд╣реБрдордд рдЖрдгрд┐ terms рдиреЗ рдЙрддреНрддрд░реЗ рджрд┐рд▓реА, рддрд░ рдЕрд▓реНрдкрд╕рдВрдЦреНрдп рдмрд╛рдЬреВ рдХрд╛рд╣реАрд╣реА рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА тАФ рддреНрдпрд╛рдЪреА рдХрд┐рдВрдордд рдореНрд╣рдгрдЬреЗ рддреА рдерд╛рдВрдмрддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
dist/sim.py рдордзреАрд▓ Raft(nodes) term, leader рдЖрдгрд┐ log рдареЗрд╡рддреЗ.
elect(candidate, alive) term рдордзреНрдпреЗ 1 рдорд┐рд│рд╡рддреЗ рдЖрдгрд┐ alive nodes рдирд╛ рдорддреЗ рдореНрд╣рдгреВрди рдореЛрдЬрддреЗ; рддреА
len(votes) > len(nodes) // 2 рдЕрд╕реЗрд▓ рддрд░ рдЬрд┐рдВрдХрддреЗ тАФ рд╕рд░реНрд╡ nodes рдЪреЗ рдмрд╣реБрдордд. append(entry, reached) entry log рдордзреНрдпреЗ рдЬреЛрдбрддреЗ рдЖрдгрд┐ reached followers рдЖрдгрд┐ leader рдорд┐рд│реВрди рдмрд╣реБрдордд рд╣реЛрдд рдЕрд╕реЗрд▓ рддрд░
'committed' рдкрд░рдд рдХрд░рддреЗ. рд╕реЛрдкреЗ рдХреЗрд▓реЗрд▓реЗ рднрд╛рдЧ: рдкреНрд░рддреНрдпреЗрдХ alive node рд╣реЛрдХрд╛рд░ рджреЗрддреЗ (log рдЪреА рддрдкрд╛рд╕рдгреА рдирд╛рд╣реА,
рдкреНрд░рддреНрдпреЗрдХ term рдордзреНрдпреЗ рдПрдХ рдордд рдпрд╛рдЪреА рдиреЛрдВрдж рдирд╛рд╣реА), рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ node рдЪрд╛ рд╡реЗрдЧрд│рд╛ log рдирд╕реВрди рдПрдХрдЪ рд╕рд╛рдорд╛рдпрд┐рдХ log рдЖрд╣реЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dist/demo.py raft
python3 - <<'EOF'
import sys; sys.path.insert(0, "dist"); from sim import Raft
for nodes, alive in ((3, 2), (4, 2), (4, 3), (5, 2), (5, 3), (6, 3), (7, 4)):
r = Raft([f"b{i}" for i in range(nodes)])
print(f"{nodes} nodes, {alive} reachable тЖТ " + r.elect("b0", alive={f"b{i}" for i in range(alive)}))
r = Raft(["pune", "nashik", "nagpur", "kolhapur"])
print("4 nodes split 2 | 2:", r.elect("pune", {"pune", "nashik"}), "┬╖", r.elect("nagpur", {"nagpur", "kolhapur"}))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
raft рд╣реЗ print рдХрд░рддреЗ:
тФАтФА 5 branches run Raft; a leader needs a majority of ALL 5 (3 votes)
term 1: nashik elected with 5/5 votes
append 'exam on Tuesday', copied to pune + nagpur тЖТ committed тАФ 3 of 5 with the leader
append 'trip on Friday', copied to pune only тЖТ not committed (no majority) тАФ only 2 of 5
тФАтФА the road splits: {nashik, pune} | {nagpur, kolhapur, satara}
term 2: nashik got 2/5 тАФ no majority, no leader
term 3: nagpur elected with 3/5 votes
the minority side cannot elect or commit тАФ so there are never two leaders in the same term
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
3 nodes, 2 reachable тЖТ term 1: b0 elected with 2/3 votes
4 nodes, 2 reachable тЖТ term 1: b0 got 2/4 тАФ no majority, no leader
4 nodes, 3 reachable тЖТ term 1: b0 elected with 3/4 votes
5 nodes, 2 reachable тЖТ term 1: b0 got 2/5 тАФ no majority, no leader
5 nodes, 3 reachable тЖТ term 1: b0 elected with 3/5 votes
6 nodes, 3 reachable тЖТ term 1: b0 got 3/6 тАФ no majority, no leader
7 nodes, 4 reachable тЖТ term 1: b0 elected with 4/7 votes
4 nodes split 2 | 2: term 1: pune got 2/4 тАФ no majority, no leader ┬╖ term 2: nagpur got 2/4 тАФ no majority, no leader
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдЕрд░реНрдзреЗ рдореНрд╣рдгрдЬреЗ рдмрд╣реБрдордд рдирд╡реНрд╣реЗ: 4 рдкреИрдХреА 2 рдЖрдгрд┐ 6 рдкреИрдХреА 3 рдХреЛрдгрд╛рд▓рд╛рдЪ рдирд┐рд╡рдбрдд рдирд╛рд╣реАрдд. рдореНрд╣рдгреВрди 2 | 2 рдЕрд╕рд╛ рдлреБрдЯрд▓реЗрд▓реНрдпрд╛ 4-node cluster рдордзреНрдпреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рдмрд╛рдЬреВрд▓рд╛ leader рдирд╕рддреЛ тАФ 3 nodes рдкреЗрдХреНрд╖рд╛рд╣реА рд╡рд╛рдИрдЯ, рдЬреЗ 2 рд╕рд╣ рддрд░реАрд╣реА рдирд┐рд╡рдб рдХрд░рддрд╛рдд. рдореНрд╣рдгреВрдирдЪ clusters рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпреЗрдЪреЗ рдЕрд╕рддрд╛рдд. рдЖрдгрд┐ "trip on Friday", рдЬреЗ рдлрдХреНрдд 5 рдкреИрдХреА 2 рдХрдбреЗ рд╣реЛрддреЗ, рддреЗ committed рдЭрд╛рд▓реЗ рдирд╛рд╣реА: рдирд╡реНрдпрд╛ leader рдХрдбреЗ рддреЗ рдирд╕реВ рд╢рдХрддреЗ, рдореНрд╣рдгреВрди рдХреЛрдгреАрд╣реА рддреЗ рдЕрдВрддрд┐рдо рдорд╛рдиреВ рдирдпреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрд╕рд╛рдареА" рд╕рдо рд╕рдВрдЦреНрдпреЗрдЪрд╛ cluster тАФ 4 nodes рдлрдХреНрдд 1 failure рд╕рд╣рди рдХрд░рддрд╛рдд, 3 рдЗрддрдХреЗрдЪ
- рдПрдХрдЪ consensus cluster рд╣рд│реВ links рд╡рд░ рдкрд╕рд░рд╡рдгреЗ, рддреНрдпрд╛рдореБрд│реЗ рдкреНрд░рддреНрдпреЗрдХ write рд╕рд░реНрд╡рд╛рдд рд╣рд│реВ рдмрд╣реБрдорддрд╛рд╕рд╛рдареА рдерд╛рдВрдмрддреЛ
- "leader рдиреЗ рд▓рд┐рд╣рд┐рд▓реЗ" рдореНрд╣рдгрдЬреЗ "committed" рдЕрд╕реЗ рдорд╛рдирдгреЗ
- рдХреЛрдгрддреНрдпрд╛рд╣реА member рдХрдбреВрди рд╡рд╛рдЪреВрди рд╕рд░реНрд╡рд╛рдд рдирд╡реА value рдЕрдкреЗрдХреНрд╖рд┐рдд рдзрд░рдгреЗ тАФ linearizable read рдорд╛рдЧрд╛
- production рд╕рд╛рдареА рд╕реНрд╡рддрдГрдЪрд╛ consensus algorithm рд▓рд┐рд╣рд┐рдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
etcd (Kubernetes рдорд╛рдЧрдЪреЗ store) Raft рдЪрд╛рд▓рд╡рддреЗ. On a real account, рдкреНрд░рддреНрдпреЗрдХ member, leader рдЖрдгрд┐ рд╕рдзреНрдпрд╛рдЪрд╛ term рдкрд╛рд╣рд╛:
etcdctl --endpoints=http://pune:2379,http://nashik:2379,http://nagpur:2379 endpoint status -w table
# columns include: ENDPOINT ┬╖ IS LEADER ┬╖ RAFT TERM ┬╖ RAFT INDEX ┬╖ RAFT APPLIED INDEX
etcdctl --endpoints=http://pune:2379 member list -w table
etcdctl --endpoints=http://pune:2379 put exam-day Tuesday # OK only once a majority has it
etcdctl --endpoints=http://pune:2379 move-leader 8211f1d0f64f3269 # hand leadership to another member (by ID)
ZooKeeper рдЕрд╕рд╛рдЪ рдПрдХ protocol рд╡рд╛рдкрд░рддреЛ, ZAB (ZooKeeper Atomic Broadcast): рдирд┐рд╡рдбрд▓реЗрд▓рд╛
leader, epochs (terms рд╕рд╛рд░рдЦреЗ), рдЖрдгрд┐ quorum (рдмрд╣реБрдордд) рдиреЗ рдорд╛рдиреНрдп рдХреЗрд▓реНрдпрд╛рд╡рд░ write committed
рд╣реЛрддреЛ. zkCli.sh рдЖрдгрд┐ echo srvr | nc nashik 2181 рдкреНрд░рддреНрдпреЗрдХ server рдЪрд╛ mode рджрд╛рдЦрд╡рддрд╛рдд
(leader рдХрд┐рдВрд╡рд╛ follower).
Kafka рдиреЗ ZooKeeper рдРрд╡рдЬреА KRaft рдЖрдгрд▓реЗ тАФ controller nodes рдЪрд╛ Raft-рдЖрдзрд╛рд░рд┐рдд quorum, рдЬреЛ cluster рдЪреНрдпрд╛ metadata рд╡рд░ рдПрдХрдордд рдХрд░рддреЛ. Consul, CockroachDB рдЖрдгрд┐ TiKV рд╕реБрджреНрдзрд╛ Raft рд╡рд╛рдкрд░рддрд╛рдд.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: consensus clusters 3 рдХрд┐рдВрд╡рд╛ 5 members рд╕рд╣ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ failure zones рдордзреНрдпреЗ рдЪрд╛рд▓рд╡рд╛, leader рдмрджрд▓рд╛рдВрд╡рд░ рдЖрдгрд┐ Raft index рдордзреНрдпреЗ рдорд╛рдЧреЗ рдкрдбрд▓реЗрд▓реНрдпрд╛ members рд╡рд░ alert рд▓рд╛рд╡рд╛, рдЖрдгрд┐ рддреНрдпрд╛рдВрдд рдлрдХреНрдд рдЫреЛрдЯрд╛ coordination data рдареЗрд╡рд╛ (leaders, config, locks) тАФ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рддреАрд▓ application data рдирд╡реНрд╣реЗ.
тПня╕П рдкреБрдвреЗ
Consensus рдореБрд│реЗ рдПрдХ node lock рдзрд░реВ рд╢рдХрддреЗ. рдкрдг lock рдзрд░рдгрд╛рд░реА node рдерд╛рдВрдмреВ рд╢рдХрддреЗ рдЖрдгрд┐ рддрд┐рд▓рд╛ рддреЗ рдХрд│рддрд╣реА рдирд╛рд╣реА. рдкреБрдвреЗ: leases рдЖрдгрд┐ fencing tokens.
git checkout lesson-10-locks-leases