Post

[Distributed System] Consensus Algorithm

[Distributed System] Consensus Algorithm

๐Ÿงฉ State Machine Replication

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๊ฐ€ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ์ปดํ“จํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋งˆ๋ฒ•์€ ์ƒํƒœ ๋จธ์‹  ๋ณต์ œ(State Machine Replication, SMR)๋ผ๋Š” ๊ฐœ๋…์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ํฉ์–ด์ ธ ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์น˜ ๋‹จ์ผ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ™˜์ƒ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

SMR์˜ ํ•ต์‹ฌ ์ฒ ํ•™์€ โ€œ๊ฒฐ์ •๋ก (Determinism)โ€์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ดˆ๊ธฐ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•œ ๋ณต์ œ๋ณธ(Replica)๋“ค์ด ๋™์ผํ•œ ์ž…๋ ฅ ์‹œํ€€์Šค๋ฅผ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์ˆ˜์‹ ํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค๋ฉด, ๊ทธ ๊ฒฐ๊ณผ๋กœ ๋„์ถœ๋˜๋Š” ์ตœ์ข… ์ƒํƒœ ์—ญ์‹œ ๋ฐ˜๋“œ์‹œ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ โ€˜์ž…๋ ฅโ€™์€ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š” ๋ช…๋ น(Command)์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด ๋ช…๋ น๋“ค์ด ์Œ“์ธ ๊ธฐ๋ก ๋ณด๊ด€์†Œ๋ฅผ ์šฐ๋ฆฌ๋Š” ๋กœ๊ทธ(Log)๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

Append-only Log

๋กœ๊ทธ๋Š” ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ์˜ ๋‚˜์—ด์ด ์•„๋‹ˆ๋ผ, ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๊ฑด์˜ ์„ ํ˜•์  ์‹œ๊ฐ„์ถ• ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” ์ž์‹ ๋งŒ์˜ ๋กœ์ปฌ ๋กœ๊ทธ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ฃผ๋œ ์ž„๋ฌด๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ ๋กœ๊ทธ๊ฐ€ ์ •ํ™•ํžˆ ๊ฐ™์€ ์œ„์น˜์— ๊ฐ™์€ ๋ช…๋ น์„ ๊ฐ–๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ตฌ์กฐ์—์„œ ๊ฐ ๋…ธ๋“œ๋Š” ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

  • Consensus Module: ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค๊ณผ ํ†ต์‹ ํ•˜๋ฉฐ ๋กœ๊ทธ์˜ ๋‚ด์šฉ๊ณผ ์ˆœ์„œ์— ๋Œ€ํ•ด ํ•ฉ์˜๋ฅผ ์ด๋Œ์–ด๋‚ด๋Š” ์ง€๋Šฅํ˜• ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค.
  • Log: ํ•ฉ์˜๊ฐ€ ์™„๋ฃŒ๋œ(Committed) ๋ช…๋ น๋“ค์ด ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.
  • State Machine: ๋กœ๊ทธ์— ๊ธฐ๋ก๋œ ๋ช…๋ น์„ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ(์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ‚ค-๊ฐ’ ์Œ)๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‹คํ–‰ ์—”์ง„์ž…๋‹ˆ๋‹ค.

๋น„๊ฒฐ์ •๋ก ์  ์š”์†Œ์˜ ์œ„ํ—˜์„ฑ (Non-determinism)

SMR ์•„ํ‚คํ…์ฒ˜์—์„œ ์ƒํƒœ ๋จธ์‹ ์ด ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์— get_current_time()์ด๋‚˜ random() ๊ฐ™์€ ๋น„๊ฒฐ์ •๋ก ์  ํ•จ์ˆ˜๊ฐ€ ํฌํ•จ๋˜๋ฉด ์‹œ์Šคํ…œ์€ ์ฆ‰์‹œ ๋ถ•๊ดดํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋กœ๊ทธ๋ฅผ ์‹คํ–‰ํ•˜๋”๋ผ๋„ ๋…ธ๋“œ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ ธ ์ผ๊ด€์„ฑ(Consistency)์ด ๊นจ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ช…๋ น์€ ์˜ค์ง ์ž…๋ ฅ ๊ฐ’๊ณผ ์ด์ „ ์ƒํƒœ์—๋งŒ ์˜์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฐ‹์˜ ์˜๋ฏธ

๋‹จ์ˆœํžˆ ๋กœ๊ทธ์— ๋ช…๋ น์„ ์“ด๋‹ค๊ณ  ํ•ด์„œ ์ƒํƒœ๊ฐ€ ๋ฐ”๋กœ ๋ณ€ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŠน์ • ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ๊ฐ€ โ€˜์•ˆ์ „ํ•˜๊ฒŒ ๋ณต์ œ๋˜์—ˆ์Œโ€™์„ ํ™•์ธํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฉฐ, ์ด๋ฅผ ์ปค๋ฐ‹(Commit)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ์ปค๋ฐ‹๋œ ๋กœ๊ทธ๋Š” ์–ด๋–ค ์žฅ์•  ์ƒํ™ฉ์—์„œ๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š์œผ๋ฉฐ(Durability), ์ƒํƒœ ๋จธ์‹ ์€ ์˜ค์ง ์ปค๋ฐ‹๋œ ๋กœ๊ทธ๋งŒ์„ ์ฝ์–ด ์„œ๋น„์Šค์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์—„๊ฒฉํ•œ ํŒŒ์ดํ”„๋ผ์ธ ๋•๋ถ„์— ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด๋‚˜ ์ผ๋ถ€ ๋…ธ๋“œ์˜ ๋‹ค์šด ์†์—์„œ๋„ ์ „์ฒด ์‹œ์Šคํ…œ์€ ๋‹จ์ผํ•œ ์ง„์‹ค์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงฉ Consensus

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ํ•ฉ์˜(Consensus)๋Š” ๋‹จ์ˆœํžˆ ํˆฌํ‘œ๋ฅผ ํ†ตํ•ด ๋‹ค์ˆ˜๊ฒฐ์„ ๋”ฐ๋ฅด๋Š” ๋ฏผ์ฃผ์ ์ธ ์ ˆ์ฐจ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๋Š” ์ง€์—ฐ(Latency), ํŒจํ‚ท ์†์‹ค(Packet Loss), ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ ์žฅ์• (Crash)๊ฐ€ ์ผ์ƒ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋น„์‹ ๋ขฐ ๋„คํŠธ์›Œํฌ(Unreliable Network) ์œ„์—์„œ, ๋ชจ๋“  ์ •์ƒ์ ์ธ ๋…ธ๋“œ๊ฐ€ โ€˜๋‹จ ํ•˜๋‚˜์˜ ์ง„์‹คโ€™์„ ์„ ํƒํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ์—„๊ฒฉํ•œ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

ํ•ฉ์˜์˜ ๋ณธ์งˆ์ ์ธ ์–ด๋ ค์›€์€ โ€œ๋ˆ„๊ฐ€ ์ฃฝ์—ˆ๋Š”์ง€, ์•„๋‹ˆ๋ฉด ๊ทธ์ € ๋А๋ฆฐ ๊ฒƒ์ธ์ง€โ€๋ฅผ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋ถˆํ™•์‹ค์„ฑ์—์„œ ๊ธฐ์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒˆ๋Š”๋ฐ ์‘๋‹ต์ด ์—†๋‹ค๋ฉด, ์ƒ๋Œ€๋ฐฉ์˜ ์„œ๋ฒ„๊ฐ€ ์ „์› ๋ถˆ๋Ÿ‰์œผ๋กœ ๋ฉˆ์ถ˜ ๊ฒƒ์ผ๊นŒ์š”? ์•„๋‹ˆ๋ฉด ๋„คํŠธ์›Œํฌ ์Šค์œ„์น˜๊ฐ€ ํ˜ผ์žกํ•˜์—ฌ ์‘๋‹ต์ด 10์ดˆ ๋’ค์— ๋„์ฐฉํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์‚ฌ์†Œํ•œ ๊ตฌ๋ถ„์˜ ๋ถˆ๊ฐ€๋Šฅ์„ฑ์ด ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ค๊ณ„๋ฅผ ์ง€์˜ฅ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

