์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ ๊ณ ๊ฐ€์šฉ์„ฑ(HA) ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์„ค๊ณ„

๐Ÿš€ ๊ณ ๊ฐ€์šฉ์„ฑ(HA) ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์„ค๊ณ„

์„œ๋ฒ„๊ฐ€ ์ ˆ๋Œ€ ์ฃฝ์ง€ ์•Š๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ์ด์•ผ๊ธฐ

High Availability Cluster Architecture Server 1 Active Server 2 Standby Server 3 Standby Load Balancer LB Shared Storage Health Monitor ๐Ÿ‘ฅ

๐ŸŽฏ ๊ณ ๊ฐ€์šฉ์„ฑ์ด ๋ญ๊ธธ๋ž˜ ์ด๋ ‡๊ฒŒ ๋‚œ๋ฆฌ์•ผ?

์นœ๊ตฌ์•ผ, ์ƒ์ƒํ•ด๋ด. ๋„ค๊ฐ€ ์šด์˜ํ•˜๋Š” ์‡ผํ•‘๋ชฐ ์„œ๋ฒ„๊ฐ€ ๋”ฑ ๋ธ”๋ž™ํ”„๋ผ์ด๋ฐ์ด ๋‹น์ผ์— ๋ป—์–ด๋ฒ„๋ ธ์–ด. ๐Ÿ’€
์ˆ˜์ฒœ ๋ช…์˜ ๊ณ ๊ฐ์ด ๊ฒฐ์ œํ•˜๋ ค๊ณ  ๋Œ€๊ธฐ ์ค‘์ธ๋ฐ ์„œ๋ฒ„๋Š” "์•ˆ๋…•ํžˆ ๊ณ„์„ธ์š”~" ํ•˜๊ณ  ํ‡ด๊ทผํ•ด๋ฒ„๋ฆฐ ๊ฑฐ์ง€.
์ด๊ฒŒ ๋ฐ”๋กœ ๊ณ ๊ฐ€์šฉ์„ฑ(High Availability, HA)์ด ํ•„์š”ํ•œ ์ด์œ ์•ผ!

๊ณ ๊ฐ€์šฉ์„ฑ์ด๋ž€ ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ์ ˆ๋Œ€ ์ฃฝ์ง€ ์•Š๋„๋ก ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์ด์•ผ.
์ •ํ™•ํžˆ๋Š” 99.9%, 99.99%, ์‹ฌ์ง€์–ด 99.999%์˜ ๊ฐ€๋™๋ฅ ์„ ๋ณด์žฅํ•˜๋Š” ์‹œ์Šคํ…œ ์„ค๊ณ„๋ฅผ ๋งํ•ด.
99.999%๊ฐ€ ๋ญ๋ƒ๊ณ ? 1๋…„์— ๋”ฑ 5๋ถ„ 15์ดˆ๋งŒ ๋‹ค์šดํƒ€์ž„์ด ํ—ˆ์šฉ๋œ๋‹ค๋Š” ๋œป์ด์•ผ. ๐Ÿ˜ฑ

๐Ÿ’ก ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค:
์•„๋งˆ์กด์ด 1์‹œ๊ฐ„ ๋™์•ˆ ์„œ๋น„์Šค ์žฅ์• ๋ฅผ ๊ฒช์œผ๋ฉด ์•ฝ 1์–ต ๋‹ฌ๋Ÿฌ์˜ ์†์‹ค์„ ๋ณธ๋‹ค๊ณ  ํ•ด.
๊ทธ๋Ÿฌ๋‹ˆ๊นŒ 1๋ถ„์— ์•ฝ 167๋งŒ ๋‹ฌ๋Ÿฌ์”ฉ ๋‚ ์•„๊ฐ€๋Š” ๊ฑฐ์ง€. ์ด์ œ ์™œ ๋Œ€๊ธฐ์—…๋“ค์ด HA์— ๋ชฉ์ˆจ ๊ฑฐ๋Š”์ง€ ์•Œ๊ฒ ์ง€?

๐Ÿ—๏ธ ํด๋Ÿฌ์Šคํ„ฐ๋ง์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

ํด๋Ÿฌ์Šคํ„ฐ๋ง(Clustering)์€ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ๋งˆ์น˜ ํ•˜๋‚˜์˜ ์„œ๋ฒ„์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ธฐ์ˆ ์ด์•ผ.
ํ˜ผ์ž์„œ 100kg์„ ๋“ค๊ธฐ ํž˜๋“ค๋ฉด ์นœ๊ตฌ 3๋ช…์ด๋ž‘ ๊ฐ™์ด ๋“ค๋ฉด ๋˜์ž–์•„? ๊ทธ๊ฒŒ ๋ฐ”๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ง์˜ ์ฒ ํ•™์ด์•ผ! ๐Ÿ’ช

๐Ÿ”น ํด๋Ÿฌ์Šคํ„ฐ๋ง์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

1. ๋…ธ๋“œ(Node) - ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ผ์›๋“ค

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

2. ํ•˜ํŠธ๋น„ํŠธ(Heartbeat) - ์‚ด์•„์žˆ๋‹ˆ? ํ™•์ธํ•˜๋Š” ์‹ ํ˜ธ

๋…ธ๋“œ๋“ค์€ ์„œ๋กœ์—๊ฒŒ ์ฃผ๊ธฐ์ ์œผ๋กœ "๋‚˜ ์‚ด์•„์žˆ์–ด!"๋ผ๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด.
์ด๊ฑธ ํ•˜ํŠธ๋น„ํŠธ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋ณดํ†ต 1~2์ดˆ๋งˆ๋‹ค ํ•œ ๋ฒˆ์”ฉ ์ฒดํฌํ•ด.
๋งŒ์•ฝ 3๋ฒˆ ์—ฐ์†์œผ๋กœ ์‘๋‹ต์ด ์—†์œผ๋ฉด? "์–˜ ์ฃฝ์—ˆ๋‚˜๋ด" ํ•˜๊ณ  ํŒ๋‹จํ•˜๋Š” ๊ฑฐ์ง€. ๐Ÿ’”

3. ํŽ˜์ผ์˜ค๋ฒ„(Failover) - ์ž๋™ ๊ต์ฒด ์‹œ์Šคํ…œ

Active ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜๋ฉด Standby ์„œ๋ฒ„๊ฐ€ ์ž๋™์œผ๋กœ ๊ทธ ์—ญํ• ์„ ๋Œ€์‹ ํ•˜๋Š” ๊ฑธ ํŽ˜์ผ์˜ค๋ฒ„๋ผ๊ณ  ํ•ด.
์ด ๊ณผ์ •์ด ๋น ๋ฅด๋ฉด ๋น ๋ฅผ์ˆ˜๋ก ์ข‹์€๋ฐ, ๋ณดํ†ต 30์ดˆ ์ด๋‚ด์— ์™„๋ฃŒ๋˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•ด.
์ž˜ ๋งŒ๋“ค์–ด์ง„ ์‹œ์Šคํ…œ์€ 5์ดˆ ์ด๋‚ด์—๋„ ๊ฐ€๋Šฅํ•˜์ง€! โšก

4. ํŽ˜์ผ๋ฐฑ(Failback) - ์›๋ž˜๋Œ€๋กœ ๋Œ์•„๊ฐ€๊ธฐ

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ ์›๋ž˜ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ Active ์ƒํƒœ๋กœ ๋ณต๊ตฌํ•˜๋Š” ๊ณผ์ •์ด์•ผ.
์ž๋™์œผ๋กœ ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌ์ž๊ฐ€ ํŒ๋‹จํ•ด์„œ ํ•  ์ˆ˜๋„ ์žˆ์–ด.
๋ณดํ†ต์€ ์ˆ˜๋™ ํŽ˜์ผ๋ฐฑ์„ ์„ ํ˜ธํ•˜๋Š”๋ฐ, ์•ˆ์ •์„ฑ์„ ํ™•์ธํ•œ ํ›„์— ๋ณต๊ตฌํ•˜๋Š” ๊ฒŒ ์•ˆ์ „ํ•˜๊ฑฐ๋“ .

๐ŸŽจ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์•„ํ‚คํ…์ฒ˜ ์œ ํ˜•

