Ver3.0 ๐ ๊ณ ๊ฐ์ฉ์ฑ(HA) ์๋ฒ ํด๋ฌ์คํฐ๋ง ์ค๊ณ

๐ ๊ณ ๊ฐ์ฉ์ฑ(HA) ์๋ฒ ํด๋ฌ์คํฐ๋ง ์ค๊ณ
์๋ฒ๊ฐ ์ ๋ ์ฃฝ์ง ์๋ ๋ง๋ฒ ๊ฐ์ ์ด์ผ๊ธฐ
๐ฏ ๊ณ ๊ฐ์ฉ์ฑ์ด ๋ญ๊ธธ๋ ์ด๋ ๊ฒ ๋๋ฆฌ์ผ?
์น๊ตฌ์ผ, ์์ํด๋ด. ๋ค๊ฐ ์ด์ํ๋ ์ผํ๋ชฐ ์๋ฒ๊ฐ ๋ฑ ๋ธ๋ํ๋ผ์ด๋ฐ์ด ๋น์ผ์ ๋ป์ด๋ฒ๋ ธ์ด. ๐
์์ฒ ๋ช
์ ๊ณ ๊ฐ์ด ๊ฒฐ์ ํ๋ ค๊ณ ๋๊ธฐ ์ค์ธ๋ฐ ์๋ฒ๋ "์๋
ํ ๊ณ์ธ์~" ํ๊ณ ํด๊ทผํด๋ฒ๋ฆฐ ๊ฑฐ์ง.
์ด๊ฒ ๋ฐ๋ก ๊ณ ๊ฐ์ฉ์ฑ(High Availability, HA)์ด ํ์ํ ์ด์ ์ผ!
๊ณ ๊ฐ์ฉ์ฑ์ด๋ ์ฝ๊ฒ ๋งํด์ ์๋ฒ๊ฐ ์ ๋ ์ฃฝ์ง ์๋๋ก ๋ง๋๋ ๊ธฐ์ ์ด์ผ.
์ ํํ๋ 99.9%, 99.99%, ์ฌ์ง์ด 99.999%์ ๊ฐ๋๋ฅ ์ ๋ณด์ฅํ๋ ์์คํ
์ค๊ณ๋ฅผ ๋งํด.
99.999%๊ฐ ๋ญ๋๊ณ ? 1๋
์ ๋ฑ 5๋ถ 15์ด๋ง ๋ค์ดํ์์ด ํ์ฉ๋๋ค๋ ๋ป์ด์ผ. ๐ฑ
์๋ง์กด์ด 1์๊ฐ ๋์ ์๋น์ค ์ฅ์ ๋ฅผ ๊ฒช์ผ๋ฉด ์ฝ 1์ต ๋ฌ๋ฌ์ ์์ค์ ๋ณธ๋ค๊ณ ํด.
๊ทธ๋ฌ๋๊น 1๋ถ์ ์ฝ 167๋ง ๋ฌ๋ฌ์ฉ ๋ ์๊ฐ๋ ๊ฑฐ์ง. ์ด์ ์ ๋๊ธฐ์ ๋ค์ด HA์ ๋ชฉ์จ ๊ฑฐ๋์ง ์๊ฒ ์ง?
๐๏ธ ํด๋ฌ์คํฐ๋ง์ ๊ธฐ๋ณธ ๊ฐ๋
ํด๋ฌ์คํฐ๋ง(Clustering)์ ์ฌ๋ฌ ๋์ ์๋ฒ๋ฅผ ๋ง์น ํ๋์ ์๋ฒ์ฒ๋ผ ๋์ํ๊ฒ ๋ง๋๋ ๊ธฐ์ ์ด์ผ.
ํผ์์ 100kg์ ๋ค๊ธฐ ํ๋ค๋ฉด ์น๊ตฌ 3๋ช
์ด๋ ๊ฐ์ด ๋ค๋ฉด ๋์์? ๊ทธ๊ฒ ๋ฐ๋ก ํด๋ฌ์คํฐ๋ง์ ์ฒ ํ์ด์ผ! ๐ช
๐น ํด๋ฌ์คํฐ๋ง์ ํต์ฌ ๊ตฌ์ฑ ์์
ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฐ๊ฐ์ ์๋ฒ๋ฅผ ๋
ธ๋๋ผ๊ณ ๋ถ๋ฌ.
๊ฐ ๋
ธ๋๋ ๋
๋ฆฝ์ ์ผ๋ก ๋์ํ ์ ์์ง๋ง, ํด๋ฌ์คํฐ ์์์๋ ํ๋์ ํ์ผ๋ก ์์ง์ด์ง.
๋ณดํต ์ต์ 2๊ฐ ์ด์์ ๋
ธ๋๋ก ๊ตฌ์ฑํ๊ณ , ๊ท๋ชจ์ ๋ฐ๋ผ ์์ญ ๋๊น์ง ํ์ฅํ ์ ์์ด.
๋
ธ๋๋ค์ ์๋ก์๊ฒ ์ฃผ๊ธฐ์ ์ผ๋ก "๋ ์ด์์์ด!"๋ผ๋ ์ ํธ๋ฅผ ๋ณด๋ด.
์ด๊ฑธ ํํธ๋นํธ๋ผ๊ณ ํ๋๋ฐ, ๋ณดํต 1~2์ด๋ง๋ค ํ ๋ฒ์ฉ ์ฒดํฌํด.
๋ง์ฝ 3๋ฒ ์ฐ์์ผ๋ก ์๋ต์ด ์์ผ๋ฉด? "์ ์ฃฝ์๋๋ด" ํ๊ณ ํ๋จํ๋ ๊ฑฐ์ง. ๐
Active ์๋ฒ๊ฐ ๋ค์ด๋๋ฉด Standby ์๋ฒ๊ฐ ์๋์ผ๋ก ๊ทธ ์ญํ ์ ๋์ ํ๋ ๊ฑธ ํ์ผ์ค๋ฒ๋ผ๊ณ ํด.
์ด ๊ณผ์ ์ด ๋น ๋ฅด๋ฉด ๋น ๋ฅผ์๋ก ์ข์๋ฐ, ๋ณดํต 30์ด ์ด๋ด์ ์๋ฃ๋๋๋ก ์ค๊ณํด์ผ ํด.
์ ๋ง๋ค์ด์ง ์์คํ
์ 5์ด ์ด๋ด์๋ ๊ฐ๋ฅํ์ง! โก
๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ์๋ ์๋ฒ๋ฅผ ๋ค์ 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 โ ์๋ฒ2 โ ์๋ฒ3 โ ์๋ฒ1... ์ด๋ ๊ฒ ์์๋๋ก ๋์๊ฐ๋ฉด์ ๋ฐฐ๋ถํด.
๋ชจ๋ ์๋ฒ์ ์ฑ๋ฅ์ด ๋น์ทํ ๋ ํจ๊ณผ์ ์ด์ง.
๊ตฌํ๋ ์ฝ๊ณ ๊ณตํํ๊ฒ ๋ถ์ฐ๋์ง๋ง, ์๋ฒ๋ณ ๋ถํ ์ฐจ์ด๋ ๊ณ ๋ คํ์ง ๋ชปํด.
ํ์ฌ ์ฐ๊ฒฐ ์๊ฐ ๊ฐ์ฅ ์ ์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์์ด์ผ.
์ค์๊ฐ์ผ๋ก ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐ ์ํ๋ฅผ ์ฒดํฌํด์ ๊ฐ์ฅ ์ฌ์ ๋ก์ด ์๋ฒ๋ฅผ ์ ํํ์ง.
์ธ์
์ด ์ค๋ ์ง์๋๋ ์๋น์ค์ ์ ํฉํด! ๐
ํด๋ผ์ด์ธํธ์ IP ์ฃผ์๋ฅผ ํด์ฑํด์ ํน์ ์๋ฒ๋ก ๊ณ ์ ๋ฐฐ์ ํ๋ ๋ฐฉ์์ด์ผ.
๊ฐ์ ์ฌ์ฉ์๋ ํญ์ ๊ฐ์ ์๋ฒ๋ก ์ฐ๊ฒฐ๋๋๊น ์ธ์
๊ด๋ฆฌ๊ฐ ํธํด.
ํ์ง๋ง ์๋ฒ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋๋ฉด ํด์ ํ
์ด๋ธ์ด ์ฌ๊ตฌ์ฑ๋ผ์ผ ํด์ ์ฃผ์๊ฐ ํ์ํด.
์๋ฒ๋ง๋ค ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํด์ ์ฑ๋ฅ์ด ์ข์ ์๋ฒ์ ๋ ๋ง์ ํธ๋ํฝ์ ๋ณด๋ด๋ ๋ฐฉ์์ด์ผ.
์๋ฅผ ๋ค์ด ์๋ฒ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 ๋ฑ์ด ๋ํ์ ์ด์ง.
๋ฐ์ดํฐ๋ฅผ ์ธ ๋ ๋ชจ๋ ๋ณต์ ๋ณธ์ ๋์์ ๊ธฐ๋กํ๊ณ ํ์ธ๋ฐ๋ ๋ฐฉ์์ด์ผ.
๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์๋ฒฝํ์ง๋ง, ์ฑ๋ฅ์ด ๋๋ ค์ง ์ ์์ด.
๊ธ์ต ์์คํ
์ฒ๋ผ ๋ฐ์ดํฐ ์์ค์ด ์ ๋ ์ ๋๋ ๊ณณ์์ ์ฌ์ฉํด. ๐ฆ
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๋ 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 ๊ตฌ์ถ์ ์ํ ๋ค์ํ ์๋น์ค๋ฅผ ์ ๊ณตํด:
โข 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 Load Balancer: L4 ๋ก๋ ๋ฐธ๋ฐ์ฑ
โข Application Gateway: L7 ๋ก๋ ๋ฐธ๋ฐ์ฑ
โข Availability Sets: ๋ฌผ๋ฆฌ์ ์๋ฒ ๋ถ์ฐ
โข Availability Zones: ๋ฐ์ดํฐ์ผํฐ ๋ถ์ฐ
โข Azure SQL Database: ์๋ ๋ฐฑ์ ๋ฐ ๋ณต์
โข Traffic Manager: ๊ธ๋ก๋ฒ ๋ก๋ ๋ฐธ๋ฐ์ฑ
๐น GCP์ HA ์ ๊ทผ๋ฒ
๊ตฌ๊ธ ํด๋ผ์ฐ๋๋ ๊ธ๋ก๋ฒ ๋คํธ์ํฌ๋ฅผ ํ์ฉํ HA๊ฐ ๊ฐ์ ์ด์ผ:
โข Cloud Load Balancing: ๊ธ๋ก๋ฒ ๋ก๋ ๋ฐธ๋ฐ์ฑ
โข Managed Instance Groups: ์๋ ํ์ฅ ๋ฐ ๋ณต๊ตฌ
โข Cloud SQL: ์๋ ํ์ผ์ค๋ฒ
โข Regional Persistent Disks: ๋ณต์ ๋ ๋์คํฌ
โข Cloud Monitoring: ํตํฉ ๋ชจ๋ํฐ๋ง
๐ฐ ๋น์ฉ ์ต์ ํ ์ ๋ต
HA ์์คํ
์ ๋น์ฉ์ด ๋ง์ด ๋ค์ด.
์๋ฒ๋ฅผ 2๋ฐฐ, 3๋ฐฐ๋ก ๋๋ ค์ผ ํ๋๊น ๋น์ฐํ์ง.
ํ์ง๋ง ๋๋ํ๊ฒ ์ค๊ณํ๋ฉด ๋น์ฉ์ ์ค์ผ ์ ์์ด! ๐ก
๐น ์ ๋ต 1: ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ
๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ Active-Active๋ก ํ ํ์๋ ์์ด.
์ค์๋์ ๋ฐ๋ผ ์ฐจ๋ฑ ์ ์ฉํ๋ ๊ฑฐ์ง:
โข ์น/์ฑ ์๋ฒ: 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
๐น ํด๋ฌ์คํฐ ๊ด๋ฆฌ
โข Docker Swarm - ๊ฐ๋จํ ์ปจํ ์ด๋ ํด๋ฌ์คํฐ๋ง
โข Apache Mesos - ๋๊ท๋ชจ ํด๋ฌ์คํฐ ๊ด๋ฆฌ
โข Nomad - HashiCorp์ ์ํฌ๋ก๋ ์ค์ผ์คํธ๋ ์ดํฐ
๐น ๋ฐ์ดํฐ๋ฒ ์ด์ค HA
โข PostgreSQL Patroni
โข MongoDB Replica Set
โข Redis Sentinel/Cluster
โข Galera Cluster (MySQL/MariaDB)
๐น ๋ชจ๋ํฐ๋ง
โข 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)
๐ฌ ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์, ์ฌ๊ธฐ๊น์ง ์ฝ์๋ค๋ฉด ์ ๋ง ๋๋จํด! ๐
๊ณ ๊ฐ์ฉ์ฑ ์๋ฒ ํด๋ฌ์คํฐ๋ง์ ๋ณต์กํ์ง๋ง, ์ ๋๋ก ๊ตฌ์ถํ๋ฉด
๋ฐค์ ํธํ๊ฒ ์ ์ ์๋ ์์คํ
์ ๋ง๋ค ์ ์์ด. (๋ฌผ๋ก ์ฒ์์ ๋ถ์ํด์ ๋ชป ์์ง๋ง ๐
)
ํต์ฌ์ ์ ๋ฆฌํ์๋ฉด:
1๏ธโฃ ๋จ์ผ ์ฅ์ ์ ์ ๊ฑฐ: ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ์ด์คํํ๋ผ
2๏ธโฃ ์๋ํ: ์ฌ๋์ ๊ฐ์ ์์ด ์๋์ผ๋ก ๋ณต๊ตฌ๋์ด์ผ ํด
3๏ธโฃ ๋ชจ๋ํฐ๋ง: ๋ณด์ด์ง ์์ผ๋ฉด ๊ด๋ฆฌํ ์ ์์ด
4๏ธโฃ ํ ์คํธ: ์ค์ ์ฅ์ ์ ์ ๋ฏธ๋ฆฌ ํ ์คํธํ๋ผ
5๏ธโฃ ๋ฌธ์ํ: ์๋ฒฝ 3์์ ์ฅ์ ๋๋ฉด ๋ฌธ์๊ฐ ์๋ช ์ค์ด์ผ
6๏ธโฃ ์ ์ง์ ๊ฐ์ : ์๋ฒฝํ ์์คํ ์ ์์ด, ๊ณ์ ๊ฐ์ ํ๋ผ
HA ์์คํ
๊ตฌ์ถ์ ๋ง๋ผํค์ด์ผ, ๋จ๊ฑฐ๋ฆฌ ๋ฌ๋ฆฌ๊ธฐ๊ฐ ์๋์ง.
์ฒ์๋ถํฐ ์๋ฒฝํ๊ฒ ๋ง๋ค๋ ค๊ณ ํ์ง ๋ง๊ณ , ๋จ๊ณ์ ์ผ๋ก ๊ฐ์ ํด๋๊ฐ๋ ๊ฒ ์ค์ํด.
๊ทธ๋ฆฌ๊ณ ํผ์ ๊ณ ๋ฏผํ์ง ๋ง๊ณ , ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์
๊ฒฝํ ๋ง์ ์ ๋ฌธ๊ฐ๋ค๊ณผ ์ํตํ๋ฉด์ ๋ฐฐ์๋๊ฐ๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์์ด! ๐
์๋ฒ๊ฐ ์ ๋ ์ฃฝ์ง ์๋ ๊ทธ๋ ๊น์ง, ํ์ดํ
! ๐ช
์ง๋ฌธ์ด๋ ๊ถ๊ธํ ์ ์ด ์์ผ๋ฉด ์ธ์ ๋ ๋ฌผ์ด๋ด.
์ฐ๋ฆฌ ๋ชจ๋ ์์ ์ ์ธ ์์คํ
์ ๋ง๋๋ ๊ทธ๋ ๊น์ง! ๐
โข ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ (Kubernetes ์ฌํ)
โข ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ
โข ์๋น์ค ๋ฉ์ (Istio, Linkerd)
โข ์นด์ค์ค ์์ง๋์ด๋ง
โข ์ฌ์ดํธ ์ ๋ขฐ์ฑ ์์ง๋์ด๋ง (SRE)
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.