FLP ๋ถˆ๊ฐ€๋Šฅ์„ฑ

1985๋…„, Fischer, Lynch, Paterson์€ ๋ถ„์‚ฐ ์ปดํ“จํŒ… ์—ญ์‚ฌ์ƒ ๊ฐ€์žฅ ์ถฉ๊ฒฉ์ ์ธ ๋…ผ๋ฌธ์„ ๋ฐœํ‘œํ•ฉ๋‹ˆ๋‹ค. ์†Œ์œ„ FLP Impossibility๋ผ ๋ถˆ๋ฆฌ๋Š” ์ด ์ด๋ก ์€ โ€œ์™„์ „ํ•œ ๋น„๋™๊ธฐ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ๊ฒฐํ•จ์ด ์ƒ๊ฒจ๋„, ๊ฒฐ์ •๋ก ์ (Deterministic)์œผ๋กœ ํ•ฉ์˜๋ฅผ ๋งˆ์น  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹คโ€๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ์‹œ๊ฐ„์— ์ƒํ•œ์„ ์ด ์—†์œผ๋ฏ€๋กœ, ์‹œ์Šคํ…œ์ด ๋ฌดํ•œํžˆ โ€˜๊ฒฐ์ •๋˜์ง€ ์•Š์€ ์ƒํƒœโ€™์— ๋จธ๋ฌผ ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋ฐ˜๋“œ์‹œ ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Raft๋‚˜ Paxos ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ด ์ด๋ก ์„ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฌด์ž‘์œ„์„ฑ(Randomness)์ด๋‚˜ ํƒ€์ž„์•„์›ƒ(Timeout)์ด๋ผ๋Š” ํ˜„์‹ค์ ์ธ ํƒ€ํ˜‘์•ˆ์„ ๋„์ž…ํ•˜์—ฌ ์ด ๋…ผ๋ฆฌ์  ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

ํ•ฉ์˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” 3๊ฐ€์ง€ ์ ˆ๋Œ€ ์กฐ๊ฑด

๋ชจ๋“  ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ์ˆ˜ํ•™์  ์†์„ฑ์„ ๋งŒ์กฑํ•ด์•ผ๋งŒ ์œ ํšจํ•˜๋‹ค๊ณ  ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค.

  1. Agreement (ํ•ฉ์˜): ๋ชจ๋“  ์ •์ƒ์ ์ธ ๋…ธ๋“œ๋Š” ๋™์ผํ•œ ๊ฐ’์— ๋„๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
  2. Validity (์œ ํšจ์„ฑ): ํ•ฉ์˜๋œ ๊ฐ’์€ ๋ฐ˜๋“œ์‹œ ๋ˆ„๊ตฐ๊ฐ€ ์ œ์•ˆํ•œ ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค. (์—‰๋šฑํ•œ ๊ฐ’์ด ํŠ€์–ด๋‚˜์™€์„  ์•ˆ ๋œ๋‹ค.)
  3. Termination (์ข…๋ฃŒ): ๋ชจ๋“  ์ •์ƒ์ ์ธ ๋…ธ๋“œ๋Š” ๊ฒฐ๊ตญ ์–ด๋–ค ๊ฐ’์œผ๋กœ๋“  ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผ ํ•œ๋‹ค.

Safety์™€ Liveness์˜ ์ค„ํƒ€๊ธฐ

ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ค๊ณ„๋Š” ๊ฒฐ๊ตญ Safety(์•ˆ์ „์„ฑ)์™€ Liveness(์ƒ์กด์„ฑ) ์‚ฌ์ด์˜ ๊ท ํ˜•์„ ๋งž์ถ”๋Š” ์ผ์ž…๋‹ˆ๋‹ค.

  • Safety๋Š” โ€œ๋‚˜์œ ์ผ(์ž˜๋ชป๋œ ํ•ฉ์˜)์ด ์ ˆ๋Œ€ ์ผ์–ด๋‚˜์ง€ ์•Š์Œโ€์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ํ•ฉ์˜ํ•ด ๋ฒ„๋ฆฌ๋Š” ์ •ํ•ฉ์„ฑ ์˜ค๋ฅ˜๊ฐ€ ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • Liveness๋Š” โ€œ์ข‹์€ ์ผ(๊ฒฐ๊ตญ ํ•ฉ์˜๋จ)์ด ์–ธ์  ๊ฐ€๋Š” ์ผ์–ด๋‚จโ€์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๊ณ„์†ํ•ด์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด ๋‚˜๊ฐ€๋Š” ๊ฐ€์šฉ์„ฑ์ด ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์‹ค์˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์€ ๋Œ€๊ฐœ Safety๋ฅผ ์ ˆ๋Œ€์ ์œผ๋กœ ์šฐ์„ ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ์ ์œผ๋กœ ์‹œ์Šคํ…œ์ด ์‘๋‹ตํ•˜์ง€ ์•Š์„์ง€์–ธ์ •(Liveness ํฌ๊ธฐ), ๋ฐ์ดํ„ฐ๊ฐ€ ๊ผฌ์—ฌ์„œ ๋…ธ๋“œ๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํ™ฉ(Safety ํฌ๊ธฐ)์€ ์šฉ๋‚ฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šฐ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ•ฉ์˜ ํ”„๋กœํ† ์ฝœ์€ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ์ƒํ™ฉ์—์„œ ๊ฐ€์šฉ์„ฑ์„ ํฌ๊ธฐํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์ˆ˜ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋น„์ž”ํ‹ด ์žฅ์• ์™€์˜ ๊ฒฝ๊ณ„

์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃจ๋Š” ์ผ๋ฐ˜์ ์ธ ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Paxos, Raft)์€ ๋…ธ๋“œ๊ฐ€ ๋‹จ์ˆœํžˆ ๋ฉˆ์ถ”๋Š” Fail-stop ์žฅ์• ๋ฅผ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋…ธ๋“œ๊ฐ€ ์•…์˜์ ์œผ๋กœ ๊ฑฐ์ง“ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ฑฐ๋‚˜ ํ”„๋กœํ† ์ฝœ์„ ๋ณ€์กฐํ•˜๋Š” ๋น„์ž”ํ‹ด ์žฅ์• (Byzantine Fault) ์ƒํ™ฉ์€ ์ด๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•œ ํ•ฉ์˜ ๊ณผ์ •์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์—”์ง€๋‹ˆ์–ด๋ง ํ™˜๊ฒฝ์—์„œ๋Š” ๋…ธ๋“œ๊ฐ€ ์•„๊ตฐ(Trusted)์ด๋ผ๋Š” ๊ฐ€์ •ํ•˜์— ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ๊พ€ํ•˜์ง€๋งŒ, ๋ธ”๋ก์ฒด์ธ๊ณผ ๊ฐ™์ด ๋ˆ„๊ตฌ๋„ ๋ฏฟ์„ ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ์ด ์‹ ๋ขฐ์˜ ๊ฒฝ๊ณ„๋ฅผ ํ—ˆ๋ฌด๋Š” ๊ฒƒ์—์„œ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ•ฉ์˜๋ฅผ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ Quorum

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ๋ฌด๊ธฐ๋Š” ์—ญ์„ค์ ์ด๊ฒŒ๋„ โ€˜๋ชจ๋“  ๋…ธ๋“œ์˜ ๋™์˜๋ฅผ ๊ตฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒโ€™์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์‘๋‹ตํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ์Šคํ…œ์€ ๋‹จ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ๊ณ ์žฅ ๋‚˜๋„ ์ „์ฒด๊ฐ€ ๋งˆ๋น„๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฐœ๋…์ด ๋ฐ”๋กœ ์ฟผ๋Ÿผ(Quorum), ์ฆ‰ ์˜์‚ฌ๊ฒฐ์ •์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ •์กฑ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฟผ๋Ÿผ์€ ์‹œ์Šคํ…œ์˜ ๊ฐ€์šฉ์„ฑ(Availability)๊ณผ ์ผ๊ด€์„ฑ(Consistency) ์‚ฌ์ด์—์„œ ์ ˆ๋ฌ˜ํ•œ ๊ท ํ˜•์„ ์žก๋Š” ์ˆ˜ํ•™์  ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