๐Ÿ”ธ Active-Standby (์•กํ‹ฐ๋ธŒ-์Šคํƒ ๋ฐ”์ด)

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๊ณ  ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ์กฐ์•ผ.
ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋Š” ์—ด์‹ฌํžˆ ์ผํ•˜๊ณ (Active), ๋‹ค๋ฅธ ์„œ๋ฒ„๋Š” ๋Œ€๊ธฐํ•˜๋ฉด์„œ ๊ฐ์‹œ๋งŒ ํ•ด(Standby).
Active ์„œ๋ฒ„๊ฐ€ ์ฃฝ์œผ๋ฉด Standby๊ฐ€ ์ฆ‰์‹œ Active๋กœ ์ „ํ™˜๋˜๋Š” ๋ฐฉ์‹์ด์ง€.

โœ… ์žฅ์ :
โ€ข ๊ตฌํ˜„์ด ๋น„๊ต์  ๊ฐ„๋‹จํ•ด
โ€ข ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ์œ ์ง€๊ฐ€ ์‰ฌ์›Œ
โ€ข ์žฅ์•  ๋ฐœ์ƒ ์‹œ ๋ช…ํ™•ํ•œ ์ „ํ™˜ ํ”„๋กœ์„ธ์Šค

โŒ ๋‹จ์ :
โ€ข Standby ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚ญ๋น„๋ผ (๋†€๊ณ  ์žˆ์œผ๋‹ˆ๊นŒ)
โ€ข ์ „์ฒด ์ฒ˜๋ฆฌ ์šฉ๋Ÿ‰์ด Active ์„œ๋ฒ„ ํ•˜๋‚˜์— ์˜์กด
โ€ข ๋น„์šฉ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์–ด

๐Ÿ”ธ Active-Active (์•กํ‹ฐ๋ธŒ-์•กํ‹ฐ๋ธŒ)

๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ๋™์‹œ์— ์ผํ•˜๋Š” ๊ตฌ์กฐ์•ผ! ๐Ÿ’ผ
๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ์‹œํ‚ค๊ณ , ๊ฐ ์„œ๋ฒ„๋Š” ๋™๋“ฑํ•˜๊ฒŒ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด.
ํ•œ ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋„ ๋‚˜๋จธ์ง€ ์„œ๋ฒ„๋“ค์ด ๊ทธ ๋ถ€ํ•˜๋ฅผ ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌํ•˜์ง€.

โœ… ์žฅ์ :
โ€ข ๋ชจ๋“  ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค๋ฅผ 100% ํ™œ์šฉ
โ€ข ์ˆ˜ํ‰ ํ™•์žฅ(Scale-out)์ด ์‰ฌ์›Œ
โ€ข ๋†’์€ ์ฒ˜๋ฆฌ ์šฉ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ
โ€ข ๋น„์šฉ ๋Œ€๋น„ ํšจ์œจ์ด ์ข‹์•„

โŒ ๋‹จ์ :
โ€ข ์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด
โ€ข ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด
โ€ข ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋†’์•„
โ€ข ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ๊นŒ๋‹ค๋กœ์›Œ

๐Ÿ”ธ N+1 ํด๋Ÿฌ์Šคํ„ฐ๋ง

N๊ฐœ์˜ Active ์„œ๋ฒ„์™€ 1๊ฐœ์˜ Standby ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.
์˜ˆ๋ฅผ ๋“ค์–ด 3๊ฐœ์˜ Active ์„œ๋ฒ„๊ฐ€ ์žˆ๊ณ , 1๊ฐœ์˜ Standby๊ฐ€ ๋ชจ๋“  ์„œ๋ฒ„์˜ ๋ฐฑ์—… ์—ญํ• ์„ ํ•˜๋Š” ๊ฑฐ์ง€.
์–ด๋А ์„œ๋ฒ„๊ฐ€ ์ฃฝ์–ด๋„ ๊ทธ Standby๊ฐ€ ๋Œ€์‹  ๋“ค์–ด๊ฐ€๋Š” ๊ตฌ์กฐ์•ผ.

๐ŸŽฏ ์‹ค๋ฌด ํŒ:
์ค‘์†Œ๊ทœ๋ชจ ์„œ๋น„์Šค์—์„œ๋Š” Active-Standby๋กœ ์‹œ์ž‘ํ•ด์„œ ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•˜๋ฉด Active-Active๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด์•ผ.
์ฒ˜์Œ๋ถ€ํ„ฐ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋กœ ๊ฐ€๋ฉด ๊ด€๋ฆฌ ๋ถ€๋‹ด๋งŒ ์ปค์ง€๊ฑฐ๋“ !

โš™๏ธ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์˜ ์—ญํ• 

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ(Load Balancer)๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ง์˜ ํ•ต์‹ฌ ์ค‘์˜ ํ•ต์‹ฌ์ด์•ผ! ๐ŸŽฏ
๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ์ ์ ˆํžˆ ๋ถ„์‚ฐ์‹œ์ผœ์ฃผ๋Š” ๊ตํ†ต๊ฒฝ์ฐฐ ๊ฐ™์€ ์กด์žฌ์ง€.
์ด ์นœ๊ตฌ๊ฐ€ ์—†์œผ๋ฉด Active-Active ๊ตฌ์กฐ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ด.

๐Ÿ”น ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜

1. ๋ผ์šด๋“œ ๋กœ๋นˆ (Round Robin)

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฐฉ์‹์ด์•ผ. ์„œ๋ฒ„1 โ†’ ์„œ๋ฒ„2 โ†’ ์„œ๋ฒ„3 โ†’ ์„œ๋ฒ„1... ์ด๋ ‡๊ฒŒ ์ˆœ์„œ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉด์„œ ๋ฐฐ๋ถ„ํ•ด.
๋ชจ๋“  ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์ด ๋น„์Šทํ•  ๋•Œ ํšจ๊ณผ์ ์ด์ง€.
๊ตฌํ˜„๋„ ์‰ฝ๊ณ  ๊ณตํ‰ํ•˜๊ฒŒ ๋ถ„์‚ฐ๋˜์ง€๋งŒ, ์„œ๋ฒ„๋ณ„ ๋ถ€ํ•˜ ์ฐจ์ด๋Š” ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•ด.

2. ์ตœ์†Œ ์—ฐ๊ฒฐ (Least Connection)

ํ˜„์žฌ ์—ฐ๊ฒฐ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์€ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด์•ผ.
์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ ์„œ๋ฒ„์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•ด์„œ ๊ฐ€์žฅ ์—ฌ์œ ๋กœ์šด ์„œ๋ฒ„๋ฅผ ์„ ํƒํ•˜์ง€.
์„ธ์…˜์ด ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ์„œ๋น„์Šค์— ์ ํ•ฉํ•ด! ๐Ÿ“Š

3. IP ํ•ด์‹œ (IP Hash)

ํด๋ผ์ด์–ธํŠธ์˜ IP ์ฃผ์†Œ๋ฅผ ํ•ด์‹ฑํ•ด์„œ ํŠน์ • ์„œ๋ฒ„๋กœ ๊ณ ์ • ๋ฐฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.
๊ฐ™์€ ์‚ฌ์šฉ์ž๋Š” ํ•ญ์ƒ ๊ฐ™์€ ์„œ๋ฒ„๋กœ ์—ฐ๊ฒฐ๋˜๋‹ˆ๊นŒ ์„ธ์…˜ ๊ด€๋ฆฌ๊ฐ€ ํŽธํ•ด.
ํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์ œ๊ฑฐ๋˜๋ฉด ํ•ด์‹œ ํ…Œ์ด๋ธ”์ด ์žฌ๊ตฌ์„ฑ๋ผ์•ผ ํ•ด์„œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ด.

4. ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ (Weighted)

์„œ๋ฒ„๋งˆ๋‹ค ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ด์„œ ์„ฑ๋Šฅ์ด ์ข‹์€ ์„œ๋ฒ„์— ๋” ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด์•ผ.
์˜ˆ๋ฅผ ๋“ค์–ด ์„œ๋ฒ„1(๊ฐ€์ค‘์น˜ 3), ์„œ๋ฒ„2(๊ฐ€์ค‘์น˜ 2), ์„œ๋ฒ„3(๊ฐ€์ค‘์น˜ 1)์ด๋ฉด
์„œ๋ฒ„1์ด ์ „์ฒด ํŠธ๋ž˜ํ”ฝ์˜ 50%๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฑฐ์ง€. ๐Ÿ’ช

