ЁЯТУ рдзрдбрд╛ 04 тАФ Failure detection: рдмрдВрдж рдкрдбрд▓реА рдХреА рдлрдХреНрдд рд╣рд│реВ?
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдорд╛рдЧреЗ: lesson-03-ordering ┬╖ рдкреБрдвреЗ: lesson-05-replication
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ03, рдЕрдзрд┐рдХ failure detection: рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдард░рд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ рдПрдХ рдЫреЛрдЯреА "рдореА рдЪрд╛рд▓реВ рдЖрд╣реЗ" рдЪрд┐рдареНрдареА
(рдПрдХ heartbeat) рдкрд╛рдард╡рддреЗ, рдЖрдгрд┐ рд╡реЗрд│реЗрдд heartbeat рдЖрд▓рд╛ рдирд╛рд╣реА рддрд░ рдмрд╛рдХреАрдЪреНрдпрд╛ рддрд┐рдЪреНрдпрд╛рд╡рд░ рд╕рдВрд╢рдп рдШреЗрддрд╛рдд.
рдПрдХрдореЗрд╡ knob тАФ timeout тАФ рд▓рд╡рдХрд░ рдХрд│рдгреЗ рдЖрдгрд┐ рдЦреЛрдЯреЗ alarms рдпрд╛рдВрдЪреНрдпрд╛рдд рддрдбрдЬреЛрдб рдХрд░рддреЛ.
dist/demo.py рдордзрд▓реЗ detection() рдЖрдгрд┐
dist/sim.py рдордзрд▓реЗ HeartbeatDetector.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдХреЛрд▓реНрд╣рд╛рдкреВрд░ рдкреБрдгреНрдпрд╛рд▓рд╛ рд╕рд╛рдзрд╛рд░рдг рджрд░ 100 ms рд▓рд╛ рдПрдХ postcard ЁЯТМ рдкрд╛рдард╡рдгреНрдпрд╛рдЪреЗ рд╡рдЪрди рджреЗрддреЗ: "рдЕрдЬреВрди рдЙрдШрдбреЗ рдЖрд╣реЗ!"
рдкреБрдгреНрдпрд╛рддрд▓реА рджреАрдкрд┐рдХрд╛ postcards рдпреЗрддрд╛рдирд╛ рдкрд╛рд╣рддреЗ. рд╕рд╣рд╕рд╛ рддреЗ рджрд░ 95 рддреЗ 120 ms рд▓рд╛ рдпреЗрддрд╛рдд. рдкрдг рдХрдзреА рдХрдзреА рдПрдЦрд╛рджреЗ рдЙрд╢рд┐рд░рд╛ рдпреЗрддреЗ тАФ рдПрдХрджрд╛ 340 ms, рдХрд╛рд░рдг рдХреЛрд▓реНрд╣рд╛рдкреВрд░рдЪрд╛ clerk office рд╕рд╛рдл рдХрд░рд╛рдпрд▓рд╛ рдерд╛рдВрдмрд▓рд╛ рд╣реЛрддрд╛ (рдПрдХ рдореЛрдард╛ pause). рдирдВрддрд░ рдПрдХрджрд╛ 180 ms рдЙрд╢реАрд░, рдХрд╛рд░рдг рд░рд╕реНрддреНрдпрд╛рд╡рд░ рдЧрд░реНрджреА рд╣реЛрддреА.
рджреАрдкрд┐рдХрд╛рд▓рд╛ рдПрдХ рдирд┐рдпрдо рдирд┐рд╡рдбрд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ: "X ms рдкрд░реНрдпрдВрдд postcard рдЖрд▓реЗ рдирд╛рд╣реА рддрд░ рдореА рдХреЛрд▓реНрд╣рд╛рдкреВрд░ рдмрдВрдж рдЖрд╣реЗ рдЕрд╕реЗ рдореНрд╣рдгреЗрди".
- X = 150 ms: рдЦрд░реЛрдЦрд░ рдмрдВрдж рдЭрд╛рд▓реЗ рддрд░ рддрд┐рд▓рд╛ рддреЗ рд▓рд╡рдХрд░ рдХрд│рддреЗ. рдкрдг рдХреЛрд▓реНрд╣рд╛рдкреВрд░ рдЙрдШрдбреЗ рдЕрд╕рддрд╛рдирд╛ рддреА рджреЛрдирджрд╛ "рдмрдВрдж!" рдЕрд╕реЗ рдУрд░рдбрддреЗрд╣реА. ЁЯЪиЁЯЪи
- X = 800 ms: рддреА рдХрдзреАрдЪ рдЪреБрдХреВрди рдУрд░рдбрдд рдирд╛рд╣реА. рдкрдг рдХреЛрд▓реНрд╣рд╛рдкреВрд░ рдЦрд░реЛрдЦрд░ рдмрдВрдж рдЭрд╛рд▓реЗ рдХреА рддреЗ рд▓рдХреНрд╖рд╛рдд рдпрд╛рдпрд▓рд╛ рддрд┐рд▓рд╛ 800 ms рд╡рд╛рдЯ рдкрд╛рд╣рд╛рд╡реА рд▓рд╛рдЧрддреЗ. ЁЯРв
рдЬрд▓рдж рдЖрдгрд┐ рдХрдзреАрдЪ рди рдЪреБрдХрдгрд╛рд░рд╛ рдЕрд╕рд╛ рдХреЛрдгрддрд╛рдЪ X рдирд╛рд╣реА. рджреАрдкрд┐рдХрд╛ рдлрдХреНрдд рдХреЛрдгрддреА рдЪреВрдХ рддрд┐рд▓рд╛ рдЪрд╛рд▓реЗрд▓ рддреЗ рдирд┐рд╡рдбреВ рд╢рдХрддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
k["ЁЯПл Kolhapur<br/>heartbeat every ~100 ms"] -->|"gaps 100 110 95 340 105 120 180 95<br/>then it really dies"| d["ЁЯТУ detector in Pune"]
d --> t1["timeout 150 ms<br/>2 false alarms<br/>death noticed after 150 ms"]
d --> t2["timeout 400 ms<br/>0 false alarms<br/>noticed after 400 ms"]
d --> t3["timeout 800 ms<br/>0 false alarms<br/>noticed after 800 ms"]
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/distributed-systems/lesson-diagrams.html#l04
тЭУ рдХрд╛рдп
- Heartbeat тАФ "рдореА рдЪрд╛рд▓реВ рдЖрд╣реЗ" рд╕рд╛рдВрдЧрдгреНрдпрд╛рд╕рд╛рдареА node рдард░рд▓реЗрд▓реНрдпрд╛ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреБрд╕рд╛рд░ рдкрд╛рдард╡рддреЛ рддреЛ рдЫреЛрдЯрд╛ message. рдЕрдиреЗрдХрджрд╛ рдиреЗрд╣рдореАрдЪрд╛ traffic (рдХрд┐рдВрд╡рд╛ leader рдЪреЗ messages, рдзрдбрд╛ 09) рд╣рд╛рдЪ heartbeat рдореНрд╣рдгреВрдирд╣реА рдХрд╛рдо рдХрд░рддреЛ.
- Timeout-based failure detector тАФ timeout рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рд╡реЗрд│ heartbeat рдЖрд▓рд╛ рдирд╛рд╣реА рддрд░ node рд╡рд░ рд╕рдВрд╢рдп рдШреНрдпрд╛.
- рдЦреЛрдЯрд╛ alarm (false positive) тАФ рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ node рд╡рд░ рд╕рдВрд╢рдп рдШреЗрддрд▓рд╛ рдЬрд╛рддреЛ. рдХрд╛рд░рдгреЗ: рдореЛрдард╛ garbage-collection pause, рд╡реНрдпрд╕реНрдд CPU, рд╣рд│реВ рдХрд┐рдВрд╡рд╛ рдЪрд┐рдареНрдареНрдпрд╛ рд╣рд░рд╡рдгрд╛рд░реЗ network. Node рдареАрдХ рдЖрд╣реЗ; рддреНрдпрд╛рдЪрд╛ heartbeat рдЙрд╢рд┐рд░рд╛ рдЖрд▓рд╛ рдЖрд╣реЗ.
- Detection time тАФ рдЦрд░рд╛ crash рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░ detector рд▓рд╛ рдХрд┐рддреА рд╡реЗрд│рд╛рдиреЗ рдХрд│рддреЗ. Timeout рдЕрд╕реЗрд▓ рддрд░ рддреЛ рд╕рд╛рдзрд╛рд░рдг timeout рдЗрддрдХрд╛ рдЕрд╕рддреЛ (рдЕрдзрд┐рдХ рдиреЗрд╣рдореАрдЪреЗ heartbeat рдЕрдВрддрд░).
- Failure detectors рд╕реНрд╡рднрд╛рд╡рддрдГрдЪ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЕрд╕рддрд╛рдд тАФ рдЬреНрдпрд╛ network рдордзреНрдпреЗ delay рд▓рд╛ рдХреЛрдгрддреАрд╣реА рд╡рд░рдЪреА рдорд░реНрдпрд╛рджрд╛ рдирд╛рд╣реА (рдзрдбрд╛ 01), рддрд┐рдереЗ crash рдЭрд╛рд▓реЗрд▓рд╛ node рдЖрдгрд┐ рдЦреВрдк рд╣рд│реВ node рд╕рд╛рд░рдЦреЗрдЪ рджрд┐рд╕рддрд╛рдд. рдореНрд╣рдгреВрди detector рдлрдХреНрдд рд╕рдВрд╢рдп рдШреЗрдК рд╢рдХрддреЛ, рдХрдзреАрдЪ рдЦрд╛рддреНрд░реАрдиреЗ рдЬрд╛рдгреВ рд╢рдХрдд рдирд╛рд╣реА. рдкреНрд░рддреНрдпреЗрдХ detector рдПрдХ рддрдбрдЬреЛрдб рдЖрд╣реЗ: рд▓рд╡рдХрд░ рдХрд│рдгреЗ рдореНрд╣рдгрдЬреЗ рдЬрд╛рд╕реНрдд рдЦреЛрдЯреЗ alarms.
- Phi accrual failure detector (Hayashibara рдЖрдгрд┐ рдЗрддрд░, 2004) тАФ рд╣реЛ/рдирд╛рд╣реА рдРрд╡рдЬреА, рддреЛ
heartbeat рдЕрдВрддрд░рд╛рдВрдЪрд╛ рдиреЗрд╣рдореАрдЪрд╛ рдкрд╕рд╛рд░рд╛ рд╢рд┐рдХрддреЛ рдЖрдгрд┐ рдПрдХ рд╕рдВрд╢рдп рдкрд╛рддрд│реА ╧Ж (phi) рджреЗрддреЛ:
рд╕рд╛рдзрд╛рд░рдг, ╧Ж = 8 рдореНрд╣рдгрдЬреЗ "рдЗрддрдХреЗ рдореЛрдареЗ рдЕрдВрддрд░ рдпреЛрдЧрд╛рдпреЛрдЧрд╛рдиреЗ рд╕рд╛рдзрд╛рд░рдг 10тБ╕ рдордзреНрдпреЗ 1 рд╡реЗрд│рд╛ рдпреЗрдИрд▓".
Cassandra рддреЛ рд╡рд╛рдкрд░рддреЗ (
phi_convict_threshold, default 8); Akka рд╣реА рд╡рд╛рдкрд░рддреЗ. рддреЛ рд╣рд│реВ network рд╢реА рдЖрдкреЛрдЖрдк рдЬреБрд│рд╡реВрди рдШреЗрддреЛ, рдкрдг рддрд░реАрд╣реА рддреА рддрдбрдЬреЛрдбрдЪ рдЖрд╣реЗ. - рдХреГрддреА рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рд╛ тАФ рд╕рдВрд╢рдп рдЪреБрдХреАрдЪрд╛ рдЕрд╕реВ рд╢рдХрддреЛ, рдореНрд╣рдгреВрди рд╕рдВрд╢рдпрд╛рд╡рд░реВрди рдШреЗрддрд▓реЗрд▓реА рдХреГрддреА (fail over, restart, рдХреБрд▓реВрдк рддрд╛рдмреНрдпрд╛рдд рдШреЗрдгреЗ) node рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛рд╣реА рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реА. рдзрдбреЗ 05, 09 рдЖрдгрд┐ 10 рдиреЗрдордХреЗ рдпрд╛рдмрджреНрджрд▓рдЪ рдЖрд╣реЗрдд.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдЖрдкреЛрдЖрдк рд╣реЛрдгрд╛рд░реА recovery "рддреЛ node рдмрдВрдж рдкрдбрд▓рд╛" рдЗрдереВрди рд╕реБрд░реВ рд╣реЛрддреЗ. Leader рдЦреВрдк рд▓рд╡рдХрд░ рдмрджрд▓рд▓рд╛, рддрд░ GC pause рдореБрд│реЗ failover рд╣реЛрддреЛ тАФ рдХрд┐рдВрд╡рд╛ рджреЛрди leaders (рдзрдбрд╛ 05). рдЦреВрдк рдЙрд╢рд┐рд░рд╛ рдмрджрд▓рд▓рд╛, рддрд░ users рдЦрд▒реНрдпрд╛ outage рдордзреНрдпреЗ рд╡рд╛рдЯ рдкрд╛рд╣рдд рд░рд╛рд╣рддрд╛рдд. рдлреБрдХрдЯрдЪреЗ рдЙрддреНрддрд░ рдирд╛рд╣реА, рдореНрд╣рдгреВрди рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ network рд╕рд╛рдареА timeout рдЬреБрд│рд╡рддрд╛ рдЖрдгрд┐ рд╕рдВрд╢рдпрд╛рд╡рд░реВрди рдШреЗрддрд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдХреГрддреА рдЪреБрдХреВрди рдШрдбрд▓реА рддрд░реА рд╕реБрд░рдХреНрд╖рд┐рдд рдареЗрд╡рддрд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
dist/sim.py рдордзрд▓реНрдпрд╛ HeartbeatDetector(timeout_ms) рдордзреНрдпреЗ рджреЛрди methods рдЖрд╣реЗрдд.
verdicts(gaps_ms) рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрддрд░рд╛рд▓рд╛ 'alive' рдХрд┐рдВрд╡рд╛ 'suspected' (gap > timeout) рдЕрд╕реЗ рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рдХрд░рддреЗ. run(gaps_ms)
(рдЪрд╛рд▓реВ рдЕрд╕рддрд╛рдирд╛ рдЖрд▓реЗрд▓реЗ рдЦреЛрдЯреЗ alarms, рдЦрд░рд╛ рдореГрддреНрдпреВ рд▓рдХреНрд╖рд╛рдд рдпрд╛рдпрд▓рд╛ рд▓рд╛рдЧрд▓реЗрд▓реЗ ms) рдкрд░рдд рджреЗрддреЗ тАФ рддреЗ timeout рдкреЗрдХреНрд╖рд╛
рдореЛрдареА рдЕрдВрддрд░реЗ рдореЛрдЬрддреЗ, рдЖрдгрд┐ рд▓рдХреНрд╖рд╛рдд рдпрд╛рдпрдЪреА рд╡реЗрд│ рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд timeout рдЪ. dist/demo.py рдордзрд▓реЗ
detection() 150, 400 рдЖрдгрд┐ 800 ms рд╡рд╛рдкрд░реВрди рдкрд╛рд╣рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 dist/demo.py detection
python3 - <<'EOF'
import sys; sys.path.insert(0, "dist"); from sim import HeartbeatDetector
gaps = [100, 110, 95, 340, 105, 120, 180, 95]
for t in (100, 200, 350):
fa, notice = HeartbeatDetector(t).run(gaps)
print(f"timeout {t} ms тЖТ false alarms {fa} ┬╖ death noticed after {notice} ms")
print("verdicts at 150 ms:", HeartbeatDetector(150).verdicts(gaps))
busy = [100, 450, 900, 120] # a very bad day: a long GC pause and a slow road
print("bad day at 400 ms:", HeartbeatDetector(400).verdicts(busy))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
detection рд╣реЗ print рдХрд░рддреЗ:
timeout 150 ms тЖТ false alarms while alive: 2 ┬╖ the real death is noticed after 150 ms
timeout 400 ms тЖТ false alarms while alive: 0 ┬╖ the real death is noticed after 400 ms
timeout 800 ms тЖТ false alarms while alive: 0 ┬╖ the real death is noticed after 800 ms
рддреБрдордЪрд╛ snippet рд╣реЗ print рдХрд░рддреЛ:
timeout 100 ms тЖТ false alarms 5 ┬╖ death noticed after 100 ms
timeout 200 ms тЖТ false alarms 1 ┬╖ death noticed after 200 ms
timeout 350 ms тЖТ false alarms 0 ┬╖ death noticed after 350 ms
verdicts at 150 ms: ['alive', 'alive', 'alive', 'suspected', 'alive', 'alive', 'suspected', 'alive']
bad day at 400 ms: ['alive', 'suspected', 'suspected', 'alive']
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдпрд╛ рдЕрдВрддрд░рд╛рдВрд╕рд╣, snippet рдордзрд▓рд╛ 350 ms рд╣рд╛ рдПрдХрдореЗрд╡ timeout рд╣реЛрддрд╛ рдЬреНрдпрд╛рдд рдПрдХрд╣реА рдЦреЛрдЯрд╛ alarm рдирд╡реНрд╣рддрд╛ тАФ рддреЛ рд╕рд░реНрд╡рд╛рдд рдореЛрдареНрдпрд╛ рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЕрдВрддрд░рд╛рдЪреНрдпрд╛ (340 ms) рдЕрдЧрджреА рд╡рд░ рдЖрд╣реЗ. рдкрдг рд╡рд╛рдИрдЯ рджрд┐рд╡рд╢реА (450 ms рдЖрдгрд┐ 900 ms рдЪреЗ рдЕрдВрддрд░), 400 ms рд╕реБрджреНрдзрд╛ рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╢рд╛рдЦреЗрд╡рд░ рджреЛрдирджрд╛ рд╕рдВрд╢рдп рдШреЗрддреЛ. "рдмрд░реЛрдмрд░" timeout рддреБрдордЪреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рдгрд╛рдд рдирд╕рд▓реЗрд▓реНрдпрд╛ network рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ. рдореНрд╣рдгреВрдирдЪ detector рдлрдХреНрдд рд╕рдВрд╢рдп рдШреЗрдК рд╢рдХрддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдиреЗрд╣рдореАрдЪреНрдпрд╛ garbage-collection pause рдкреЗрдХреНрд╖рд╛ рд▓рд╣рд╛рди timeout
- рд╕рдВрд╢рдпрд╛рд╡рд░реВрди рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреГрддреА рдХрд░рдгреЗ тАФ рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рджреЛрди nodes рджреЛрдШреЗрд╣реА leader рдореНрд╣рдгреВрди рд▓рд┐рд╣рд┐рддрд╛рдд
- database рд╕реБрджреНрдзрд╛ рддрдкрд╛рд╕рдгрд╛рд░рд╛ liveness check: database рд╣рд│реВ рдЖрд╣реЗ, рдореНрд╣рдгреВрди service рдЪреА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдд рдПрдХрд╛рдЪ рд╡реЗрд│реА restart рд╣реЛрддреЗ
- рдПрдХ heartbeat рдЪреБрдХрд▓рд╛ = рдмрдВрдж рдкрдбрд▓рд╛; рдмрд╣реБрддреЗрдХ systems рдЕрдиреЗрдХ рдЪреБрдХрдгреНрдпрд╛рдЪреА рд╡рд╛рдЯ рдкрд╛рд╣рддрд╛рдд
- рдЦреЛрдЯреНрдпрд╛ alarms рд╡рд░ alert рдирд╛рд╣реА, рддреНрдпрд╛рдореБрд│реЗ рд╕рддрдд рдЪрд╛рд▓реВ-рдмрдВрдж рд╣реЛрдгрд╛рд░рд╛ (flapping) node рд▓рдХреНрд╖рд╛рдд рдпреЗрдд рдирд╛рд╣реА
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Kubernetes probes тАФ рдкреНрд░рддреНрдпреЗрдХ node рд╡рд░рдЪрд╛ kubelet рдкреНрд░рддреНрдпреЗрдХ container рддрдкрд╛рд╕рддреЛ. рдЕрдпрд╢рд╕реНрд╡реА liveness probe container restart рдХрд░рддреЛ. рдЕрдпрд╢рд╕реНрд╡реА readiness probe рдлрдХреНрдд pod рд▓рд╛ Service рдЪреНрдпрд╛ endpoints рдордзреВрди рдХрд╛рдврддреЛ (traffic рдирд╛рд╣реА), restart рди рдХрд░рддрд╛:
containers:
- name: timetable
image: school/timetable:1.4
livenessProbe: # "is the process stuck?" тАФ keep it cheap and local
httpGet: { path: /livez, port: 8080 }
periodSeconds: 10
timeoutSeconds: 2
failureThreshold: 3 # 3 misses in a row тЖТ restart
readinessProbe: # "can it serve now?" тАФ may check its own dependencies
httpGet: { path: /readyz, port: 8080 }
periodSeconds: 5
failureThreshold: 2
Kubernetes node heartbeats тАФ рдкреНрд░рддреНрдпреЗрдХ kubelet kube-node-lease namespace рдордзрд▓рд╛ рдПрдХ Lease object
renew рдХрд░рддреЛ (default рдиреБрд╕рд╛рд░ рджрд░ 10 рд╕реЗрдХрдВрджрд╛рдВрдиреА). Node monitor grace period рдЗрддрдХрд╛ рд╡реЗрд│ renewals рдерд╛рдВрдмрд▓реЗ рддрд░
node NotReady рдореНрд╣рдгреВрди рдЪрд┐рдиреНрд╣рд╛рдВрдХрд┐рдд рд╣реЛрддреЛ; рддреНрдпрд╛рд╡рд░рдЪреЗ pods рддреНрдпрд╛рдВрдЪреНрдпрд╛ toleration рдирдВрддрд░ (default рдиреБрд╕рд╛рд░ 300 рд╕реЗрдХрдВрдж)
evict рд╣реЛрддрд╛рдд. On a real account:
kubectl get lease -n kube-node-lease
kubectl get nodes
etcd heartbeats тАФ Raft leader (рдзрдбрд╛ 09) рджрд░ --heartbeat-interval рд▓рд╛ (default 100 ms)
heartbeat рдкрд╛рдард╡рддреЛ; --election-timeout (default 1000 ms) рдЗрддрдХрд╛ рд╡реЗрд│ рдХрд╛рд╣реАрдЪ рди рдРрдХрд▓реЗрд▓рд╛ follower
election рд╕реБрд░реВ рдХрд░рддреЛ. etcd docs рд╕реБрдЪрд╡рддрд╛рдд рдХреА heartbeat interval members рдордзрд▓реНрдпрд╛ round-trip time рдЗрддрдХрд╛ рдЕрд╕рд╛рд╡рд╛,
рдЖрдгрд┐ election timeout рддреНрдпрд╛рдЪреНрдпрд╛ рдХрд┐рдорд╛рди 10 рдкрдЯ:
etcd --heartbeat-interval=100 --election-timeout=1000 ...
Cassandra тАФ phi accrual detector, cassandra.yaml рдордзреНрдпреЗ:
phi_convict_threshold: 8 # raise it (for example to 12) on slow or shared networks
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рддреБрдореНрд╣реА рдЪрд╛рд▓рд╡рддрд╛ рддреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ detector рд╕рд╛рдареА (probes, node leases, database failover, consensus), рддреНрдпрд╛рдЪрд╛ timeout, рддреБрдореНрд╣реА рдкрд╛рд╣рд┐рд▓реЗрд▓рд╛ рд╕рд░реНрд╡рд╛рдд рдореЛрдард╛ рдиреЗрд╣рдореАрдЪрд╛ pause, рдЖрдгрд┐ рдЦреЛрдЯрд╛ alarm рдХреЛрдгрддреА рдХреГрддреА рд╕реБрд░реВ рдХрд░рддреЛ рддреЗ рд▓рд┐рд╣реВрди рдареЗрд╡рд╛. рдордЧ рддреА рдХреГрддреА рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд░рд╛.
тПня╕П рдкреБрдвреЗ
рднрд╛рдЧ 1 рдкреВрд░реНрдг: рд╣рд░рд╡рд▓реЗрд▓реНрдпрд╛ рдЪрд┐рдареНрдареНрдпрд╛, рдЪреБрдХреАрдЪреА рдШрдбреНрдпрд╛рд│реЗ, рдЕрдЬреНрдЮрд╛рдд рдХреНрд░рдо, рдЕрдирд┐рд╢реНрдЪрд┐рдд рдореГрддреНрдпреВ. рднрд╛рдЧ 2 рдЕрдиреЗрдХ рд╢рд╛рдЦрд╛рдВрдордзреНрдпреЗ рдиреЛрдВрджрд╡рд╣реАрдЪреНрдпрд╛ рдкреНрд░рддреА рдареЗрд╡рддреЛ тАФ рдПрдХ leader рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ followers рдпрд╛рдВрдкрд╛рд╕реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрди.
git checkout lesson-05-replication