์ฟผ๋Ÿผ์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋Š” โ€˜๊ต์ง‘ํ•ฉ์˜ ๋ณด์žฅโ€™์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋…ธ๋“œ ์ˆ˜๊ฐ€ $N$์ผ ๋•Œ, ์–ด๋–ค ๊ฒฐ์ •์— ์ฐธ์—ฌํ•œ ๋…ธ๋“œ๋“ค์˜ ์ง‘ํ•ฉ์ด ๋ฐ˜๋“œ์‹œ ์ด์ „ ๊ฒฐ์ •์— ์ฐธ์—ฌํ–ˆ๋˜ ๋…ธ๋“œ๋“ค์˜ ์ง‘ํ•ฉ๊ณผ ์ ์–ด๋„ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ๋ฅผ ๊ณต์œ ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์ค‘์ฒฉ๋œ ๋…ธ๋“œ๊ฐ€ ๋ฐ”๋กœ ๊ณผ๊ฑฐ์˜ ๊ธฐ์–ต(์ƒํƒœ)์„ ํ˜„์žฌ๋กœ ์ „๋‹ฌํ•˜๋Š” โ€˜์ง„์‹ค์˜ ์ „๋‹ฌ์žโ€™ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$N/2 + 1$

๊ฐ€์žฅ ํ”ํžˆ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์€ ๊ณผ๋ฐ˜์ˆ˜ ์ฟผ๋Ÿผ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๋…ธ๋“œ๊ฐ€ 5๋Œ€๋ผ๋ฉด 3๋Œ€($5/2 + 1$)์˜ ๋™์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์™œ ํ•˜ํ•„ ๊ณผ๋ฐ˜์ˆ˜์ผ๊นŒ์š”? ์ˆ˜ํ•™์ ์œผ๋กœ $N$๊ฐœ์˜ ์›์†Œ๋ฅผ ๊ฐ€์ง„ ์ง‘ํ•ฉ์—์„œ ๊ณผ๋ฐ˜์ˆ˜ ํฌ๊ธฐ์˜ ๋‘ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ถ”์ถœํ•˜๋ฉด, ์ด ๋‘ ์ง‘ํ•ฉ์€ ๋ฐ˜๋“œ์‹œ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ๊ณตํ†ต ์›์†Œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋ฐ–์— ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ์›๋ฆฌ๋Š” ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜(Network Partition) ์ƒํ™ฉ์—์„œ ๋น›์„ ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‘ ๊ทธ๋ฃน์œผ๋กœ ์ชผ๊ฐœ์กŒ์„ ๋•Œ, ๊ณผ๋ฐ˜์ˆ˜๋ฅผ ํ™•๋ณดํ•œ ๊ทธ๋ฃน์€ ์˜ค์ง ํ•œ์ชฝ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ๊ทธ๋ฃน์€ ์ •์กฑ์ˆ˜ ๋ฏธ๋‹ฌ๋กœ ์ธํ•ด ์–ด๋–ค ๊ฒฐ์ •๋„ ๋‚ด๋ฆด ์ˆ˜ ์—†๊ฒŒ ๋˜์–ด, ์‹œ์Šคํ…œ ์ „์ฒด์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ์ง„์‹ค์ด ๋ฐœ์ƒํ•˜๋Š” โ€˜์Šคํ”Œ๋ฆฟ ๋ธŒ๋ ˆ์ธ(Split-brain)โ€™ ํ˜„์ƒ์„ ์›์ฒœ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

Read/Write ์ฟผ๋Ÿผ์˜ ์ƒํ˜ธ์ž‘์šฉ

์ฟผ๋Ÿผ์€ ๋‹จ์ˆœํžˆ ๊ณผ๋ฐ˜์ˆ˜ ๋ชจ๋ธ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ๊ธฐ ์ฟผ๋Ÿผ($R$)๊ณผ ์“ฐ๊ธฐ ์ฟผ๋Ÿผ($W$)์„ ์กฐ์ •ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ ํŠน์„ฑ์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•  ์ฒ ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฟผ๋Ÿผ์˜ ๋Œ€์›์น™: $R + W > N$

์ฝ๊ธฐ ์ •์กฑ์ˆ˜์™€ ์“ฐ๊ธฐ ์ •์กฑ์ˆ˜์˜ ํ•ฉ์ด ์ „์ฒด ๋…ธ๋“œ ์ˆ˜($N$)๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด์•ผ๋งŒ ์ฝ๊ธฐ ์š”์ฒญ ์‹œ ์ตœ์†Œํ•œ ํ•œ ๋Œ€ ์ด์ƒ์˜ ๋…ธ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ€์žฅ ์ตœ์‹ ์˜ ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ์ž„์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Write-Heavy ์‹œ์Šคํ…œ: ์“ฐ๊ธฐ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด $W$๋ฅผ ๋‚ฎ์ถ”๊ณ  $R$์„ ๋†’์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋” ๋งŽ์€ ๋…ธ๋“œ๋ฅผ ๋’ค์ ธ์•ผ ํ•˜๋ฏ€๋กœ ์ฝ๊ธฐ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
  • Read-Heavy ์‹œ์Šคํ…œ: ์ฝ๊ธฐ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด $W$๋ฅผ ๋†’์ด๊ณ (๋ชจ๋“  ๋…ธ๋“œ์— ๋ณต์ œ) $R=1$๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋А ๋…ธ๋“œ์—์„œ ์ฝ์–ด๋„ ์ตœ์‹  ๋ฐ์ดํ„ฐ์ž„์„ ๋ณด์žฅ๋ฐ›์ง€๋งŒ, ์“ฐ๊ธฐ ์‹œ ๋‹จ ํ•œ ๋Œ€์˜ ๋…ธ๋“œ๋งŒ ์žฅ์• ๊ฐ€ ๋‚˜๋„ ์ „์ฒด ์“ฐ๊ธฐ๊ฐ€ ์‹คํŒจํ•  ์œ„ํ—˜์ด ์ปค์ง‘๋‹ˆ๋‹ค.

์žฅ์•  ํ—ˆ์šฉ ๋ฒ”์œ„

์ฟผ๋Ÿผ ์‹œ์Šคํ…œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ๋‚ดํ•ด์•ผ ํ•  ๋น„์šฉ์€ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋…ธ๋“œ๊ฐ€ $N$๋Œ€์ผ ๋•Œ, ์‹œ์Šคํ…œ์ด ์ •์ƒ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฌ๋”œ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์žฅ์•  ๋…ธ๋“œ ์ˆ˜๋Š” $F = (N-1)/2$์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • 3๋Œ€ ์ค‘ 1๋Œ€ ์žฅ์• ๊นŒ์ง€ ํ—ˆ์šฉ (์ฟผ๋Ÿผ 2๋Œ€)
  • 5๋Œ€ ์ค‘ 2๋Œ€ ์žฅ์• ๊นŒ์ง€ ํ—ˆ์šฉ (์ฟผ๋Ÿผ 3๋Œ€)