๐Ÿ”น ํ—ฌ์Šค ์ฒดํฌ (Health Check)

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋Š” ๊ฐ ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•ด์•ผ ํ•ด.
์ด๊ฑธ ํ—ฌ์Šค ์ฒดํฌ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด:

๐Ÿ” ํ—ฌ์Šค ์ฒดํฌ ๋ฐฉ๋ฒ•๋“ค:

โ€ข TCP ์ฒดํฌ: ํฌํŠธ๊ฐ€ ์—ด๋ ค์žˆ๋Š”์ง€๋งŒ ํ™•์ธ (๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จ)
โ€ข HTTP ์ฒดํฌ: ํŠน์ • URL์— ์š”์ฒญ์„ ๋ณด๋‚ด์„œ 200 OK ์‘๋‹ต ํ™•์ธ
โ€ข ์ปค์Šคํ…€ ์ฒดํฌ: ์‹ค์ œ DB ์—ฐ๊ฒฐ, ๋””์Šคํฌ ์šฉ๋Ÿ‰ ๋“ฑ ์„ธ๋ถ€ ํ•ญ๋ชฉ ํ™•์ธ

๋ณดํ†ต 5~10์ดˆ๋งˆ๋‹ค ์ฒดํฌํ•˜๊ณ , ์—ฐ์† 3ํšŒ ์‹คํŒจํ•˜๋ฉด ํ•ด๋‹น ์„œ๋ฒ„๋ฅผ ์ œ์™ธ์‹œ์ผœ.

๐Ÿ’พ ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€์™€ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”

ํด๋Ÿฌ์Šคํ„ฐ๋ง์—์„œ ๊ฐ€์žฅ ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์•ผ! ๐Ÿ—„๏ธ
์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋ฉด ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ .
์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๋ณด์ž.

๐Ÿ”น ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€ ๋ฐฉ์‹

๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ํ•˜๋‚˜์˜ ์ค‘์•™ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.
SAN(Storage Area Network)์ด๋‚˜ NAS(Network Attached Storage)๋ฅผ ์‚ฌ์šฉํ•˜์ง€.
๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์€ ์™„๋ฒฝํ•˜์ง€๋งŒ, ์Šคํ† ๋ฆฌ์ง€๊ฐ€ ๋‹จ์ผ ์žฅ์• ์ (SPOF)์ด ๋  ์ˆ˜ ์žˆ์–ด.

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ:
๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€ ์ž์ฒด๋„ ์ด์ค‘ํ™”ํ•ด์•ผ ํ•ด!
RAID ๊ตฌ์„ฑ, ์Šคํ† ๋ฆฌ์ง€ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋“ฑ์œผ๋กœ ์Šคํ† ๋ฆฌ์ง€์˜ ๊ฐ€์šฉ์„ฑ๋„ ๋ณด์žฅํ•ด์•ผ ์ง„์ •ํ•œ HA๊ฐ€ ์™„์„ฑ๋ผ.

๐Ÿ”น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ (Replication)

๊ฐ ์„œ๋ฒ„๊ฐ€ ์ž์ฒด ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๊ฐ€์ง€๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณต์ œํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.
MySQL์˜ Master-Slave, PostgreSQL์˜ Streaming Replication ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ด์ง€.

๋™๊ธฐ์‹ ๋ณต์ œ (Synchronous Replication)

๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ ๋ชจ๋“  ๋ณต์ œ๋ณธ์— ๋™์‹œ์— ๊ธฐ๋กํ•˜๊ณ  ํ™•์ธ๋ฐ›๋Š” ๋ฐฉ์‹์ด์•ผ.
๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์€ ์™„๋ฒฝํ•˜์ง€๋งŒ, ์„ฑ๋Šฅ์ด ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์–ด.
๊ธˆ์œต ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ์ ˆ๋Œ€ ์•ˆ ๋˜๋Š” ๊ณณ์—์„œ ์‚ฌ์šฉํ•ด. ๐Ÿฆ

๋น„๋™๊ธฐ์‹ ๋ณต์ œ (Asynchronous Replication)

Primary์— ๋จผ์ € ์“ฐ๊ณ , ๋‚˜์ค‘์— Replica์— ๋ณต์ œํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.
์„ฑ๋Šฅ์€ ์ข‹์ง€๋งŒ, ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋  ์ˆ˜ ์žˆ์–ด.
๋Œ€๋ถ€๋ถ„์˜ ์›น ์„œ๋น„์Šค๋Š” ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ง€. ๋น ๋ฅด๊ฑฐ๋“ ! โšก

๐Ÿ”น ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ

GlusterFS, Ceph, HDFS ๊ฐ™์€ ๋ถ„์‚ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์–ด.
๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๋…ธ๋“œ์— ๋ถ„์‚ฐ ์ €์žฅํ•˜๊ณ , ์ž๋™์œผ๋กœ ๋ณต์ œ๋ณธ์„ ๊ด€๋ฆฌํ•ด์ค˜.
๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋น…๋ฐ์ดํ„ฐ ํ™˜๊ฒฝ์—์„œ ๋งŽ์ด ์“ฐ์ด์ง€.

๐Ÿ” ์„ธ์…˜ ๊ด€๋ฆฌ ์ „๋žต

Active-Active ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ๊ณจ์น˜ ์•„ํ”ˆ ๊ฒŒ ๋ฐ”๋กœ ์„ธ์…˜ ๊ด€๋ฆฌ์•ผ! ๐Ÿ˜…
์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„1์— ๋กœ๊ทธ์ธํ–ˆ๋Š”๋ฐ, ๋‹ค์Œ ์š”์ฒญ์ด ์„œ๋ฒ„2๋กœ ๊ฐ€๋ฉด?
"๋ˆ„๊ตฌ์„ธ์š”? ๋กœ๊ทธ์ธ ์•ˆ ํ•˜์…จ๋Š”๋ฐ์š”?" ์ด๋Ÿฐ ํ™ฉ๋‹นํ•œ ์ƒํ™ฉ์ด ๋ฒŒ์–ด์ง€์ง€.

๐Ÿ”น Sticky Session (์„ธ์…˜ ๊ณ ์ •)

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ํ•œ ๋ฒˆ ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ณ„์† ๊ฐ™์€ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด์•ผ.
์ฟ ํ‚ค๋‚˜ IP ์ฃผ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ณ ์ •์‹œํ‚ค์ง€.
๊ฐ„๋‹จํ•˜์ง€๋งŒ, ์„œ๋ฒ„๊ฐ€ ์ฃฝ์œผ๋ฉด ํ•ด๋‹น ์„œ๋ฒ„์˜ ๋ชจ๋“  ์„ธ์…˜์ด ๋‚ ์•„๊ฐ€๋Š” ๋‹จ์ ์ด ์žˆ์–ด.

๐Ÿ”น ์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง

๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ์„ธ์…˜ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.
Tomcat์˜ Session Replication ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ.
ํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ณต์ œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ปค์ ธ์„œ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์–ด.

๐Ÿ”น ์ค‘์•™ ์„ธ์…˜ ์ €์žฅ์†Œ (์ถ”์ฒœ! โญ)

Redis๋‚˜ Memcached ๊ฐ™์€ ์ธ๋ฉ”๋ชจ๋ฆฌ DB์— ์„ธ์…˜์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด์•ผ.
๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ์ค‘์•™ ์ €์žฅ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋‹ˆ๊นŒ ์„ธ์…˜ ๊ณต์œ ๊ฐ€ ์™„๋ฒฝํ•ด.
์„ฑ๋Šฅ๋„ ๋น ๋ฅด๊ณ , ํ™•์žฅ์„ฑ๋„ ์ข‹์•„์„œ ์š”์ฆ˜ ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ๋ฒ•์ด์ง€! ๐ŸŽฏ

// Spring Boot์—์„œ Redis ์„ธ์…˜ ์„ค์ • ์˜ˆ์‹œ
@Configuration
@EnableRedisHttpSession
public class SessionConfig {
    