์—ฌ๊ธฐ์„œ ํฅ๋ฏธ๋กœ์šด ์ ์€ ๋…ธ๋“œ๋ฅผ 1๋Œ€ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ํ•ด์„œ ํ•ญ์ƒ ์žฅ์•  ํ—ˆ์šฉ ๋Šฅ๋ ฅ์ด ์„ ํ˜•์ ์œผ๋กœ ๋Š˜์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ 3๋Œ€์ผ ๋•Œ์™€ 4๋Œ€์ผ ๋•Œ ๋ชจ๋‘ ์žฅ์•  ํ—ˆ์šฉ์น˜๋Š” 1๋Œ€๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค(4๋Œ€์˜ ๊ณผ๋ฐ˜์ˆ˜๋Š” 3๋Œ€์ด๋ฏ€๋กœ). ๋”ฐ๋ผ์„œ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ํšจ์œจ์ ์ธ ์ฟผ๋Ÿผ ๊ตฌ์„ฑ์„ ์œ„ํ•ด ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ฃผ๋กœ ํ™€์ˆ˜๋กœ ์œ ์ง€ํ•˜๋Š” ์ „๋žต์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ Leader & Follower

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ผ๊นŒ์š”? ์•„์ด๋Ÿฌ๋‹ˆํ•˜๊ฒŒ๋„ ์˜์‚ฌ๊ฒฐ์ •๊ถŒ์„ ๋‹จ ํ•œ ๋ช…์—๊ฒŒ ๋ชฐ์•„์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์„œ๋กœ ์ œ์•ˆ์„ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ์‹ธ์šฐ๋Š” ๋Œ€์‹ , ๋ชจ๋‘๊ฐ€ ์ธ์ •ํ•˜๋Š” ๋‹จ ํ•œ ๋ช…์˜ ๋ฆฌ๋”(Leader)๊ฐ€ ๋ช…๋ น์˜ ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํŒ”๋กœ์›Œ(Follower)๋“ค์€ ๊ทธ ๊ฒฐ์ •์„ ๋ฌต๋ฌตํžˆ ๋”ฐ๋ฅด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต์  ๊ตฌ์กฐ๋Š” ๋ณต์žกํ•œ ํ•ฉ์˜ ๋ฌธ์ œ๋ฅผ ๋‹จ์ˆœํ•œ โ€˜๋ณต์ œโ€™ ๋ฌธ์ œ๋กœ ์น˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋”๋Š” ์‹œ์Šคํ…œ์˜ ์ž…๊ตฌ์ด์ž ์‚ฌ๋ นํƒ‘์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ๋ชจ๋“  ์š”์ฒญ์€ ๋ฆฌ๋”์—๊ฒŒ ์ง‘์ค‘๋˜๋ฉฐ, ๋ฆฌ๋”๋Š” ์ด ์š”์ฒญ๋“ค์— ์ผ๋ จ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋กœ๊ทธ์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ํŒ”๋กœ์›Œ๋“ค์€ ๋ฆฌ๋”๊ฐ€ ๋ณด๋‚ด์ฃผ๋Š” ๋กœ๊ทธ ์กฐ๊ฐ๋“ค์„ ์ž์‹ ์˜ ์žฅ๋ถ€์— ์˜ฎ๊ฒจ ์ ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ๋„คํŠธ์›Œํฌ ๋ฉ”์‹œ์ง€ ๊ตํ™˜ ํšŸ์ˆ˜๋Š” ํš๊ธฐ์ ์œผ๋กœ ์ค„์–ด๋“ค๊ณ , ์‹œ์Šคํ…œ์˜ ์ฒ˜๋ฆฌ๋Ÿ‰(Throughput)์€ ๋น„์•ฝ์ ์œผ๋กœ ์ƒ์Šนํ•ฉ๋‹ˆ๋‹ค.

์ž„๊ธฐ์™€ ํ•˜ํŠธ๋น„ํŠธ

์ ˆ๋Œ€ ๊ถŒ๋ ฅ์€ ๋ฐ˜๋“œ์‹œ ๋ถ€ํŒจํ•˜๊ฑฐ๋‚˜, ๋” ํ”ํ•œ ๊ฒฝ์šฐ๋กœ๋Š” โ€˜์ฃฝ์Šต๋‹ˆ๋‹คโ€™. ๋ฆฌ๋” ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ „์ฒด ์‹œ์Šคํ…œ์ด ๋งˆ๋น„๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ž„๊ธฐ(Term ๋˜๋Š” Epoch)๋ผ๋Š” ๋…ผ๋ฆฌ์  ์‹œ๊ฐ„ ๊ฐœ๋…์„ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋”๋Š” ์ž์‹ ์ด ์‚ด์•„์žˆ์Œ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ํŒ”๋กœ์›Œ๋“ค์—๊ฒŒ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ•˜ํŠธ๋น„ํŠธ(Heartbeat) ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. โ€œ๋‚˜๋Š” ์•„์ง ๊ฑด์žฌํ•˜๋‹ˆ ์ƒˆ๋กœ์šด ์„ ๊ฑฐ๋ฅผ ์—ด์ง€ ๋งˆ๋ผโ€๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ •ํ•ด์ง„ ์‹œ๊ฐ„(Election Timeout) ๋™์•ˆ ํ•˜ํŠธ๋น„ํŠธ๊ฐ€ ๋„์ฐฉํ•˜์ง€ ์•Š์œผ๋ฉด, ํŒ”๋กœ์›Œ๋“ค์€ ๋ฆฌ๋”์˜ ์œ ๋ช…์„ ๋‹ฌ๋ฆฌํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ฆ‰์‹œ ๋‹ค์Œ ์ž„๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ๋ฆฌ๋” ์„ ์ถœ ํ”„๋กœ์„ธ์Šค์— ๋Œ์ž…ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋”์‹ญ์˜ ์ •๋‹น์„ฑ ํ™•์ธ

์ƒˆ๋กœ์šด ๋ฆฌ๋”๊ฐ€ ๋‚˜ํƒ€๋‚ฌ์„ ๋•Œ, ํŒ”๋กœ์›Œ๋“ค์€ ๊ทธ๊ฐ€ ๋“ค๊ณ  ์žˆ๋Š” โ€˜์ž„๊ธฐ ๋ฒˆํ˜ธโ€™๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ž์‹ ์˜ ๊ธฐ๋ก๋ณด๋‹ค ๋‚ฎ์€ ๋ฒˆํ˜ธ๋ฅผ ๋“ค๊ณ  ์žˆ๋Š” ๋ฆฌ๋”๊ฐ€ ๋ช…๋ น์„ ๋‚ด๋ฆฐ๋‹ค๋ฉด, ํŒ”๋กœ์›Œ๋Š” ๊ทธ๋ฅผ โ€˜๊ณผ๊ฑฐ์˜ ์œ ๋ นโ€™์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ๋ช…๋ น์„ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ๋’ค๋Šฆ๊ฒŒ ๋„์ฐฉํ•œ ์˜› ๋ฆฌ๋”์˜ ๋ฉ”์‹œ์ง€๊ฐ€ ์‹œ์Šคํ…œ์„ ๊ต๋ž€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ํ•ต์‹ฌ ์•ˆ์ „ ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

์ˆ˜๋™์  ๋ณต์ œ์™€ ๊ฐ์‹œ