    @Bean
    public LettuceConnectionFactory connectionFactory() {
        return new LettuceConnectionFactory("redis-server", 6379);
    }
}
๐Ÿ’ก ์‹ค๋ฌด ๊ฟ€ํŒ:
Redis๋„ Master-Slave๋กœ ์ด์ค‘ํ™”ํ•˜๊ณ , Sentinel์ด๋‚˜ Cluster ๋ชจ๋“œ๋กœ ์šด์˜ํ•ด์•ผ ํ•ด!
์„ธ์…˜ ์ €์žฅ์†Œ๊ฐ€ ์ฃฝ์œผ๋ฉด ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์•„์›ƒ๋˜๋Š” ๋Œ€์ฐธ์‚ฌ๊ฐ€ ๋ฒŒ์–ด์ง€๊ฑฐ๋“ . ๐Ÿ˜ฑ

๐Ÿ› ๏ธ ์‹ค์ „ ๊ตฌ์ถ• ๊ฐ€์ด๋“œ

์ž, ์ด์ œ ์‹ค์ œ๋กœ HA ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด์ž!
์—ฌ๊ธฐ์„œ๋Š” ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ ์›น ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ์˜ˆ์‹œ๋ฅผ ๋“ค๊ฒŒ. ๐Ÿง

๐Ÿ”น 1๋‹จ๊ณ„: ์ธํ”„๋ผ ์ค€๋น„

์ตœ์†Œ 3๋Œ€์˜ ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•ด:
โ€ข ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์„œ๋ฒ„ 1๋Œ€ (HAProxy ๋˜๋Š” Nginx)
โ€ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ 2๋Œ€ ์ด์ƒ
โ€ข ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ 2๋Œ€ (Master-Slave)

ํด๋ผ์šฐ๋“œ๋ฅผ ์“ด๋‹ค๋ฉด AWS ELB, Azure Load Balancer ๊ฐ™์€ ๊ด€๋ฆฌํ˜• ์„œ๋น„์Šค๋ฅผ ์“ฐ๋Š” ๊ฒŒ ํŽธํ•ด.

๐Ÿ”น 2๋‹จ๊ณ„: HAProxy ์„ค์ •

HAProxy๋Š” ์˜คํ”ˆ์†Œ์Šค ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋กœ, ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์„ค์ •์ด ์ง๊ด€์ ์ด์•ผ.
๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ์„ ํ•œ๋ฒˆ ๋ณผ๊นŒ?

# /etc/haproxy/haproxy.cfg

global
    maxconn 4096
    daemon

defaults
    mode http
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms

frontend web_frontend
    bind *:80
    default_backend web_servers

backend web_servers
    balance roundrobin
    option httpchk GET /health
    server web1 192.168.1.101:8080 check inter 2000 rise 2 fall 3
    server web2 192.168.1.102:8080 check inter 2000 rise 2 fall 3
    server web3 192.168.1.103:8080 check backup

์ด ์„ค์ •์˜ ์˜๋ฏธ๋ฅผ ํ’€์–ด๋ณด๋ฉด:
โ€ข balance roundrobin: ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์œผ๋กœ ๋ถ„์‚ฐ
โ€ข option httpchk: /health ๊ฒฝ๋กœ๋กœ ํ—ฌ์Šค ์ฒดํฌ
โ€ข check inter 2000: 2์ดˆ๋งˆ๋‹ค ์ฒดํฌ
โ€ข rise 2: 2๋ฒˆ ์„ฑ๊ณตํ•˜๋ฉด ์ •์ƒ์œผ๋กœ ํŒ๋‹จ
โ€ข fall 3: 3๋ฒˆ ์‹คํŒจํ•˜๋ฉด ์ œ์™ธ
โ€ข backup: web3๋Š” ๋ฐฑ์—… ์„œ๋ฒ„ (๋‹ค๋ฅธ ์„œ๋ฒ„ ์ฃฝ์„ ๋•Œ๋งŒ ์‚ฌ์šฉ)

๐Ÿ”น 3๋‹จ๊ณ„: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ ์„ค์ •

๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—๋Š” ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•ด.
ํ—ฌ์Šค ์ฒดํฌ ์—”๋“œํฌ์ธํŠธ๋„ ๊ผญ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๊ณ !

// Spring Boot ํ—ฌ์Šค ์ฒดํฌ ์˜ˆ์‹œ
@RestController
public class HealthController {
    
    @Autowired
    private DataSource dataSource;
    
    @GetMapping("/health")
    public ResponseEntity<String> healthCheck() {
        try {
            // DB ์—ฐ๊ฒฐ ํ™•์ธ
            Connection conn = dataSource.getConnection();
            conn.close();
            
            // ๋””์Šคํฌ ์šฉ๋Ÿ‰ ํ™•์ธ
            File root = new File("/");
            long usableSpace = root.getUsableSpace();
            if (usableSpace < 1024 * 1024 * 1024) { // 1GB ๋ฏธ๋งŒ
                return ResponseEntity.status(503).body("Low disk space");
            }
            
            return ResponseEntity.ok("Healthy");
        } catch (Exception e) {
            return ResponseEntity.status(503).body("Unhealthy: " + e.getMessage());
        }
    }
}

๐Ÿ”น 4๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ ์„ค์ •

MySQL Master-Slave ๋ณต์ œ๋ฅผ ์„ค์ •ํ•ด๋ณด์ž.
๋จผ์ € Master ์„œ๋ฒ„์˜ my.cnf ์„ค์ •:

# Master ์„œ๋ฒ„ ์„ค์ •
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = myapp_db

๊ทธ๋ฆฌ๊ณ  Slave ์„œ๋ฒ„ ์„ค์ •:

# Slave ์„œ๋ฒ„ ์„ค์ •
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read-only = 1

๋ณต์ œ ์‹œ์ž‘ ๋ช…๋ น์–ด:

-- Master์—์„œ ๋ณต์ œ ์‚ฌ์šฉ์ž ์ƒ์„ฑ
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

-- Slave์—์„œ ๋ณต์ œ ์„ค์ •
CHANGE MASTER TO
    MASTER_HOST='192.168.1.201',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=154;

START SLAVE;

๐Ÿ”น 5๋‹จ๊ณ„: ๋ชจ๋‹ˆํ„ฐ๋ง ์„ค์ •

ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•˜๋ ค๋ฉด ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง์ด ํ•„์ˆ˜์•ผ!
Prometheus + Grafana ์กฐํ•ฉ์„ ์ถ”์ฒœํ•ด. ๐Ÿ“Š

๐Ÿ” ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•  ์ฃผ์š” ์ง€ํ‘œ:

โ€ข CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ ์‚ฌ์šฉ๋ฅ 
โ€ข ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ
โ€ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‘๋‹ต ์‹œ๊ฐ„
โ€ข ์—๋Ÿฌ์œจ (4xx, 5xx ์‘๋‹ต)
โ€ข ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ ์ง€์—ฐ(Replication Lag)
โ€ข ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์—ฐ๊ฒฐ ์ˆ˜
โ€ข ๊ฐ ์„œ๋ฒ„์˜ Health Check ์ƒํƒœ

๐Ÿšจ ์žฅ์•  ๋Œ€์‘ ์‹œ๋‚˜๋ฆฌ์˜ค

์•„๋ฌด๋ฆฌ ์ž˜ ๋งŒ๋“  ์‹œ์Šคํ…œ๋„ ์žฅ์• ๋Š” ๋ฐœ์ƒํ•ด.
์ค‘์š”ํ•œ ๊ฑด ์žฅ์• ๊ฐ€ ๋‚ฌ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋Œ€์‘ํ•˜๋А๋ƒ์•ผ! ๐Ÿ”ฅ

๐Ÿ”น ์‹œ๋‚˜๋ฆฌ์˜ค 1: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ 1๋Œ€ ๋‹ค์šด