ํŒ”๋กœ์›Œ๋Š” ๊ฒฐ์ฝ” ๋ฌด๋Šฅํ•œ ์กด์žฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋ฆฌ๋”์˜ ๋ช…๋ น์„ ๋ณต์ œํ•˜๋Š” ๋™์‹œ์—, ๋ฆฌ๋”๊ฐ€ ์ฟผ๋Ÿผ(Quorum)์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํˆฌํ‘œ๊ถŒ์ž๋“ค์ž…๋‹ˆ๋‹ค. ๋ฆฌ๋”๊ฐ€ ๋ณด๋‚ธ ๋กœ๊ทธ๊ฐ€ ๊ณผ๋ฐ˜์ˆ˜ ์ด์ƒ์˜ ํŒ”๋กœ์›Œ์—๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌ๋˜์—ˆ์„ ๋•Œ๋งŒ ๊ทธ ๋ช…๋ น์€ โ€˜ํ™•์ •(Commit)โ€™๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฆฌ๋”๋Š” ์ œ์•ˆํ•˜๊ณ  ํŒ”๋กœ์›Œ๋Š” ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํŒ”๋กœ์›Œ๋Š” ๋ฆฌ๋”๊ฐ€ ๋œ ๋…ธ๋“œ๊ฐ€ ์ •๋ง๋กœ ์ž๊ฒฉ์ด ์žˆ๋Š”์ง€(๊ฐ€์žฅ ์ตœ์‹ ์˜ ๋กœ๊ทธ๋ฅผ ๊ฐ€์กŒ๋Š”์ง€)๋ฅผ ์„ ๊ฑฐ ๊ณผ์ •์—์„œ ์—„๊ฒฉํžˆ ์‹ฌ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋”์™€ ํŒ”๋กœ์›Œ์˜ ๊ด€๊ณ„๋Š” ๋‹จ์ˆœํ•œ ์ƒํ•˜๊ด€๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ, ํ•ฉ์˜๋ผ๋Š” ๊ณต๋™์˜ ๋ชฉํ‘œ๋ฅผ ์œ„ํ•ด ์„œ๋กœ๋ฅผ ๊ฒฌ์ œํ•˜๊ณ  ๋ณด์™„ํ•˜๋Š” ์œ ๊ธฐ์ ์ธ ํ˜‘๋ ฅ ๊ด€๊ณ„์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

๋ณ‘๋ชฉ ํ˜„์ƒ๊ณผ ์žฅ์•  ์กฐ์น˜

๋ชจ๋“  ์š”์ฒญ์ด ๋ฆฌ๋”๋ฅผ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค๋Š” ์ ์€ ๊ณง ๋ฆฌ๋”๊ฐ€ ์‹œ์Šคํ…œ์˜ ๋ณ‘๋ชฉ ์ง€์ (Bottleneck)์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฆฌ๋”๊ฐ€ ๊ต์ฒด๋˜๋Š” ์งง์€ ์ฐฐ๋‚˜์˜ ์ˆœ๊ฐ„ ๋™์•ˆ ์‹œ์Šคํ…œ์€ ์–ด๋– ํ•œ ์š”์ฒญ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” โ€˜๊ฐ€์šฉ์„ฑ ๊ณต๋ฐฑโ€™ ์ƒํƒœ์— ๋น ์ง‘๋‹ˆ๋‹ค. ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ค๊ณ„์ž๋“ค์€ ์ด ๊ณต๋ฐฑ์„ ๋ฐ€๋ฆฌ์ดˆ(ms) ๋‹จ์œ„๋กœ ์ค„์ด๊ธฐ ์œ„ํ•ด ์„ ๊ฑฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ตœ์ ํ™”ํ•˜๊ณ , ํ•˜ํŠธ๋น„ํŠธ ๊ฐ„๊ฒฉ์„ ์ •๊ตํ•˜๊ฒŒ ํŠœ๋‹ํ•˜๋Š” ๋ฐ ์ˆ˜๋งŽ์€ ๋ฐค์„ ์ง€์ƒˆ์›๋‹ˆ๋‹ค.

๐Ÿงฉ Safety & Liveness

๋ชจ๋“  ๋ถ„์‚ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ช…์„ธ์„œ ๊ฐ€์žฅ ๊นŠ์€ ๊ณณ์—๋Š” ๋‘ ๊ฐ€์ง€ ์•ฝ์†์ด ์ƒˆ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” โ€œ๊ฒฐ์ฝ” ํ‹€๋ฆฌ์ง€ ์•Š๊ฒ ๋‹คโ€๋Š” ์•ฝ์†์ด๊ณ , ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” โ€œ๊ฒฐ๊ตญ ํ•ด๋‚ด๊ฒ ๋‹คโ€๋Š” ์•ฝ์†์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ๊ฐ๊ฐ Safety์™€ Liveness๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด ๋‘ ์†์„ฑ์€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์ •๋‹น์„ฑ์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฐ€์žฅ ๊ทผ๋ณธ์ ์ธ ์žฃ๋Œ€์ด๋ฉฐ, ๋™์‹œ์— ์„œ๋กœ๋ฅผ ๋ฐ€์–ด๋‚ด๋Š” ๊ธด์žฅ ๊ด€๊ณ„์— ๋†“์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค.

Safety

Safety๋Š” ์‹œ์Šคํ…œ์˜ ์ •ํ•ฉ์„ฑ(Consistency)์„ ๋‹ด๋ณดํ•˜๋Š” ์žฅ์น˜์ž…๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ํ•ฉ์˜์—์„œ Safety๊ฐ€ ์ง€์ผœ์ง„๋‹ค๋Š” ๊ฒƒ์€, ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ๋กœ๊ทธ ์ธ๋ฑ์Šค์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ์ปค๋ฐ‹ํ•˜๋Š” ๋น„๊ทน์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ผ๋‹จ ์–ด๋–ค ๊ฐ’์ด โ€˜ํ•ฉ์˜โ€™๋˜์—ˆ๋‹ค๊ณ  ์„ ์–ธ๋˜๋ฉด, ๊ทธ ์‚ฌ์‹ค์€ ์˜์›ํžˆ ๋ณ€ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค(Immutability).

๋งŒ์•ฝ Safety๊ฐ€ ๊นจ์ง„๋‹ค๋ฉด, ์‚ฌ์šฉ์ž A๋Š” ์ž์‹ ์˜ ์ž”๊ณ ๊ฐ€ 100์›์ด๋ผ๊ณ  ๋ฏฟ๋Š”๋ฐ ์‚ฌ์šฉ์ž B์˜ ํ™”๋ฉด์—๋Š” 0์›์ด๋ผ๊ณ  ํ‘œ์‹œ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜ค์—ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์—”์ง€๋‹ˆ์–ด๋“ค์—๊ฒŒ Safety๋Š” ํƒ€ํ˜‘ ๋ถˆ๊ฐ€๋Šฅํ•œ ์„ฑ์—ญ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ž ์‹œ ๋ฉˆ์ถœ์ง€์–ธ์ •(Liveness ํฌ๊ธฐ), ์ž˜๋ชป๋œ ์ •๋ณด๋ฅผ ์ง„์งœ๋ผ๊ณ  ์šฐ๊ธฐ๋Š” ์ƒํ™ฉ์€ ์ ˆ๋Œ€๋กœ ์šฉ๋‚ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Safety์˜ ๋ถˆ๋ณ€์„ฑ

ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ Safety๋ฅผ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ํ”ํžˆ โ€˜๋‹จ์กฐ ์ฆ๊ฐ€(Monotonicity)โ€™ ์„ฑ์งˆ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ์ธ๋ฑ์Šค๋Š” ๋’ค๋กœ ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฉฐ, ํ•œ ๋ฒˆ ๊ฒฐ์ •๋œ ๋ฆฌ๋”์˜ ๊ณผ๊ฑฐ ์ด๋ ฅ์€ ๋ฎ์–ด์”Œ์›Œ์งˆ ์ˆ˜ ์—†๋‹ค๋Š” ๊ทœ์น™๋“ค์ด ๋ชจ์—ฌ ์‹œ์Šคํ…œ ์ „์ฒด์˜ Safety๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