์ฆ์ƒ: ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ํ—ฌ์Šค ์ฒดํฌ ์‹คํŒจ๋ฅผ ๊ฐ์ง€
์ž๋™ ๋Œ€์‘: ํ•ด๋‹น ์„œ๋ฒ„๋ฅผ ํ’€์—์„œ ์ œ์™ธ, ๋‚˜๋จธ์ง€ ์„œ๋ฒ„๋กœ ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ
๊ด€๋ฆฌ์ž ์กฐ์น˜:
1. ๋กœ๊ทธ ํ™•์ธ์œผ๋กœ ์›์ธ ํŒŒ์•…
2. ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ๋˜๋Š” ๋ณต๊ตฌ ์ž‘์—…
3. ํ—ฌ์Šค ์ฒดํฌ ํ†ต๊ณผ ํ™•์ธ ํ›„ ํ’€์— ์žฌํˆฌ์ž…
4. ์ผ์ • ์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง

๐Ÿ”น ์‹œ๋‚˜๋ฆฌ์˜ค 2: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค Master ๋‹ค์šด

์ฆ์ƒ: ์“ฐ๊ธฐ ์ž‘์—… ์‹คํŒจ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—๋Ÿฌ ๊ธ‰์ฆ
์ˆ˜๋™ ๋Œ€์‘ (์ผ๋ฐ˜์ ):
1. Slave๋ฅผ Master๋กœ ์Šน๊ฒฉ
2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ DB ์—ฐ๊ฒฐ ์ •๋ณด ๋ณ€๊ฒฝ
3. ๊ธฐ์กด Master ๋ณต๊ตฌ ํ›„ ์ƒˆ๋กœ์šด Slave๋กœ ์„ค์ •

์ž๋™ ๋Œ€์‘ (MHA ์‚ฌ์šฉ ์‹œ):
MHA(Master High Availability)๊ฐ€ ์ž๋™์œผ๋กœ ํŽ˜์ผ์˜ค๋ฒ„ ์ˆ˜ํ–‰!

# MHA๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„ ์„ค์ •
[server default]
manager_workdir=/var/log/mha
manager_log=/var/log/mha/manager.log
remote_workdir=/var/log/mha

[server1]
hostname=192.168.1.201
candidate_master=1

[server2]
hostname=192.168.1.202
candidate_master=1

๐Ÿ”น ์‹œ๋‚˜๋ฆฌ์˜ค 3: ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋‹ค์šด

์ด๊ฒŒ ์ œ์ผ ๋ฌด์„œ์šด ์ƒํ™ฉ์ด์•ผ! ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๊ฐ€ SPOF๊ฐ€ ๋˜๋ฉด ์•ˆ ๋˜๊ฑฐ๋“ .
ํ•ด๊ฒฐ์ฑ…์€? ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋„ ์ด์ค‘ํ™”ํ•˜๋Š” ๊ฑฐ์ง€! ๐ŸŽฏ

Keepalived๋ฅผ ์ด์šฉํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์ด์ค‘ํ™”

Keepalived๋Š” VRRP(Virtual Router Redundancy Protocol)๋ฅผ ์‚ฌ์šฉํ•ด์„œ
๊ฐ€์ƒ IP๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , Master LB๊ฐ€ ์ฃฝ์œผ๋ฉด Backup LB๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ€์ƒ IP๋ฅผ ๊ฐ€์ ธ๊ฐ€.

# Master LB์˜ keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    
    virtual_ipaddress {
        192.168.1.100/24
    }
}

# Backup LB์˜ keepalived.conf
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    
    virtual_ipaddress {
        192.168.1.100/24
    }
}

โ˜๏ธ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ์˜ HA

์š”์ฆ˜์€ ์˜จํ”„๋ ˆ๋ฏธ์Šค๋ณด๋‹ค ํด๋ผ์šฐ๋“œ์—์„œ HA๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ์‰ฌ์›Œ์กŒ์–ด!
์ฃผ์š” ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž๋“ค์˜ HA ์†”๋ฃจ์…˜์„ ์•Œ์•„๋ณด์ž. โ˜๏ธ

๐Ÿ”น AWS์˜ HA ์•„ํ‚คํ…์ฒ˜

AWS๋Š” HA ๊ตฌ์ถ•์„ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด:

๐Ÿ”ง AWS HA ํ•ต์‹ฌ ์„œ๋น„์Šค:

โ€ข ELB (Elastic Load Balancer): ๊ด€๋ฆฌํ˜• ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ
โ€ข Auto Scaling: ์ž๋™์œผ๋กœ ์„œ๋ฒ„ ์ถ”๊ฐ€/์ œ๊ฑฐ
โ€ข RDS Multi-AZ: ์ž๋™ DB ํŽ˜์ผ์˜ค๋ฒ„
โ€ข Route 53: DNS ๊ธฐ๋ฐ˜ ์žฅ์•  ์กฐ์น˜
โ€ข CloudWatch: ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋žŒ
โ€ข S3: 99.999999999% ๋‚ด๊ตฌ์„ฑ์˜ ์Šคํ† ๋ฆฌ์ง€

ํŠนํžˆ Multi-AZ(๊ฐ€์šฉ ์˜์—ญ) ๋ฐฐํฌ๊ฐ€ ํ•ต์‹ฌ์ด์•ผ!
์„œ์šธ ๋ฆฌ์ „์—๋Š” 4๊ฐœ์˜ AZ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ตœ์†Œ 2๊ฐœ ์ด์ƒ์˜ AZ์— ์„œ๋ฒ„๋ฅผ ๋ถ„์‚ฐ ๋ฐฐ์น˜ํ•ด์•ผ ํ•ด.
ํ•œ ๋ฐ์ดํ„ฐ์„ผํ„ฐ๊ฐ€ ํ†ต์งธ๋กœ ๋‚ ์•„๊ฐ€๋„ ์„œ๋น„์Šค๋Š” ๊ณ„์† ๋Œ์•„๊ฐ€๋Š” ๊ฑฐ์ง€! ๐Ÿ’ช

๐Ÿ”น Azure์˜ HA ์†”๋ฃจ์…˜

Azure๋„ ๋น„์Šทํ•œ ๊ฐœ๋…์˜ ์„œ๋น„์Šค๋“ค์„ ์ œ๊ณตํ•ด:

๐Ÿ”ง Azure HA ํ•ต์‹ฌ ์„œ๋น„์Šค:

โ€ข Azure Load Balancer: L4 ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ
โ€ข Application Gateway: L7 ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ
โ€ข Availability Sets: ๋ฌผ๋ฆฌ์  ์„œ๋ฒ„ ๋ถ„์‚ฐ
โ€ข Availability Zones: ๋ฐ์ดํ„ฐ์„ผํ„ฐ ๋ถ„์‚ฐ
โ€ข Azure SQL Database: ์ž๋™ ๋ฐฑ์—… ๋ฐ ๋ณต์ œ
โ€ข Traffic Manager: ๊ธ€๋กœ๋ฒŒ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ

๐Ÿ”น GCP์˜ HA ์ ‘๊ทผ๋ฒ•

๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ๋Š” ๊ธ€๋กœ๋ฒŒ ๋„คํŠธ์›Œํฌ๋ฅผ ํ™œ์šฉํ•œ HA๊ฐ€ ๊ฐ•์ ์ด์•ผ:

๐Ÿ”ง GCP HA ํ•ต์‹ฌ ์„œ๋น„์Šค:

โ€ข Cloud Load Balancing: ๊ธ€๋กœ๋ฒŒ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ
โ€ข Managed Instance Groups: ์ž๋™ ํ™•์žฅ ๋ฐ ๋ณต๊ตฌ
โ€ข Cloud SQL: ์ž๋™ ํŽ˜์ผ์˜ค๋ฒ„
โ€ข Regional Persistent Disks: ๋ณต์ œ๋œ ๋””์Šคํฌ
โ€ข Cloud Monitoring: ํ†ตํ•ฉ ๋ชจ๋‹ˆํ„ฐ๋ง

๐Ÿ’ฐ ๋น„์šฉ ์ตœ์ ํ™” ์ „๋žต

HA ์‹œ์Šคํ…œ์€ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค์–ด.
์„œ๋ฒ„๋ฅผ 2๋ฐฐ, 3๋ฐฐ๋กœ ๋Š˜๋ ค์•ผ ํ•˜๋‹ˆ๊นŒ ๋‹น์—ฐํ•˜์ง€.
ํ•˜์ง€๋งŒ ๋˜‘๋˜‘ํ•˜๊ฒŒ ์„ค๊ณ„ํ•˜๋ฉด ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด! ๐Ÿ’ก