Liveness

๋ฐ˜๋ฉด Liveness๋Š” ์‹œ์Šคํ…œ์˜ ์ „์ง„(Progress)๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ฆฌ ์™„๋ฒฝํ•˜๊ฒŒ ์•ˆ์ „ํ•œ ์‹œ์Šคํ…œ์ด๋ผ๋„, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ์˜์›ํžˆ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์ฃฝ์€ ์‹œ์Šคํ…œ๊ณผ ๋‹ค๋ฆ„์—†์Šต๋‹ˆ๋‹ค. Liveness๋Š” โ€œ์‹œ์Šคํ…œ์— ์ฐธ์—ฌํ•œ ์ •์ƒ์ ์ธ ๋…ธ๋“œ๋“ค์ด ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด, ๊ฒฐ๊ตญ์—๋Š” ํ•ฉ์˜์— ๋„๋‹ฌํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹คโ€๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์‹ค ์„ธ๊ณ„์—์„œ Liveness๋ฅผ ์œ„ํ˜‘ํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ ์€ ๋ฌดํ•œ ๋ฃจํ”„๋‚˜ ๊ต์ฐฉ ์ƒํƒœ(Deadlock)๊ฐ€ ์•„๋‹ˆ๋ผ, ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜๊ณผ ๋ฆฌ๋” ์„ ์ถœ์˜ ๋ฌดํ•œ ๋ฐ˜๋ณต์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ๋…ธ๋“œ๊ฐ€ ์ •ํ™•ํžˆ ๋™์‹œ์— ๋ฆฌ๋” ์„ ๊ฑฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋˜‘๊ฐ™์ด ํ•œ ํ‘œ์”ฉ ๋‚˜๋ˆ  ๊ฐ–๋Š” ์ƒํ™ฉ์ด ๋ฌดํ•œํžˆ ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ์‹œ์Šคํ…œ์˜ Liveness๋Š” ์†Œ๋ฉธํ•ฉ๋‹ˆ๋‹ค. Raft๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด โ€˜๋ฌด์ž‘์œ„ ์„ ๊ฑฐ ํƒ€์ž„์•„์›ƒโ€™์ด๋ผ๋Š” ์ง€๊ทนํžˆ ํ˜„์‹ค์ ์ด๊ณ  ์šฐ์•„ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ถ€๋ถ„ ๋™๊ธฐํ™” ๋ชจ๋ธ

์•ž์„œ ์–ธ๊ธ‰ํ•œ FLP ๋ถˆ๊ฐ€๋Šฅ์„ฑ ์›๋ฆฌ์— ๋”ฐ๋ฅด๋ฉด, ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋น„๋™๊ธฐ์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” Safety์™€ Liveness๋ฅผ ๋™์‹œ์— 100% ๋งŒ์กฑ์‹œํ‚ค๋Š” ๊ฒฐ์ •๋ก ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„๋Œ€์˜ ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ Partial Synchrony(๋ถ€๋ถ„ ๋™๊ธฐํ™”) ๋ชจ๋ธ์„ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋ธ์—์„œ ์‹œ์Šคํ…œ์€ ํ‰์†Œ์—๋Š” Safety์™€ Liveness๋ฅผ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๋ฉฐ ๊ธฐ๋ฏผํ•˜๊ฒŒ ์›€์ง์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทน์‹ฌํ•œ ๋„คํŠธ์›Œํฌ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฆ‰์‹œ Safety ๋ชจ๋“œ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. โ€œ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์—†๋‹ค๋ฉด ์‘๋‹ตํ•˜์ง€ ์•Š๋Š”๋‹คโ€๋Š” ์ „๋žต์„ ์ทจํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์žฅ์• ๊ฐ€ ํ•ด์†Œ๋˜๊ณ  ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์ด ์ผ์ • ๋ฒ”์œ„ ์•ˆ์œผ๋กœ ๋“ค์–ด์˜ค๋ฉด, ์‹œ์Šคํ…œ์€ ๋‹ค์‹œ Liveness๋ฅผ ํšŒ๋ณตํ•˜๊ณ  ๋ฉˆ์ท„๋˜ ํ•ฉ์˜๋ฅผ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

๊ฒฐ๊ตญ ์—”์ง€๋‹ˆ์–ด๋ง์€ ์„ ํƒ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

  • Safety ์šฐ์„ : ๊ธˆ์œต ์‹œ์Šคํ…œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ. ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•์„ฑ์ด ์ƒ๋ช…์ด๋ฉฐ, ์žฅ์•  ์‹œ ์„œ๋น„์Šค ์ค‘๋‹จ์„ ๊ฐ์ˆ˜ํ•˜๋”๋ผ๋„ ์ •ํ•ฉ์„ฑ์„ ์ง€ํ‚ต๋‹ˆ๋‹ค.
  • Liveness ์ค‘์‹ฌ: ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ, ๋‹จ์ˆœ ์บ์‹œ ์‹œ์Šคํ…œ. ์ตœ์‹  ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ์ผ๋‹จ ํ™”๋ฉด์— ๋ฌด์–ธ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•  ๋•Œ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. (๋ฌผ๋ก  ์ด ๊ฒฝ์šฐ ์—„๊ฒฉํ•œ ์˜๋ฏธ์˜ โ€˜ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜โ€™๋ณด๋‹ค๋Š” ์ตœ์ข… ์ผ๊ด€์„ฑ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)

Raft Election Restriction

ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ๋”์ฐํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” โ€˜๊ณผ๊ฑฐ๋ฅผ ๋ชจ๋ฅด๋Š” ๋ฆฌ๋”โ€™๊ฐ€ ์„ ์ถœ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์–ด๋–ค ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ๊ณผ๋ฐ˜์ˆ˜์˜ ๋™์˜๋ฅผ ์–ป์–ด ํ™•์ •(Commit)๋œ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ์ฑ„ ๋ฆฌ๋”๊ฐ€ ๋œ๋‹ค๋ฉด, ๊ทธ๋Š” ์ž์‹ ์˜ ๋น„์–ด์žˆ๋Š” ๋กœ๊ทธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค๋ฅธ ํŒ”๋กœ์›Œ๋“ค์˜ ์†Œ์ค‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์”Œ์›Œ ๋ฒ„๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. Raft๋Š” ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ถœ ์ œ์•ฝ ์กฐ๊ฑด(Election Restriction)์ด๋ผ๋Š” ๋งค์šฐ ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ์•ˆ์ „์žฅ์น˜๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ์˜ ์ตœ์‹ ์„ฑ

Raft์˜ ๋ฆฌ๋” ์„ ์ถœ ๊ณผ์ •์€ ๋ฏผ์ฃผ์ ์ด์ง€๋งŒ, ๋™์‹œ์— ์ฒ ์ €ํ•˜๊ฒŒ ์‹ค๋ ฅ(๋ฐ์ดํ„ฐ์˜ ์ตœ์‹ ์„ฑ) ์œ„์ฃผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์–ด๋–ค ํ›„๋ณด์ž๊ฐ€ ํˆฌํ‘œ๋ฅผ ์š”์ฒญ(RequestVote)ํ•˜๋”๋ผ๋„, ํˆฌํ‘œ๋ฅผ ํ•˜๋Š” ํŒ”๋กœ์›Œ๋Š” ํ›„๋ณด์ž์˜ ๋กœ๊ทธ๊ฐ€ ์ตœ์†Œํ•œ ์ž์‹ ์˜ ๋กœ๊ทธ๋ณด๋‹ค โ€˜์ตœ์‹ (At least as up-to-date)โ€™์ธ์ง€๋ฅผ ๋จผ์ € ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ›„๋ณด์ž์˜ ๋กœ๊ทธ๊ฐ€ ์ž์‹ ๋ณด๋‹ค ๋’ค์ฒ˜์ ธ ์žˆ๋‹ค๋ฉด, ํŒ”๋กœ์›Œ๋Š” ๊ฐ€์ฐจ ์—†์ด ํˆฌํ‘œ๋ฅผ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ โ€˜์ตœ์‹ ์„ฑโ€™์„ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ทœ์น™์„ ์—„๊ฒฉํžˆ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

  1. Term(์ž„๊ธฐ) ๋น„๊ต: ๋งˆ์ง€๋ง‰ ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ์˜ ์ž„๊ธฐ ๋ฒˆํ˜ธ๊ฐ€ ๋” ํฐ ์ชฝ์ด ๋” ์ตœ์‹ ์ด๋‹ค.
  2. Index(์ธ๋ฑ์Šค) ๋น„๊ต: ๋งŒ์•ฝ ์ž„๊ธฐ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ๋กœ๊ทธ์˜ ๊ธธ์ด๊ฐ€ ๋” ๊ธด(๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊ฐ€ ๋” ํฐ) ์ชฝ์ด ๋” ์ตœ์‹ ์ด๋‹ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
 * Raft Election Restriction
 * * Raft์˜ Safety๋ฅผ ๋ณด์žฅํ•˜๋Š” ํ•ต์‹ฌ ๋กœ์ง์ธ '๋กœ๊ทธ ์ตœ์‹ ์„ฑ ๋น„๊ต'๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
 * ํ›„๋ณด์ž๊ฐ€ ๊ณผ๋ฐ˜์ˆ˜์˜ ๋™์˜๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ํˆฌํ‘œ์ž์˜ ๋กœ๊ทธ๋ณด๋‹ค ์ตœ์‹ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 */
public class RaftNode {
    private int currentTerm;
    private String votedFor;
    private List<LogEntry> log;
    private NodeState state;

    // ... ๊ธฐํƒ€ ํ•„๋“œ ๋ฐ ์ƒ์„ฑ์ž ์ƒ๋žต ...

    /**
     * ํ›„๋ณด์ž๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ํ•œ RequestVote RPC๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
     */
    public synchronized VoteResponse handleRequestVote(VoteRequest args) {
        // 1. ์ž„๊ธฐ ๋น„๊ต: ํ›„๋ณด์ž์˜ ์ž„๊ธฐ๊ฐ€ ํ˜„์žฌ ๋‚˜์˜ ์ž„๊ธฐ๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ๊ฑฐ์ ˆ
        if (args.getTerm() < this.currentTerm) {
            return new VoteResponse(this.currentTerm, false);
        }

        // 2. ์ƒˆ๋กœ์šด ์ž„๊ธฐ ๋ฐœ๊ฒฌ: ์ž„๊ธฐ ์—…๋ฐ์ดํŠธ ๋ฐ ์ƒํƒœ ์ „ํ™˜
        if (args.getTerm() > this.currentTerm) {
            this.currentTerm = args.getTerm();
            this.votedFor = null;
            this.state = NodeState.FOLLOWER;
        }

        // 3. ํˆฌํ‘œ๊ถŒ ํ–‰์‚ฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ํ™•์ธ (votedFor ์ฒดํฌ)
        if (this.votedFor == null || this.votedFor.equals(args.getCandidateId())) {
            
            // ๋‚ด ๋กœ์ปฌ ๋กœ๊ทธ์˜ ๋งˆ์ง€๋ง‰ ์ƒํƒœ ์ถ”์ถœ
            int myLastLogIndex = this.log.size() - 1;
            int myLastLogTerm = (myLastLogIndex >= 0) ? this.log.get(myLastLogIndex).getTerm() : 0;

            /**
             * [ํ•ต์‹ฌ Logic] Raft Paper Section 5.4.1: Up-to-Date Restriction
             * * 1. ๋งˆ์ง€๋ง‰ ๋กœ๊ทธ์˜ ์ž„๊ธฐ(Term)๊ฐ€ ๋‹ค๋ฅด๋ฉด, ๋” ๋†’์€ ์ž„๊ธฐ๋ฅผ ๊ฐ€์ง„ ๋กœ๊ทธ๊ฐ€ ์ตœ์‹ ์ด๋‹ค.
             * 2. ๋งˆ์ง€๋ง‰ ๋กœ๊ทธ์˜ ์ž„๊ธฐ๊ฐ€ ๊ฐ™๋‹ค๋ฉด, ๋กœ๊ทธ์˜ ๊ธธ์ด(Index)๊ฐ€ ๋” ๊ธด ์ชฝ์ด ์ตœ์‹ ์ด๋‹ค.
             */
            boolean isUpToDate = (args.getLastLogTerm() > myLastLogTerm) ||
                                 (args.getLastLogTerm() == myLastLogTerm && 
                                  args.getLastLogIndex() >= myLastLogIndex);

            if (isUpToDate) {
                this.votedFor = args.getCandidateId();
                resetElectionTimer(); // ํˆฌํ‘œ ์Šน์ธ ์‹œ ์„ ๊ฑฐ ํƒ€์ด๋จธ ์ดˆ๊ธฐํ™”
                return new VoteResponse(this.currentTerm, true);
            }
        }

        // ๋กœ๊ทธ๊ฐ€ ์ตœ์‹ ์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์ด๋ฏธ ๋‹ค๋ฅธ ํ›„๋ณด์—๊ฒŒ ํˆฌํ‘œํ•œ ๊ฒฝ์šฐ
        return new VoteResponse(this.currentTerm, false);
    }
}

/**
 * ๋กœ๊ทธ ์—”ํŠธ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด
 */
class LogEntry {
    private final int term;
    private final String command;

    public LogEntry(int term, String command) {
        this.term = term;
        this.command = command;
    }

    public int getTerm() { return term; }
}

ํˆฌํ‘œ ๊ฑฐ๋ถ€์˜ ๋…ผ๋ฆฌ