๐Ÿ”น ์ „๋žต 1: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ

๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ Active-Active๋กœ ํ•  ํ•„์š”๋Š” ์—†์–ด.
์ค‘์š”๋„์— ๋”ฐ๋ผ ์ฐจ๋“ฑ ์ ์šฉํ•˜๋Š” ๊ฑฐ์ง€:

๐Ÿ“Š ์ปดํฌ๋„ŒํŠธ๋ณ„ HA ์ „๋žต:

โ€ข ์›น/์•ฑ ์„œ๋ฒ„: Active-Active (ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ ํ•„์š”)
โ€ข ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค: Active-Standby (๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ์ค‘์š”)
โ€ข ์บ์‹œ ์„œ๋ฒ„: Active-Active (์†์‹ค๋˜์–ด๋„ ์žฌ์ƒ์„ฑ ๊ฐ€๋Šฅ)
โ€ข ๋ฐฐ์น˜ ์„œ๋ฒ„: Active-Standby (๋™์‹œ ์‹คํ–‰ ๋ถˆํ•„์š”)

๐Ÿ”น ์ „๋žต 2: ์ŠคํŒŸ ์ธ์Šคํ„ด์Šค ํ™œ์šฉ

ํด๋ผ์šฐ๋“œ์˜ ์ŠคํŒŸ/ํ”„๋ฆฌ์— ํ‹ฐ๋ธ” ์ธ์Šคํ„ด์Šค๋Š” ์ผ๋ฐ˜ ๊ฐ€๊ฒฉ์˜ 70~90% ์ €๋ ดํ•ด.
์ค‘๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฆฌ์Šคํฌ๊ฐ€ ์žˆ์ง€๋งŒ, ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์กฐ์—์„œ๋Š” ๋ฌธ์ œ์—†์–ด!
์ผ๋ถ€ ๋…ธ๋“œ๋ฅผ ์ŠคํŒŸ์œผ๋กœ ์šด์˜ํ•˜๋ฉด ๋น„์šฉ์„ ํฌ๊ฒŒ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ์ง€. ๐Ÿ’ฐ

๐Ÿ”น ์ „๋žต 3: ์˜คํ†  ์Šค์ผ€์ผ๋ง ์ ๊ทน ํ™œ์šฉ

ํŠธ๋ž˜ํ”ฝ์ด ์ ์€ ์‹œ๊ฐ„๋Œ€์—๋Š” ์„œ๋ฒ„ ์ˆ˜๋ฅผ ์ค„์ด๊ณ ,
ํ”ผํฌ ํƒ€์ž„์—๋งŒ ์„œ๋ฒ„๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฑฐ์•ผ.
์˜ˆ๋ฅผ ๋“ค์–ด ์‡ผํ•‘๋ชฐ์ด๋ผ๋ฉด ์ƒˆ๋ฒฝ ์‹œ๊ฐ„์—๋Š” ์ตœ์†Œ 2๋Œ€๋งŒ ์šด์˜ํ•˜๊ณ ,
์ €๋… ์‹œ๊ฐ„์—๋Š” 10๋Œ€๊นŒ์ง€ ๋Š˜๋ฆฌ๋Š” ์‹์ด์ง€.

# AWS Auto Scaling ์ •์ฑ… ์˜ˆ์‹œ
{
  "TargetTrackingScalingPolicyConfiguration": {
    "TargetValue": 70.0,
    "PredefinedMetricSpecification": {
      "PredefinedMetricType": "ASGAverageCPUUtilization"
    }
  }
}

๐ŸŽ“ ์‹ค๋ฌด์—์„œ ๋ฐฐ์šด ๊ตํ›ˆ๋“ค

์ด๋ก ์€ ์ด๋ก ์ผ ๋ฟ์ด์•ผ. ์‹ค์ œ๋กœ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด ์˜ˆ์ƒ ๋ชปํ•œ ์ผ๋“ค์ด ์ƒ๊ธฐ์ง€.
๋‚ด๊ฐ€ ๊ฒช์—ˆ๋˜ (๊ทธ๋ฆฌ๊ณ  ์ฃผ๋ณ€์—์„œ ๋“ค์—ˆ๋˜) ์‹ค์ œ ์‚ฌ๋ก€๋“ค์„ ๊ณต์œ ํ• ๊ฒŒ! ๐Ÿ˜…

๐Ÿ”น ๊ตํ›ˆ 1: ํ—ฌ์Šค ์ฒดํฌ๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ

์ฒ˜์Œ์—๋Š” ํ—ฌ์Šค ์ฒดํฌ๋ฅผ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์–ด.
DB ์—ฐ๊ฒฐ, ์™ธ๋ถ€ API ํ˜ธ์ถœ, ํŒŒ์ผ ์‹œ์Šคํ…œ ์ฒดํฌ ๋“ฑ๋“ฑ...
๊ทธ๋žฌ๋”๋‹ˆ ์™ธ๋ถ€ API๊ฐ€ ๋А๋ ค์ง€๋ฉด ์ •์ƒ ์„œ๋ฒ„๋„ Unhealthy๋กœ ํŒ์ •๋˜๋Š” ๊ฑฐ์•ผ! ๐Ÿ˜ฑ

ํ•ด๊ฒฐ์ฑ…: ํ—ฌ์Šค ์ฒดํฌ๋Š” ํ•ด๋‹น ์„œ๋ฒ„์˜ ์ƒํƒœ๋งŒ ์ฒดํฌํ•˜๋„๋ก ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค์–ด.
์™ธ๋ถ€ ์˜์กด์„ฑ์€ ๋ณ„๋„์˜ ๋ชจ๋‹ˆํ„ฐ๋ง์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์•„.

๐Ÿ”น ๊ตํ›ˆ 2: ํŽ˜์ผ์˜ค๋ฒ„ ํ…Œ์ŠคํŠธ๋Š” ์ •๊ธฐ์ ์œผ๋กœ

HA ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ด๋†“๊ณ  ์‹ค์ œ๋กœ ํ…Œ์ŠคํŠธ ์•ˆ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„.
๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์ง„์งœ ์žฅ์• ๊ฐ€ ๋‚˜๋ฉด? ํŽ˜์ผ์˜ค๋ฒ„๊ฐ€ ์•ˆ ๋˜๋Š” ๊ฑฐ์•ผ! ๐Ÿ”ฅ

ํ•ด๊ฒฐ์ฑ…: ๋งค๋‹ฌ ํ•œ ๋ฒˆ์”ฉ ์˜๋„์ ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๋‚ด๋ ค๋ณด๊ณ  ํŽ˜์ผ์˜ค๋ฒ„๋ฅผ ํ…Œ์ŠคํŠธํ•ด.
์นด์˜ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง(Chaos Engineering)์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, Netflix๊ฐ€ ์œ ๋ช…ํ•˜์ง€.

๐Ÿ”น ๊ตํ›ˆ 3: ๋กœ๊ทธ๋Š” ์ค‘์•™ํ™”ํ•˜๋ผ

์„œ๋ฒ„๊ฐ€ 10๋Œ€๋ฉด ๋กœ๊ทธ๋„ 10๊ตฐ๋ฐ์— ํฉ์–ด์ ธ ์žˆ์–ด.
์žฅ์•  ์ถ”์ ํ•  ๋•Œ ์„œ๋ฒ„๋งˆ๋‹ค SSH ์ ‘์†ํ•ด์„œ ๋กœ๊ทธ ๋ณด๋Š” ๊ฑด ์ •๋ง ๋น„ํšจ์œจ์ ์ด์•ผ.

ํ•ด๊ฒฐ์ฑ…: ELK Stack(Elasticsearch, Logstash, Kibana)์ด๋‚˜
ํด๋ผ์šฐ๋“œ์˜ ๋กœ๊ทธ ์ˆ˜์ง‘ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋กœ๊ทธ๋ฅผ ์ค‘์•™ํ™”ํ•ด.
ํ•œ ๊ณณ์—์„œ ๋ชจ๋“  ์„œ๋ฒ„์˜ ๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด!