์ด ์ œ์•ฝ ์กฐ๊ฑด์ด ์™œ ์ค‘์š”ํ•œ์ง€ ์ดํ•ดํ•˜๋ ค๋ฉด ์ฟผ๋Ÿผ(Quorum)์˜ ์›๋ฆฌ๋ฅผ ๋‹ค์‹œ ๋– ์˜ฌ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋กœ๊ทธ๊ฐ€ ์ปค๋ฐ‹๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ด๋ฏธ ๊ณผ๋ฐ˜์ˆ˜(Quorum)์˜ ๋…ธ๋“œ์— ํ•ด๋‹น ๋กœ๊ทธ๊ฐ€ ๋ณต์ œ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ๋ฆฌ๋”๊ฐ€ ์„ ์ถœ๋˜๊ธฐ ์œ„ํ•ด์„œ๋„ ์—ญ์‹œ ๊ณผ๋ฐ˜์ˆ˜์˜ ํˆฌํ‘œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‘ ๊ณผ๋ฐ˜์ˆ˜ ์ง‘ํ•ฉ์€ ๋ฐ˜๋“œ์‹œ ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ณต์œ ๋œ ๋…ธ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ์ปค๋ฐ‹๋œ ์ตœ์‹  ๋กœ๊ทธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ์„ ์ถœ ์ œ์•ฝ ์กฐ๊ฑด์— ์˜ํ•ด ์ž์‹ ๋ณด๋‹ค ๋’ค์ฒ˜์ง„ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ง„ ํ›„๋ณด์ž์—๊ฒŒ๋Š” ์ ˆ๋Œ€ ํˆฌํ‘œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ์ปค๋ฐ‹๋œ ๋ชจ๋“  ๋กœ๊ทธ๋ฅผ ๋ณด์œ ํ•œ ๋…ธ๋“œ๋งŒ์ด ๋ฆฌ๋”๋กœ ๋‹น์„ ๋  ์ˆ˜ ์žˆ๋Š” ์ˆ˜ํ•™์  ํ•„์—ฐ์„ฑ์ด ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค. Paxos๊ฐ€ ๋ณต์žกํ•œ ๋กœ๊ทธ ๋ณต๊ตฌ ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ, Raft๋Š” ์„ ์ถœ ๋‹จ๊ณ„์—์„œ ์•„์˜ˆ ์ž๊ฒฉ ์—†๋Š” ๋ฆฌ๋”๋ฅผ ๊ฑธ๋Ÿฌ๋ƒ„์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ๋‹จ์ˆœํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ ๋งค์นญ ์†์„ฑ

Raft์˜ ์„ ์ถœ ์ œ์•ฝ ์กฐ๊ฑด์€ โ€œ๋ฆฌ๋”๊ฐ€ ๋œ ๋…ธ๋“œ์˜ ๋กœ๊ทธ๋Š” ๋ฌด์กฐ๊ฑด ์˜ณ๋‹คโ€๋Š” ์ „์ œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌ๋”๋Š” ํŒ”๋กœ์›Œ์˜ ๋กœ๊ทธ๋ฅผ ์ ˆ๋Œ€ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๋ฎ์–ด์“ฐ์ง€ ์•Š์œผ๋ฉฐ, ์˜ค์ง ์ž์‹ ์˜ ๋กœ๊ทธ๋ฅผ ํŒ”๋กœ์›Œ์—๊ฒŒ ๊ฐ•์ œ๋กœ ๋ณต์ œํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณต์ œ ๋กœ์ง์„ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋‹จ์ˆœํ™”ํ•˜์—ฌ ๊ตฌํ˜„์˜ ๋ณต์žก์„ฑ์„ ๋‚ฎ์ถ”๋Š” ๊ฒฐ์ •์ ์ธ ์š”์ธ์ด ๋ฉ๋‹ˆ๋‹ค.

์ตœ์‹ ์„ฑ ์ฒดํฌ์˜ ํ•œ๊ณ„์™€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

ํ•˜์ง€๋งŒ ์ด ์šฐ์•„ํ•œ ์„ค๊ณ„์—๋„ ์—”์ง€๋‹ˆ์–ด๋ง์ ์ธ ๋น„์šฉ์€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

  • ์„ ๊ฑฐ ์ง€์—ฐ (Election Delay): ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜์ด๋‚˜ ํŠน์ • ๋…ธ๋“œ์˜ ์žฆ์€ ์žฌ์‹œ์ž‘์œผ๋กœ ์ธํ•ด ๋กœ๊ทธ๊ฐ€ ํŒŒํŽธํ™”๋œ ๊ฒฝ์šฐ, ์„œ๋กœ๊ฐ€ ์„œ๋กœ์˜ ์ตœ์‹ ์„ฑ์„ ์ธ์ •ํ•˜์ง€ ์•Š์•„ ํˆฌํ‘œ๊ฐ€ ๋ฌด์‚ฐ๋˜๊ณ  ์žฌ์„ ๊ฑฐ๊ฐ€ ๋ฐ˜๋ณต๋˜๋Š” โ€˜Liveness ์ €ํ•˜โ€™ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณต๊ตฌ ๋น„์šฉ: ๊ฐ€์žฅ ์ตœ์‹  ๋กœ๊ทธ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๊ฐ€ ํ•˜๋“œ์›จ์–ด ์žฅ์• ๋กœ ์˜๊ตฌํžˆ ๊ฒฉ๋ฆฌ๋œ๋‹ค๋ฉด, ์‹œ์Šคํ…œ์€ ์ฐจ์„ ์˜ ๋กœ๊ทธ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ๋ฆฌ๋”๋กœ ์„ธ์šฐ๊ธฐ ์œ„ํ•ด ๋ณต์žกํ•œ ์ˆ˜๋™ ๊ฐœ์ž…์ด๋‚˜ ํŠน์ˆ˜ํ•œ ํ•ฉ์˜ ๋ฌด์‹œ ์ „๋žต์„ ์จ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ Raft์˜ ์„ ์ถœ ์ œ์•ฝ ์กฐ๊ฑด์€ โ€œ์กฐ๊ธˆ ๋Šฆ๋”๋ผ๋„(Liveness), ๊ณผ๊ฑฐ์˜ ์ง„์‹ค์„ ์žƒ์–ด๋ฒ„๋ฆฌ๋Š” ์ผ(Safety)์€ ์ ˆ๋Œ€ ์—†์–ด์•ผ ํ•œ๋‹คโ€๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์ฒ ํ•™์  ์„ ํƒ์ด ๊ตฌํ˜„๋œ ๊ฒฐ๊ณผ๋ฌผ์ž…๋‹ˆ๋‹ค.

Summary

ํ•ฉ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๋‹จ์ผํ•œ ์ง„์‹ค์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋…ผ๋ฆฌ์  ํˆฌ์Ÿ์˜ ์‚ฐ๋ฌผ์ž…๋‹ˆ๋‹ค. ๋ณต์ œ ์ƒํƒœ ๋จธ์‹ (SMR)์„ ํ†ตํ•ด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ๊ฑท๊ฒŒ ํ•˜๋ฉฐ, ์ฟผ๋Ÿผ(Quorum)์ด๋ผ๋Š” ์ˆ˜ํ•™์  ๊ฒฝ๊ณ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋ฌผ๋ฆฌ์ ์ธ ๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ ์†์—์„œ๋„ ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์ˆ˜ํ˜ธํ•ฉ๋‹ˆ๋‹ค. Raft์™€ ๊ฐ™์€ ํ˜„๋Œ€์  ํ”„๋กœํ† ์ฝœ์€ ํšจ์œจ์ ์ธ ๋ฆฌ๋”์‹ญ ๋ชจ๋ธ๊ณผ ์—„๊ฒฉํ•œ ์„ ์ถœ ์ œ์•ฝ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ๋ณต์žก์„ฑ์„ ์ธ๊ฐ„์ด ์ดํ•ด ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์œผ๋กœ ์ œ์–ดํ•˜๋ฉด์„œ๋„ ์•ˆ์ „์„ฑ(Safety)์„ ์™„๋ฒฝํžˆ ์ฆ๋ช…ํ•ด๋ƒ…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํ•ฉ์˜๋ž€ ๋ถˆ์™„์ „ํ•œ ๋ฌผ๋ฆฌ ์„ธ๊ณ„ ์œ„์— ์™„๋ฒฝํ•œ ๋…ผ๋ฆฌ ์ฒด๊ณ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ์—”์ง€๋‹ˆ์–ด๋“ค์˜ ์ •๊ตํ•œ ํƒ€ํ˜‘์ด์ž ์˜ˆ์ˆ ์ž…๋‹ˆ๋‹ค.

References

This post is licensed under CC BY 4.0 by the author.