๐Ÿ”น ๊ตํ›ˆ 4: ๋ฐฐํฌ ์ „๋žต๋„ HA์˜ ์ผ๋ถ€

์ƒˆ ๋ฒ„์ „ ๋ฐฐํฌํ•  ๋•Œ ๋ชจ๋“  ์„œ๋ฒ„๋ฅผ ๋™์‹œ์— ์—…๋ฐ์ดํŠธํ•˜๋ฉด?
๋ฒ„๊ทธ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์ „์ฒด ์„œ๋น„์Šค๊ฐ€ ๋‹ค์šด๋  ์ˆ˜ ์žˆ์–ด.

ํ•ด๊ฒฐ์ฑ…: Blue-Green ๋ฐฐํฌ๋‚˜ Canary ๋ฐฐํฌ๋ฅผ ์‚ฌ์šฉํ•ด.
์ผ๋ถ€ ์„œ๋ฒ„๋งŒ ๋จผ์ € ์—…๋ฐ์ดํŠธํ•˜๊ณ , ๋ฌธ์ œ์—†์œผ๋ฉด ๋‚˜๋จธ์ง€๋„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฑฐ์ง€.
Kubernetes๋ฅผ ์“ด๋‹ค๋ฉด Rolling Update๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›๋ผ!

๐ŸŒŸ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐฐ์šฐ๋Š” HA ์ „๋ฌธ๊ฐ€์˜ ๊ธธ

HA ํด๋Ÿฌ์Šคํ„ฐ๋ง์€ ๋‹จ์ˆœํžˆ ์„œ๋ฒ„ ๋ช‡ ๋Œ€ ๋„์šฐ๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ.
๋„คํŠธ์›Œํฌ, ์Šคํ† ๋ฆฌ์ง€, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ ๋‹ค์–‘ํ•œ ์˜์—ญ์˜ ์ง€์‹์ด ํ•„์š”ํ•˜์ง€.

ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ!
์‹ค๋ฌด ๊ฒฝํ—˜์ด ํ’๋ถ€ํ•œ DevOps ์—”์ง€๋‹ˆ์–ด๋‚˜ ์‹œ์Šคํ…œ ์•„ํ‚คํ…ํŠธ์—๊ฒŒ
1:1 ๋ฉ˜ํ† ๋ง์„ ๋ฐ›์œผ๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์–ด. ๐Ÿš€

๐Ÿ’ก ํ•™์Šต ๋กœ๋“œ๋งต ์ถ”์ฒœ:

1๋‹จ๊ณ„: ๋ฆฌ๋ˆ…์Šค ๊ธฐ๋ณธ (๋„คํŠธ์›Œํฌ, ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ)
2๋‹จ๊ณ„: ์›น ์„œ๋ฒ„ ์šด์˜ (Nginx, Apache)
3๋‹จ๊ณ„: ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ (HAProxy, Nginx)
4๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ (MySQL, PostgreSQL)
5๋‹จ๊ณ„: ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ (Kubernetes)
6๋‹จ๊ณ„: ํด๋ผ์šฐ๋“œ ์•„ํ‚คํ…์ฒ˜ (AWS, Azure, GCP)
7๋‹จ๊ณ„: ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น… (Prometheus, ELK)

๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ์‹ค์Šต ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฒŒ ์ค‘์š”ํ•ด!

๐Ÿ”ฎ ๋ฏธ๋ž˜์˜ HA ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ

๊ธฐ์ˆ ์€ ๊ณ„์† ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์–ด. ์•ž์œผ๋กœ์˜ HA๋Š” ์–ด๋–ป๊ฒŒ ๋ณ€ํ• ๊นŒ? ๐Ÿ”ฎ

๐Ÿ”น ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜

AWS Lambda, Azure Functions ๊ฐ™์€ ์„œ๋ฒ„๋ฆฌ์Šค ํ”Œ๋žซํผ์€
๊ธฐ๋ณธ์ ์œผ๋กœ HA๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด.
๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋˜๊ณ , ์ธํ”„๋ผ ๊ด€๋ฆฌ๋Š” ํด๋ผ์šฐ๋“œ๊ฐ€ ์•Œ์•„์„œ ํ•ด์ฃผ์ง€.
์•ž์œผ๋กœ๋Š” ์ด๋Ÿฐ ๋ฐฉํ–ฅ์œผ๋กœ ๋” ๋งŽ์ด ๊ฐˆ ๊ฑฐ์•ผ.

๐Ÿ”น ์—ฃ์ง€ ์ปดํ“จํŒ…

CDN์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด ๊ณณ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ฃ์ง€ ์ปดํ“จํŒ…์ด ๋ถ€์ƒํ•˜๊ณ  ์žˆ์–ด.
Cloudflare Workers, AWS Lambda@Edge ๊ฐ™์€ ์„œ๋น„์Šค๋“ค์ด ๋Œ€ํ‘œ์ ์ด์ง€.
์ง€์—ฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ๋„ HA๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์–ด.

๐Ÿ”น AI ๊ธฐ๋ฐ˜ ์ž๋™ํ™”

AIOps(AI for IT Operations)๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ
์žฅ์• ๋ฅผ ์˜ˆ์ธกํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋Œ€์‘ํ•˜๋Š” ์‹œ์Šคํ…œ์ด ๋‚˜์˜ค๊ณ  ์žˆ์–ด.
๋จธ์‹ ๋Ÿฌ๋‹์œผ๋กœ ํŒจํ„ด์„ ํ•™์Šตํ•ด์„œ ์žฅ์• ๊ฐ€ ๋‚˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ์กฐ์น˜ํ•˜๋Š” ๊ฑฐ์ง€! ๐Ÿค–

๐Ÿ”น ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ & ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํด๋ผ์šฐ๋“œ

ํ•œ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์—๋งŒ ์˜์กดํ•˜๋Š” ๊ฑด ์œ„ํ—˜ํ•ด.
AWS๊ฐ€ ๋‹ค์šด๋˜๋ฉด? (์‹ค์ œ๋กœ ๊ฐ€๋” ์žˆ์–ด!)
์•ž์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ์ „๋žต์ด ์ค‘์š”ํ•ด์งˆ ๊ฑฐ์•ผ.

๐Ÿ“š ์ถ”์ฒœ ๋„๊ตฌ ๋ฐ ๋ฆฌ์†Œ์Šค

HA ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์šด์˜ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋„๊ตฌ๋“ค์„ ์ •๋ฆฌํ•ด๋ดค์–ด! ๐Ÿ› ๏ธ

๐Ÿ”น ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ

์˜คํ”ˆ์†Œ์Šค:
โ€ข HAProxy - ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” L4/L7 ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ
โ€ข Nginx - ์›น ์„œ๋ฒ„์ด์ž ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ
โ€ข Traefik - ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ํ™˜๊ฒฝ์— ์ตœ์ ํ™”

์ƒ์šฉ/๊ด€๋ฆฌํ˜•:
โ€ข AWS ELB/ALB/NLB
โ€ข Azure Load Balancer
โ€ข GCP Cloud Load Balancing
โ€ข F5 BIG-IP

๐Ÿ”น ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ

โ€ข Kubernetes - ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์˜ ํ‘œ์ค€
โ€ข Docker Swarm - ๊ฐ„๋‹จํ•œ ์ปจํ…Œ์ด๋„ˆ ํด๋Ÿฌ์Šคํ„ฐ๋ง
โ€ข Apache Mesos - ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ
โ€ข Nomad - HashiCorp์˜ ์›Œํฌ๋กœ๋“œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ

๐Ÿ”น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค HA

โ€ข MySQL Group Replication
โ€ข PostgreSQL Patroni
โ€ข MongoDB Replica Set
โ€ข Redis Sentinel/Cluster
โ€ข Galera Cluster (MySQL/MariaDB)

๐Ÿ”น ๋ชจ๋‹ˆํ„ฐ๋ง

โ€ข Prometheus + Grafana - ์˜คํ”ˆ์†Œ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง ์Šคํƒ
โ€ข Datadog - ์˜ฌ์ธ์› ๋ชจ๋‹ˆํ„ฐ๋ง SaaS
โ€ข New Relic - APM ๋ฐ ์ธํ”„๋ผ ๋ชจ๋‹ˆํ„ฐ๋ง
โ€ข Zabbix - ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ชจ๋‹ˆํ„ฐ๋ง
โ€ข Nagios - ์ „ํ†ต์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ

โœ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ: HA ์‹œ์Šคํ…œ ๊ตฌ์ถ• ์ „ ํ™•์ธ์‚ฌํ•ญ

์‹ค์ œ๋กœ HA ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์ „์— ์ด๊ฒƒ๋“ค์„ ์ฒดํฌํ•ด๋ด! โœ”๏ธ

๐Ÿ“‹ ๊ธฐํš ๋‹จ๊ณ„
โ˜ ๋ชฉํ‘œ ๊ฐ€์šฉ๋ฅ  ์ •์˜ (99.9%? 99.99%?)
โ˜ ์˜ˆ์‚ฐ ์‚ฐ์ • (์„œ๋ฒ„, ๋„คํŠธ์›Œํฌ, ๋ผ์ด์„ ์Šค ๋น„์šฉ)
โ˜ RTO/RPO ์ •์˜ (๋ณต๊ตฌ ๋ชฉํ‘œ ์‹œ๊ฐ„/๋ณต๊ตฌ ์‹œ์  ๋ชฉํ‘œ)
โ˜ ๋‹จ์ผ ์žฅ์• ์ (SPOF) ์‹๋ณ„
โ˜ ํŠธ๋ž˜ํ”ฝ ํŒจํ„ด ๋ถ„์„

๐Ÿ“‹ ์„ค๊ณ„ ๋‹จ๊ณ„
โ˜ ํด๋Ÿฌ์Šคํ„ฐ ํ† ํด๋กœ์ง€ ๊ฒฐ์ • (Active-Active vs Active-Standby)
โ˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์„ ํƒ
โ˜ ์„ธ์…˜ ๊ด€๋ฆฌ ์ „๋žต ์ˆ˜๋ฆฝ
โ˜ ๋ฐ์ดํ„ฐ ๋ณต์ œ ๋ฐฉ์‹ ๊ฒฐ์ •
โ˜ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ ์„ค๊ณ„ (VLAN, ์„œ๋ธŒ๋„ท)
โ˜ ๋ณด์•ˆ ์ •์ฑ… ์ˆ˜๋ฆฝ (๋ฐฉํ™”๋ฒฝ, SSL/TLS)

๐Ÿ“‹ ๊ตฌ์ถ• ๋‹จ๊ณ„
โ˜ ์„œ๋ฒ„ ํ”„๋กœ๋น„์ €๋‹
โ˜ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์„ค์ • ๋ฐ ํ…Œ์ŠคํŠธ
โ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ
โ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์ œ ์„ค์ •
โ˜ ํ—ฌ์Šค ์ฒดํฌ ๊ตฌํ˜„
โ˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ•
โ˜ ๋กœ๊น… ์‹œ์Šคํ…œ ๊ตฌ์ถ•

๐Ÿ“‹ ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„
โ˜ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ (์˜ˆ์ƒ ํŠธ๋ž˜ํ”ฝ์˜ 150%)
โ˜ ํŽ˜์ผ์˜ค๋ฒ„ ํ…Œ์ŠคํŠธ (๊ฐ ์ปดํฌ๋„ŒํŠธ๋ณ„)
โ˜ ํŽ˜์ผ๋ฐฑ ํ…Œ์ŠคํŠธ
โ˜ ๋„คํŠธ์›Œํฌ ์žฅ์•  ์‹œ๋ฎฌ๋ ˆ์ด์…˜
โ˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๊ฒ€์ฆ
โ˜ ์„ฑ๋Šฅ ๋ฒค์น˜๋งˆํฌ

๐Ÿ“‹ ์šด์˜ ๋‹จ๊ณ„
โ˜ ์šด์˜ ๋งค๋‰ด์–ผ ์ž‘์„ฑ
โ˜ ์žฅ์•  ๋Œ€์‘ ์ ˆ์ฐจ ๋ฌธ์„œํ™”
โ˜ ์˜จ์ฝœ(On-call) ์ฒด๊ณ„ ๊ตฌ์ถ•
โ˜ ์ •๊ธฐ ์ ๊ฒ€ ์ผ์ • ์ˆ˜๋ฆฝ
โ˜ ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ ์ ˆ์ฐจ ์ˆ˜๋ฆฝ
โ˜ ์šฉ๋Ÿ‰ ๊ณ„ํš(Capacity Planning)

๐ŸŽฌ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

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

ํ•ต์‹ฌ์„ ์ •๋ฆฌํ•˜์ž๋ฉด:

๐ŸŽฏ HA ํด๋Ÿฌ์Šคํ„ฐ๋ง์˜ ํ•ต์‹ฌ ์›์น™:

1๏ธโƒฃ ๋‹จ์ผ ์žฅ์• ์  ์ œ๊ฑฐ: ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์ค‘ํ™”ํ•˜๋ผ
2๏ธโƒฃ ์ž๋™ํ™”: ์‚ฌ๋žŒ์˜ ๊ฐœ์ž… ์—†์ด ์ž๋™์œผ๋กœ ๋ณต๊ตฌ๋˜์–ด์•ผ ํ•ด
3๏ธโƒฃ ๋ชจ๋‹ˆํ„ฐ๋ง: ๋ณด์ด์ง€ ์•Š์œผ๋ฉด ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์–ด
4๏ธโƒฃ ํ…Œ์ŠคํŠธ: ์‹ค์ œ ์žฅ์•  ์ „์— ๋ฏธ๋ฆฌ ํ…Œ์ŠคํŠธํ•˜๋ผ
5๏ธโƒฃ ๋ฌธ์„œํ™”: ์ƒˆ๋ฒฝ 3์‹œ์— ์žฅ์•  ๋‚˜๋ฉด ๋ฌธ์„œ๊ฐ€ ์ƒ๋ช…์ค„์ด์•ผ
6๏ธโƒฃ ์ ์ง„์  ๊ฐœ์„ : ์™„๋ฒฝํ•œ ์‹œ์Šคํ…œ์€ ์—†์–ด, ๊ณ„์† ๊ฐœ์„ ํ•˜๋ผ

HA ์‹œ์Šคํ…œ ๊ตฌ์ถ•์€ ๋งˆ๋ผํ†ค์ด์•ผ, ๋‹จ๊ฑฐ๋ฆฌ ๋‹ฌ๋ฆฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ์ง€.
์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜์ง€ ๋ง๊ณ , ๋‹จ๊ณ„์ ์œผ๋กœ ๊ฐœ์„ ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒŒ ์ค‘์š”ํ•ด.

๊ทธ๋ฆฌ๊ณ  ํ˜ผ์ž ๊ณ ๋ฏผํ•˜์ง€ ๋ง๊ณ , ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ
๊ฒฝํ—˜ ๋งŽ์€ ์ „๋ฌธ๊ฐ€๋“ค๊ณผ ์†Œํ†ตํ•˜๋ฉด์„œ ๋ฐฐ์›Œ๋‚˜๊ฐ€๋ฉด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์–ด! ๐Ÿš€

์„œ๋ฒ„๊ฐ€ ์ ˆ๋Œ€ ์ฃฝ์ง€ ์•Š๋Š” ๊ทธ๋‚ ๊นŒ์ง€, ํŒŒ์ดํŒ…! ๐Ÿ’ช
์งˆ๋ฌธ์ด๋‚˜ ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“  ๋ฌผ์–ด๋ด.
์šฐ๋ฆฌ ๋ชจ๋‘ ์•ˆ์ •์ ์ธ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๊ทธ๋‚ ๊นŒ์ง€! ๐ŸŽ‰

๐ŸŒŸ ๋‹ค์Œ ํ•™์Šต ์ฃผ์ œ ์ถ”์ฒœ:
โ€ข ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ (Kubernetes ์‹ฌํ™”)
โ€ข ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜
โ€ข ์„œ๋น„์Šค ๋ฉ”์‹œ (Istio, Linkerd)
โ€ข ์นด์˜ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง
โ€ข ์‚ฌ์ดํŠธ ์‹ ๋ขฐ์„ฑ ์—”์ง€๋‹ˆ์–ด๋ง (SRE)
๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.