๐ ์ด ๋ด์ฉ์ ์ฑ
๋ด์ฉ ๋ฉ๋ชจ์
๋๋ค.
๊ฐ์ธ์ ์ธ ์๊ฐ๊ณผ ๊ฒฝํ ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ ์ก๋ด์ด ์์ผ๋, ์ฑ
์ ์ฝ์ผ๋ฉฐ ์๊ฒฌ์ ๋๋๊ณ ์ถ์๋ถ์ด ๋ด์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค.
2.1 ํธ๋ํฝ ๊ด๋ฆฌ
2.1.1 SPOF (single point of failure)
ํด๋ผ์ฐ๋๋ ๋ฉํฐํ
๋ํธ ํ๊ฒฝ์ด๊ธฐ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์์ง ๋ชปํ๋ ์ฌ์ด์ ์ฅ์ ๊ฐ ๋ฐ์ํ๊ณ , ์์ธ๋ถ์๋ ์ฝ์ง ์๋ค. (์ ๋ฒ์ ๊ฒช์ cloudfront์ฅ์ ์ฒ๋ผ..)
ํนํ ๋คํธ์ํฌ๋ SPOF ํน์ง์ ๊ฐ์ง๊ณ ์๊ณ ๊ทธ ์ํฅ๋๊ฐ ๋งค์ฐ ํฌ๋ฆฌํฐ์ปฌํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ด์ธก๊ฐ๋ฅ์ฑ ๋ฟ๋ง ์๋๋ผ ๋คํธ์ํฌ ํธ๋ํฝ์ ์์งํ๊ณ ๊ด๋ฆฌํ์ฌ ์ฌ์ ์ ํ์งํ๊ณ ์์ธกํ๋๊ฒ์ด ์ค์ํ๋ค.
2.1.2 ๋ก๋๋ฒจ๋ฐ์
ํด๋ผ์ฐ๋ + ์ฟ ๋ฒ๋คํฐ์ค์ ์กฐํฉ์ผ๋ก ๋คํธ์ํฌ์ ๋ณต์ก๋๊ฐ ๋งค์ฐ ํฌ๊ฒ ์ฆ๊ฐํ๋ค.๐ญ๐ญ๐ญ๐ญ
๋ง์ด ์ฌ์ฉ๋๋ 3๊ฐ์ง ๋ก๋๋ฒจ๋ฐ์ ์ ํ์ ์๊ฐํ๊ณ ์๋ค.
ํ๋ซํผ ๋ก๋๋ฒจ๋ฐ์ฑ
- AWS๋ก ์น๋ฉด ALB, NLB, nginx์ ๊ฐ์ 4๊ณ์ธต 7๊ณ์ธต ๋ก๋๋ฒจ๋ฐ์๋ฅผ ๋งํ๋ค.
๊ฒ์ดํธ์จ์ด ๋ก๋๋ฒจ๋ฐ์ฑ
- api gateway๋ฅผ ๋งํ๋ค.
- ๋ก๋๋ฒจ๋ฐ์ฑ,๋ผ์ฐํ , ์ธ์ฆ,๋ณด์๊ฒ์ฌ,SSLํฐ๋ฏธ๋ค์ด์ ๊ณผ ๊ฐ์ ํ๋ซํผ ๋ก๋๋ฒจ๋ฐ์ฑ์ ๊ธฐ๋ฅ๋ ์ํํ์ง๋ง ํ๋ซํผ ๋ก๋๋ฒจ๋ฐ์ฑ์ ๊ฐ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ๋ง์ ์ํด ์ฌ์ฉํ๋ค๋ฉด, ๊ฒ์ดํธ์จ์ด ๋ก๋๋ฒจ๋ฐ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ค์์ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํ๋ค. (๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ณ์ผ๋ ํ์ํ๊ฒ๊ฐ๋ค..)
- ๊ฒ์ดํธ์จ์ด ๋ก๋๋ฒจ๋ฐ์ฑ ์ ๋ต์ ๊ตฌ์ถํ ๋ ๋ ์ดํด์ ์งํ์ ๋ฆฌ์์ค ์ฌ์ฉ๋ฅ ์งํ๋ฅผ ๋ชจ๋ ๊ณ ๋ คํด์ผ๊ฐ๋ค.
- ๋ ์ดํด์(Latency): ์ฌ์ฉ์๊ฐ ์๋น์ค์ ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ. ๋คํธ์ํฌ์ง์ฐ, ์๋ฒ ์ฒ๋ฆฌ์๊ฐ๋ฑ์ ๊ธฐ๋ฐํ๋ค.
๋ก๋๋ฒจ๋ฐ์๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ผ์ด๋๋ก๋ ํธ๋ฆฝ(RTT)๋ฅผ ์ธก์ ํ์ฌ ์๋ฒ ์๋ต์๊ฐ์ ํ์ ํ ์ ์๋ค. - ๋ฆฌ์์ค ์ฌ์ฉ๋ฅ (Resource Utilization): CPU/MEM/๋์คํฌIO/๋คํธ์ํฌํธ๋ํฝ ๋ฑ ๋ถํ๋ฅผ ํ์ธํ ์ ์๋ ์งํ๋ค.
- ๋ ์ดํด์(Latency): ์ฌ์ฉ์๊ฐ ์๋น์ค์ ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ. ๋คํธ์ํฌ์ง์ฐ, ์๋ฒ ์ฒ๋ฆฌ์๊ฐ๋ฑ์ ๊ธฐ๋ฐํ๋ค.
- ์์: ์คํ๋งํด๋ผ์ฐ๋ ๊ฒ์ดํธ์จ์ด, ๋ทํ๋ฆญ์ค ์ค(Zuul}
ํด๋ผ์ด์ธํธ์ธก ๋ถํ ๋ถ์ฐ (Client-side Load Balancing)
- ์ฌ๊ธฐ์ ๋งํ๋ 'ํด๋ผ์ด์ธํธ'๋ ์๋น์ค๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ค.
- ์ด ํด๋ผ์ด์ธํธ์์ ์ฌ๋ฌ ์๋ฒ์ค ํ๋๋ก ํธ๋ํฝ์ ์ ๋ฌํ๋๋ก ํ๋๊ฒ์ด ํด๋ผ์ด์ธํธ์ธก ๋ถํ ๋ถ์ฐ์ด๋ค.
- ํด๋ผ์ด์ธํธ์ธก ๋ก๋๋ฒจ๋ฐ์ฑ ์๋๋ฐฉ์
- ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ: ํด๋ผ์ด์ธํธ๋ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ ๋ชฉ๋ก์ ์์๋ธ๋ค.
- ๊ฒฐ์ ๋ก์ง: ํด๋ผ์ด์ธํธ ๋ด์ฅ ๋ก๋๋ฐธ๋ฐ์ ๋ก์ง(์, ๋ผ์ด๋๋ก๋น)์ ์ฌ์ฉํ์ฌ ์ด ์์ฒญ์ ์ด๋์ ๋ณด๋ผ์ง ๊ฒฐ์ ํ๋ค.
- ์์ฒญ์ ์ก: ํด๋ผ์ด์ธํธ๋ ์ ํ๋ ์๋ฒ ์ธ์คํด์ค๋ก ์์ฒญ์ ๋ณด๋ธ๋ค.
- ์์: istio, ๋ทํ๋ฆญ์ค Ribbon
- ๊ถ๊ธํด์ ์ฐพ์๋ณธ๊ฒ - ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ฅผ ํตํด ์์๋ธ ์๋ฒ๊ฐ ๋ง์นจ ์ฅ์ ์ํฉ์ด๋ฉด ์ด๋ป๊ฒ ํ๋?
- HealthChecks: ๋น์ฐํ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ๊ฐ ์ ์์ธ์ง ํ์ธํ๋ ๋ก์ง์ด ํ์ํ๊ณ , ์ ์์ด ์๋๋ผ๋ฉด ์๋ฒ๋ชฉ๋ก์์ ์ ์ธํ๋ค.
- ํ๋ก ์ฐจ๋จ๊ธฐ ํจํด ๊ตฌํ (curcuit breaker): ํน์ ์๋ฒ๋ก์ ์์ฒญ์ด ์ง์๋๋๊ฒฝ์ฐ, ํด๋น ์๋ฒ๋ก์ ์์ฒญ์ ์ฐจ๋จ(ํ๋ก์ฐจ๋จ)ํ๊ณ ๋ค๋ฅธ ์๋ฒ๋ก ์์ฒญ์ ์ ์กํ๋ค. ์คํจํ ์๋ฒ๊ฐ ๋ณต๊ตฌํ ์๊ฐ์ ๋ฒ๊ณ ๋ ์ ์ฒด์ ์ธ ๋ถํ๋ฅผ ๋ฎ์ถ๋๋ฐ ์ข๋ค.
- ์ฌ์๋ ๋งค์ปค๋์ฆ: ์์ฒญ์ด ์คํจํ๋ฉด ํด๋ผ์ด์ธํธ๋ ์๋์ผ๋ก ๋ค๋ฅธ ์๋ฒ ์ธ์คํด์ค์ ์์ฒญ์ ์ฌ์๋ ํ๋ค. ์ฌ์๋๋ ์ ํ๋ ํ์์ ์ ๋ต(์,์ง์๋ฐฑ์คํ)๋ฅผ ์ฌ์ฉํ๋ค. (๋คํธ์ํฌ ์ค๋ฒํค๋ ์กฐ์ฌ)
- ํ์์์ ์ค์ : ์์ฒญ์ ํ์์์์ ์ค์ ํด์ ์๋ฒ์๋ต์ด ์ง์ ๋ ์๊ฐ ๋ด์ ์ค์ง ์์ผ๋ฉด ์คํจํ๋๋ก ํ๊ณ , ์ฌ์๋ ๋งค์ปค๋์ฆ์ ํตํด ๋ค์ ์์ฒญํ๋๋ก ํ๋ค.
- ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๋๊ธฐํ: ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ์์คํ ์ ๋น์ฐํ๊ฒ๋ ์๋ฒ์ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋๊ธฐํ ํด์ผํ๋ค.
2.1.3 ๋ณต์์ฑ ํจํด
- ์ ํ๋ฆฌ์ผ์ด์ ๊ด์ ์์ ๋ณต์๋ ฅ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ์์ค ๋ด ์์ธ์ฒ๋ฆฌ, ์ฌ์๋, ํ์์์ ๋ฑ์ ์ ์ํ๋๊ฒ์ด๋ค.
- ๋น์ฆ๋์ค์ ์ธ ์๋ฌ์ ์์คํ ์๋ฌ๋ฅผ ๊ตฌ๋ถํ๊ณ , ์ ํ์ ๋ฐ๋ผ ํ์์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค.
- ์ธํ๋ผ ๊ด์ ์์ ๋ณต์๋ ฅ์ ๋์ด๋๊ฒ์ ์๋น์ค๋ฉ์์ ๋ฉ์ธ์ง์ ์ฌ์ฉํ๋๊ฒ์ด๋ค.
๋ณต์์ฑ ํจํด1. ์ฌ์๋
- ๋น์ฆ๋์ค์๋ฌ์ธ ๊ฒฝ์ฐ, ํธ์ถ์๊ฐ ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๊ฑฐ๋ ํ๋ก๊ทธ๋จ์ ๋ฒ๊ทธ๋ก ์ธํด ๋ฐ์ํ์๋๋ ์ฌ์๋ ๋ถํ์ํ๋ค.
- ์์คํ ์๋ฌ์ธ ๊ฒฝ์ฐ, ๋คํธ์ํฌ์ ์ผ์์ ์ธ ์ง์ฐ, ์๊ฐ์ ์ธ ์ฌ์ฉ๋ฅ ์ด์ ๋ฑ ์ธ ๊ฒฝ์ฐ ์ผ์ ์ฃผ๊ธฐ๋ก ์ฌ์๋ ํ๋ฉด ์ ์์ ์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์๋น์ค์ ๋ํ ๋๋ฉ์ธ ์ง์์ด ์์ด์ผ ์ฌ์๋ ์ฒ๋ฆฌ์ ๋ํด ํ๋จํ ์ ์์ผ๋ฉฐ ์ฒ๋ฆฌ์๊ฐ์ด ์ด๊ณผ๋์์๋ ์ฌ์๋๋ฅผ ํ์ฉํ ๊ฒ์ธ์ง, ์ฌ์๋๋ก ์ค๋ณต์ด ๋ฐ์ํ์ง๋ ์์์ง๋ ๊ณ ๋ฏผํด์ผํ๋ค.
- ๋จ, ์ฌ์๋๊ฐ ๋์ ๋์ด ๋์ฐ ์ฅ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก ์ต๋ ์ฌ์๋ ํ์์ ์๊ฐ๊ฐ๊ฒฉ์ ์ ์ฑ ์ ์ํด ์ ์ํด์ผ ํ๋ค.
๋ณต์์ฑ ํจํด2. ๋น์จ์ ํ
- ํน์ ์๊ฐ๋์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์์ฒญ์๋ฅผ ์ ํํ๋๊ฒ์ ๋งํ๋ค.
- ์์คํ ์ด ๊ณผ๋ถํ ์ํ์ ๋์์๋ ์์คํ ์ ์ฒด๋ฅผ ์ ์ง์์ผ๋ฒ๋ฆด ์ ์์ผ๋ฏ๋ก ๋น์จ์ ์ ํํจ์ผ๋ก์จ, ์ ํ๋ ๋งํผ ๋ง์ด๋ผ๋ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค.
- ๋๋ถ๋ถ์ LoadBalancer์์ ๊ตฌํํ ์ ์์๊ฒ์ผ๋ก ๋ณด์ธ๋ค. (ํน์ ์๊ฐ๋์ ํ์ฉ๋ ์์ฒญ์๋ฅผ ์ด๊ณผํ๋๊ฒฝ์ฐ HTTP 429 ๋ฐํ ๋ฑ)
๋ณต์์ฑ ํจํด3. ๋ฒํฌํค๋
- ๋ฐฐ์ ๊ตฌํ์ ๋๋๋ ๋ฐฉ์๋ฒฝ(๋ฒํฌํค๋)์์ ์ ๋ํ์ผ๋ฉฐ, ์์คํ ์ ์ฌ๋ฌ๋ถ๋ถ์ ๊ฒฉ๋ฆฌํ๋ ๊ธฐ์ ์ด๋ค.
- ํ ๊ตฌํ์์ ์ฅ์ ๊ฐ ๋ฐ์ํด๋ ๋๋จธ์ง ๊ตฌํ์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ํ๋ ๋ฐฉ์์ด๋ค.
- ๋ชฉ์ : ์์คํ ์ ๋ถ๋ถ์ ์ธ ์คํจ๋ก๋ถํฐ ์๋ฅธ ๋ถ๋ถ์ ๋ณดํธํ๊ธฐ ์ํด ๋ ผ๋ฆฌ์ /๋ฌผ๋ฆฌ์ ์ผ๋ก ๋ถ๋ฆฌํ๋๋ฐ ์ค์ ์ ๋๋ค.
- ์์: ์ค๋ ๋ ํ (ex.java ExcutorService), ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ..๋ฑ๋ฑ
๋ณต์์ฑ ํจํด4. ์ํท๋ธ๋ ์ด์ปค
- ์ ๊ธฐํ๋ก์ ์ํท ๋ธ๋ ์ด์ปค์์ ์๊ฐ์ ๋ฐ์ ์ํํธ์จ์ด ์ค๊ณ ํจํด์ผ๋ก, ์ฅ์ ๊ฐ ๋ฐ์ํ ์์คํ ์ ์ฐ๊ฒฐ์ ์๋์ผ๋ก ๋์ด ์ค๋ฅ์ ์ ํ๋ฅผ ๋ฐฉ์งํ๋๊ฒ์ ๋งํ๋ค.
- ๋ชฉ์ : ์คํจ๊ฐ ๊ฐ์ง๋์์๋ ์ถ๊ฐ์ ์ธ ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋์ผ๋ก ์ฐ๊ฒฐ์ ๋๋๋ฐ ์ค์ ์ ๋๋ค.
- ์ํท๋ธ๋ ์ด์ปค์ ํจ๊ป Kafka๊ฐ์ ๋ถ์ฐ ๋ฉ์ธ์ง ์์คํ ์ ์ ์ฉํ๋๊ฒ๋ ์ข๋ค.
- Netflex์ Hystrix
2.1.4 ๊ฐ์์ฑ
- ์ด ์ฑ ์์ ๋งํ๋ ๊ฐ์์ฑ์ ๋คํธ์ํฌ/์ธํ๋ผ ๋ถ๋ถ์ด๋ค.
- ๊ด์ธก๊ฐ๋ฅ์ฑ๊ณผ ๊ฐ์์ฑ์ ์ํธ ๋ณด์์ ์ด๋ฉฐ ๋จ์ผ ์์คํ ๋ด์ ๊ตฌ์ถํ๋๊ฒ์ ๊ถ์ฅํ๋ค.
2.1.5 ์๋น์ค ๋งค์
- ์๋น์ค ๋ฉ์๋ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ณ์์ ์๋น์ค๊ฐ์ ํต์ ์ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํ ์๋ฃจ์ ์ด๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค์ ์ฌ์ดํธ์นด ํจํด์ ์ฌ์ฉํ๋ ๊ฒฝ๋ ํ๋ก์๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์๋น์ค๊ฐ์ ๋ชจ๋ ํต์ ์ ์ค์ฌํ๋ค. (istio envoy proxy)
- ์๋น์ค ๋งค์๋ ์๋น์ค๊ฐ์ ํต์ (๋ก๋๋ฒจ๋ฐ์ฑ,์ฅ์ ๋ณต๊ตฌ,์๋น์ค๋์ค์ปค๋ฒ๋ฆฌ), ๋ณด์(SSL,์ ๊ทผ์ ์ด), ๊ด์ธก๊ฐ๋ฅ์ฑ(๋ก๊น ,๋ชจ๋ํฐ๋ง,์ถ์ ๋ฑ) ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ๋ค๋ง, ์ด ์ฑ
์์๋ ์ฌ์ด๋์นด ํจํด์ผ๋ก ๊ตฌํ๋๋ ์๋น์ค ๋งค์์ ๋ํ ๋จ์ ์ ์ ๋ฆฌํ๊ณ , eBPF๋ฅผ ์ง์ํ๋ Cilium์ ์ถ์ฒํ๋ค
- ๋จ์ 1. ์ด์คํฐ์ค๋ ๋ฒํฌํํ์ ๊ฐ๊น์ด ์ํท๋ธ๋ ์ด์ปค๋ง ์ง์ํ๋ค.
- ๋จ์ 2. ๊ด๋ฆฌ์ ์ฑ ์ yaml๋ก ๊ตฌ์ฌํ ์ ์๋ ์์ค ์ด์์ผ๋ก ์ ๊ตํ๊ฒ ๊ตฌ์ฑํ ์ ์๋ค.
- ์ฌ์ดํธ์นด๋ ๋น์ผ ๋ฆฌ์์ค์ด๋ฉฐ, ์ด์คํฐ์ค์ ๋ด๋ถ ๋คํธ์ํฌ ์ฒ๋ฆฌ๊ณผ์ ์ ๋ค์ ๋นํจ์จ์ ์ด๋ค.
- ์์: Istio, Linkerd, Consul Connect(์ฝ์ ์ด๊ฑฐ Loki์์ ๋ณธ์ ์ด ์๋ค!!)
2.2 ์ฟ ๋ฒ๋คํฐ์ค ์คํ ์ค์ผ์ผ๋ง
์ฟ ๋ฒ๋คํฐ์ค๋ HPA(Horizontal Auto Scaler)๋ฅผ ์ฌ์ฉํ์ฌ ์๋ ๋ฆฌ์๋ฅผ ํ๋ ์ค์ผ์ผ๋ง์ ์ฌ์ฉํ ์ ์๋ค.
HPA๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋ ค๋ฉด CPU (.spec.resources.requests) ์ ํ์ ์ ์ธํด์ผํ๊ณ , ๋ฉํธ๋ฆญ ์๋ฒ๋ฅผ ํ์ฑํ ํด์ผํ๋ค. (๋น์ฐํ ๋ฐ๋ชฌ์
์ ๋ถ๊ฐํ๋ค)
- ๋ํ๋ก์ด๋จผํธ
- ๋ ํ๋ฆฌ์นด์
- ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ
- ์คํ ์ดํธํ์
ํ๋ ์ค์ผ์ผ๋ง์ ๋ฆฌ์์ค ๋ฉํธ๋ฆญ (Cpu/Mem) ๋ฑ์ ๋ฆฌ์์ค ์ฌ์ฉ๋๊ธฐ์ค, ์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ์ ์ฌ์ฉํ์ฌ ์คํ ์ค์ผ์ผ๋ง ํ ์ ์๋ค.
์ฌ์ฉ์ ์ ์ ๋ฉํธ๋ฆญ์ custom.metrics.k8s.io API๊ฒฝ๋ก์ Aggregated API์๋ฒ๋ก ์ํ๋๊ณ , ํ๋ก๋ฉํ
์ฐ์ค ๋ฑ ๋ฉํธ๋ฆญ ์๋ฃจ์
๊ณต๊ธ์
์ฒด์์ ์ ๊ณตํ๋ ์ด๋ํฐ API์๋ฒ์์ ์ ๊ณตํ๋ค.
ํ๋ ๋ ๋ฒจ์ ์คํ ์ค์ผ์ผ๋ง์ ๋ ธ๋์ ์คํ ์ค์ผ์ผ๋ง๊ณผ ๊ฐ์ด ๋์ํด์ผํ๋ค.
2.2.1 ์คํ ์ค์ผ์ผ๋ง ์คํ์์ค
์คํ ์ค์ผ์ผ๋ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ด๋ฅผ ์ง์ํ๋ ์คํ์์ค๋ฅผ ํ์ธํ๋ค.
๋ฉํธ๋ฆญ ์๋ฒ
- kubelet์ ์ปจํ ์ด๋ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ํ ๋ ธ๋ ์์ด์ ํธ์ด๋ฉฐ, /stats/summary ์๋ํฌ์ธํธ๋ฅผ ํตํด ๋ ธ๋๋ณ ์์ฝ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ค.
- ๋ฉํธ๋ฆญ ์๋ฒ๋ ๊ฐ kubelet์ผ๋ก๋ถํฐ ์์งํ๊ณ ์ง๊ณํ์ฌ API ์๋ฒ์ ๋ณด๋ธ๋ค.
- API์๋ฒ๋ HPA, VPA(Vertical Pod Autoscaler), kubectl top ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ๋ฉํธ๋ฆญ API๋ฅผ ์ ๊ณตํ๋ค.
๋ฉํธ๋ฆญ ์๋ฃจ์ ๊ณต๊ธ์ ์ฒด์์ ์ ๊ณตํ๋(์,ํ๋ก๋ฉํ ์ฐ์ค) ์ด๋ํฐ
- ํ๋ก๋ฉํ ์ฐ์ค ์ด๋ํฐ๋ฅผ ์ฌ์ฉํ ์ฌ์ฉ์์ ์ ๋ฉํธ๋ฆญ์ผ๋ก์ HPA๋ 3์ฅ์์ ๋ค์ ์ค๋ช ํ๋ฏ๋ก ํจ์ค
KEDA (Event Driven AutoScaling)
- ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ํ์ฅํ๋ค. (Event Driven Autoscaler)
- Apache kafka์ ๊ฐ์ queue์๋น์ค์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ข๋ค.
- ์๋ฅผ๋ค์ด, Kafka์ ๋ฉ์ธ์ง ํ๊ฐ ์ฆ๊ฐํ๋ฉด, KEDA๊ฐ ๊ฐ์งํ๊ณ Pod๋ฅผ ์๋์ผ๋ก ๋๋ ค์ฃผ๋๋ก ํ ์ ์๋ค.
- Apache Kafka ์ธ์๋ RabbitMQ, Azure Event Hubs, AWS SQS ๋ฑ์ ๋ฉ์ธ์ง ์๋น์ค์๋ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
2.2.2 ๋ฉํธ๋ฆญ ์ธก์
์์์ ๋ฉํธ๋ฆญ์ ์ด์ฉํด์ ์คํ ์ค์ผ์ผ๋ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ํฌ๊ฒ 3๊ฐ์ง๋ฅผ ์์๋ดค๋ค.
CPU, Memory ์ฌ์ฉ๋ ์ธ์๋ ์ด๋น์ฒ๋ฆฌ๊ฐ์(TPS), ์ฒ๋ฆฌ์ง์ฐ์๊ฐ(Latency) ๋ฑ์ ํ์ฉํ ์ ์๊ณ , ์ด๋ฐ ๋ฉํธ๋ฆญ์ ์กฐํฉํ ๊ฐ์ผ๋ก๋ ์คํ ์ค์ผ์ผ๋ง์ ํธ๋ฆฌ๊ฑฐ ์ํฌ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด๋ค ๋ฉํธ๋ฆญ์ ์คํ ์ค์ผ์ผ๋ง์ ์ด์ฉํ ์ ์๋์ง ์์๋ณธ๋ค.
ํนํ, ๊ตฌ๊ธ SRE์ด ์ ์ํ๋ 4๊ฐ์ง ๊ณจ๋ ์๊ทธ๋ (Latency, Traffic, Errors, Saturation)์์ ์ข์ ์์๋ฅผ ๋ณผ ์ ์๋ค.
The Four Golden Signals
์ถ์ฒ: https://sre.google/sre-book/monitoring-distributed-systems/
The four golden signals of monitoring are latency, traffic, errors, and saturation. If you can only measure four metrics of your user-facing system, focus on these four.
Latency
The time it takes to service a request. It’s important to distinguish between the latency of successful requests and the latency of failed requests. For example, an HTTP 500 error triggered due to loss of connection to a database or other critical backend might be served very quickly; however, as an HTTP 500 error indicates a failed request, factoring 500s into your overall latency might result in misleading calculations. On the other hand, a slow error is even worse than a fast error! Therefore, it’s important to track error latency, as opposed to just filtering out errors.
Traffic
A measure of how much demand is being placed on your system, measured in a high-level system-specific metric. For a web service, this measurement is usually HTTP requests per second, perhaps broken out by the nature of the requests (e.g., static versus dynamic content). For an audio streaming system, this measurement might focus on network I/O rate or concurrent sessions. For a key-value storage system, this measurement might be transactions and retrievals per second.
Errors
The rate of requests that fail, either explicitly (e.g., HTTP 500s), implicitly (for example, an HTTP 200 success response, but coupled with the wrong content), or by policy (for example, "If you committed to one-second response times, any request over one second is an error"). Where protocol response codes are insufficient to express all failure conditions, secondary (internal) protocols may be necessary to track partial failure modes. Monitoring these cases can be drastically different: catching HTTP 500s at your load balancer can do a decent job of catching all completely failed requests, while only end-to-end system tests can detect that you’re serving the wrong content.
Saturation
How "full" your service is. A measure of your system fraction, emphasizing the resources that are most constrained (e.g., in a memory-constrained system, show memory; in an I/O-constrained system, show I/O). Note that many systems degrade in performance before they achieve 100% utilization, so having a utilization target is essential.In complex systems, saturation can be supplemented with higher-level load measurement: can your service properly handle double the traffic, handle only 10% more traffic, or handle even less traffic than it currently receives? For very simple services that have no parameters that alter the complexity of the request (e.g., "Give me a nonce" or "I need a globally unique monotonic integer") that rarely change configuration, a static value from a load test might be adequate. As discussed in the previous paragraph, however, most services need to use indirect signals like CPU utilization or network bandwidth that have a known upper bound. Latency increases are often a leading indicator of saturation. Measuring your 99th percentile response time over some small window (e.g., one minute) can give a very early signal of saturation.Finally, saturation is also concerned with predictions of impending saturation, such as "It looks like your database will fill its hard drive in 4 hours."
If you measure all four golden signals and page a human when one signal is problematic (or, in the case of saturation, nearly problematic), your service will be at least decently covered by monitoring.
- ์์ฒญ์ (number of request)
- ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ ํ๋ ์์ฒญ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
- ์์ฒญ์๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ํธ๋ํฝ ํจํด, ์์คํ ์ด ์ฒ๋ฆฌํ ์ ์๋ ์์ฒญ์, ์์ฒญ์ฒ๋ฆฌ ์ฑ๊ณต๋ฅ ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋จํ ์ ์๋ค.
- ์์ฒญ๊ธฐ๊ฐ (duration of the request)
- ์์ฒญ ๊ธฐ๊ฐ์ด๋, ํน์ ์์ฒญ์ด ์์๋์ด ์๋ฃ๋ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํ๋ค.
- ์์ฒญ์ด ์ผ๋ง๋ ๊ฑธ๋ ธ๋์ง๋ ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ์ ๋ํ๋๋ค.
- ์์คํ (์๋ฅผ๋ค์ด ALB) ์์ URI๋ณ (duration of the request)์ ๋ํ๋ผ ์ ์๋ค๋ฉด ์์ฒญ๋๊ฒ ์ ์ฉํ ๊ทธ๋ํ๊ฐ ๋ ๊ฒ๊ฐ๋ค.
- ๋์์์ฒญ
- ๋์์์ฒญ ์งํ๋, ํน์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ณ๋ชฉํ์์ด ๋ฐ์ํ๊ณ ์๋์ง ๋ฑ์ ๋ณผ ์ ์๋ค.
2.2.3 ๋ฉํธ๋ฆญ ์ ์
์ธก์ ํ๊ณ ์ ํ๋ ๋ฉํธ๋ฆญ์ ์๋ณํ๋ค๋ฉด ๋ถํํ
์คํธ๋ฅผ ํตํด ๊ฒ์ฆํด์ผํ๋ค.
๋ํ ๋ ์ ํ๋์ด์ผ ํ๋๊ฒ์ ๋ฉํธ๋ฆญ์๋ฒ, ํ๋ก๋ฉํ
์ฐ์ค ์ด๋ํฐ, KEDA๋ฑ AutoScaler๋ค์ด ์ ๋๋ก ๋์ํ๋์ง ์ด Pod๋ค์ cpu/mem ์ฌ์ฉ๋์ ํ์
ํด์ผํ๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ด AutoScaling ๋๊ธฐ ์ AutoScaler๊ฐ โ ๏ธ์ฃฝ์ด๋ฒ๋ฆฌ๋ฉด ๋ง์งฑ ๋๋ฃจ๋ฌต์ด๋ค.
- โญ๏ธ์ค์โญ๏ธ AutoScaling ์ค์ ํ ๋ ๊ณ ๋ ค์ผํด์ผํ ๊ฒ
์ฑ ์์ HPA ์ค์ ์ฃผ์์ฌํญ์ด์ง๋ง, ์ด๊ฑด K8s HPA ๋ฟ ์๋๋ผ ๋ชจ๋ ์ํฉ์์ AutoScaling ์ค์ ์ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ดํด์, AutoScaling ์ฃผ์์ฌํญ์ ์ฝ์ง ์๊ณ ๋ง๊ตฌ ์ค์ ํด๋ฒ๋ฆฌ๋ฉด ๋งค์ฐ ํฐ ์ฅ์ ๋ก ์ด์ด์ง ์ ์๋ค.
- ๋ฉํธ๋ฆญ ์ ํ
- ์ด๋ค ๋ฉํธ๋ฆญ์ ๊ธฐ์ค์ผ๋ก AutoScalingํ ๊ฒ์ธ์ง๋ ๋งค์ฐ ์ค์ํ๋ฉฐ, ๋ถํ๋ฅผ ๋ฐ์ํ๋ ์ ํํ ๋ฉํธ๋ฆญ์ ์ ์ ํด์ผํ๋ค.
- ์๋ฅผ๋ค์ด ์์ ๊ตฌ๊ธ SRE ๋ฌธ์(๋๋ณด๊ธฐ)์ ๋ฐ๋ฅด๋ฉด ์น์๋ฒ์ ๊ฒฝ์ฐ ์ด๋น HTTP์(๋จ, ์ ์ ์ปจํ ์ธ ๋ ๋์ ์ปจํ ์ธ ๋ ๋ถ๋ฆฌ ์ธ๋ถํ ํ์), ์ค๋์ค ์คํธ๋ฆฌ๋ฐ ์์คํ ์ ๊ฒฝ์ฐ ๋คํธ์ํฌ I/O ์๋ ๋๋ ๋์์ธ์ , key-value์ ์ฅ์์ ๊ฒฝ์ฐ ์ด๋น ํธ๋์ ์ ๋ฐ ๊ฒ์ ์ ๋ฑ์ ๊ธฐ์ค์ผ๋ก Traffic ์ ์ธก์ ํด์ผํ๋ค๊ณ ๋์์๋ค.
- ์ค๋ ์ฑ(thrashing) ๋ฐฉ์ง
- ์ค๋ ์ฑ์ด๋, ์์์ด ๋น๋ฒํ๊ฒ ์ถ๊ฐ๋์๋ค๊ฐ ์ ๊ฑฐ๋๋ ํ์์ ๋งํ๋ฉฐ, ์ด๋ฐ ์ฆ์์ ์คํ๋ ค ๋นํจ์จ์ ์ธ ์์ ์ฌ์ฉ ๋ฐ ์ฑ๋ฅ์ ํ๋ก ์ด์ด์ง ์ ์๋ค.
- ์์ ์ ๊ฒช์๋ ์ด์๋ก CPU๊ธฐ์ค์ผ๋ก AutoScaling๋์ํ๋๋ก ์ค์ ํด๋์๋ค๊ฐ, ์ธ์คํด์ค ๋ช๋ฐฑ๊ฐ ๋ ์์๋ ์ ์ด ์๋ค. ๋๋ฌด ์๋ฏผํ๊ฒ ์ค์ ํด๋์๋ ํ์ CPU ์ฌ์ฉ๋ฅ ๋์์ง -> ์ปจํ
์ด๋ ๋๋ฆผ -> ๋ถํ
๋ ๋ CPU๋๊ฒ ์นจ -> CPU์ฌ์ฉ๋ฅ ์๋ฎ์์ ธ์ ๋ ๋๋ฆผ -> ๋ถํ
๋ ๋ CPU๋๊ฒ์นจ ๐ฎ๐จ์ ๋ฌดํ ๋ฐ๋ณต์ด์๋ค.
์ ๋ง ์ด๋ณด์ ์ธ ์ค์์ง๋ง, ์ดํ๋ฆฌ์ผ์ด์ ์ ํน์ง์ ์ ์์ง ๋ชปํ๊ณ ์ค์ ํด๋ฒ๋ฆฌ๋ฉด ์ด๋ฐ ์ค์๋ฅผ ๊ฒช์ ์ ๋ฐ์ ์๋ค. - ์ค๋ ์ฑ ๋ฐฉ์ง๋ฅผ ์ํด ์๊ฐํด์ผํ ๊ฑด ์๋์ ๊ฐ๋ค.
- ์ ์ ํ ์งํ ์ ํ: ์ฌ๋ฐ๋ฅธ ์งํ๋ฅผ ์ ํํ๋๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค.
- ์ฟจ๋ค์ด ๊ธฐ๊ฐ ์ง์ : ๋๋ฌด ๋น ๋ฅด๊ฒ ์ค์ผ์ผ์ธ/์์ ๋์ง ์๋๋ก ์ฟจ๋ค์ด ๊ธฐ๊ฐ(์ค์ผ์ผ ์งํ์ ํฌํจํ์ง ์๋๊ธฐ๊ฐ)์ ์ค์ ํ๋ค.
- ์ ์ ํ ์ค์ผ์ผ๋ง ๊ธฐ์ค ์ง์ : ๋๋ฌด ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ์ง ์๋๋ก ์ฃผ์ํ๋ค. ์ผ์์ ์ธ ๋ถํ๋ก ์ค์ผ์ผ ์ธ/์์๋๋ฉด์ ๋ ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์์ธก ์ค์ผ์ผ๋ง ์ฌ์ฉ: ๋ถํ๊ฐ ๋ง์ ์๊ฐ์ด ์์ธก ๋๋ค๋ฉด, ์ค์ผ์ผ๋ง ํด๋๋๋ก ํ๋ค. (์, ์ ๋ 7-10์ ์ฌ์ฉ์๊ฐ ๋ ๋ชฐ๋ฆฐ๋ค๋ฉด ๊ทธ ์๊ฐ๋์์ ํ์๋ณด๋ค ๋ง์ ์๋ฒ๋ฅผ ์ค๋นํ๋๋ก ํ๋ค)
- ์ค์ผ์ผ ์ธ/์์ ์ ์ฑ ๋ถ๋ฆฌ: ์ค์ผ์ผ ์ธ/์์์ ๋ํด ๋ค๋ฅธ ์งํ, ์๊ณ๊ฐ, ์ฟจ๋ค์ด ๊ธฐ๊ฐ์ ์ค์ ํ์ฌ ์์ ์ ์ผ๋ก ์ด์ํ ์ ์๋ค. ์ด๋ ์ดํ๋ฆฌ์ผ์ด์ ํน์ฑ๊ณผ ์งํ์ ๋ํด ์ ์๊ณ ์์ด์ผ ํ๋ค.
- ์๋๊ฐ์ ํ ์ ์๋๋ก ์๋์ค์ : ์ด๋ฆ์ Auto๊ฐ ๋ค์ด๊ฐ๋ค๊ณ ํด์ ์๋ฒฝํ ์๋ํ๋ ์๋๋ค. ์๋ฒฝํ๊ฑด ๊ทธ ์ด๋์๋ ์กด์ฌํ ์ ์๋ค.. ๊ทธ๋ฌ๋ฏ๋ก.. AutoScaling์ด ๋๋ฌด ์์ฃผ ์ผ์ด๋๋ฉด ์ด์์๊ฐ ๊ฐ์ ํ ์ ์๋๋ก ์๋์ ์ค์ ํ์!
- Graceful Shutdown
- Scale-in/out ๋์์ผ๋ก ์๋ฒ(pod)๊ฐ ๊ฐ์๊ธฐ ์ข ๋ฃ๋๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์ดํ๋ฆฌ์ผ์ด์ ์ด ์์ ํ๊ฒ ์ข ๋ฃ๋ ์ ์๋๋ก, ๋ชจ๋ ์์ ์ด ์์ ํ๊ฒ ์๋ฃ๋ ์ ์๋๋ก ๋ณด์ฅํด์ผํ๋ค.
- ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํด K8s์ Lifecycle Hooks ์ค PreStop Hook์ ์ฌ์ฉํ ์ ์๋ค.
์๋ฅผ๋ค์ด, ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ PreStopํ ์ด ํธ์ถ๋์ด, ์ ์๋ ๋ช ๋ น์ด๋ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ณ , ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ ํ๊ฒ ์ข ๋ฃ์ํจ๋ค.- [์ฐธ๊ณ ] ์ฟ ๋ฒ๋คํฐ์ค(Kubernetes)์์ ํ
(Hook) ํธ๋ค๋ฌ ์ข
๋ฅ
- Lifecycle Hooks:
- PostStart: ์ด ํ ์ ์ปจํ ์ด๋๊ฐ ์์ฑ๋๊ณ ๋ฐ๋ก ์คํ๋ ์งํ์ ํธ์ถํ๋ค. ์ด ํ ์ด ์คํ๋๋ ๋์, ์ปจํ ์ด๋์ ๋ฉ์ธ ํ๋ก์ธ์ค๋ ์์ง ์์๋์ง ์์ ์ ์๊ณ , PostStart ํ ์ด ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๋ฉด, ์ปจํ ์ด๋๋ ์ ์์ ์ผ๋ก ๊ณ์ ์คํ๋๋ค.
- PreStop: ์ด ํ ์ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ํธ์ถ๋๋ค. ์ด ํ ์ ์ฌ์ฉํ๋ฉด ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ํ์ํ ์ ๋ฆฌ ์์ ์ ์ํํ๋ค. PreStop ํ ์ด ํธ์ถ๋ ํ, ์์คํ ์ SIGTERM ์ ํธ๋ฅผ ์ปจํ ์ด๋์ ๋ฉ์ธ ํ๋ก์ธ์ค์ ๋ณด๋ด์ด ์ข ๋ฃ ์ ์ฐจ๋ฅผ ์งํํ๋ค.
- Admission Hooks: (https://kyverno.io/docs/introduction/ ๐ฅ Kyverno๊ฐ ์ด ํ
์ ์ฌ์ฉํ๋ค.)
Admission Hooks๋ API ์๋ฒ์ ๋ค์ด์ค๋ ์์ฒญ์ ๊ฐ๋ก์ฑ์ด ๊ฒ์ฆํ๊ฑฐ๋ ์์ ํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์ด ํ ์ ์ฃผ๋ก ๋ฆฌ์์ค ์์ฑ, ์์ , ์ญ์ ๋ฑ์ ์์ฒญ์ด ์ฟ ๋ฒ๋คํฐ์ค API ์๋ฒ์ ๋๋ฌํ๊ธฐ ์ ์ด๋ ํ์ ํน์ ๋ก์ง์ ์คํํ๋๋ก ์ค์ ๋๋ค.- Validating Admission Webhooks: ์ด ํ ์ ์์ฒญ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ํน์ ๊ท์น์ด๋ ์ ์ฑ ์ ์ค์ํ๋์ง ๊ฒ์ฆํ๊ณ , ๊ฒ์ฆ์ ์คํจํ๋ฉด ์์ฒญ์ ๊ฑฐ๋ถ๋๋ค.
- Mutating Admission Webhooks: ์ด ํ ์ ์์ฒญ๋ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ์์ค์ ๋ํ ๊ธฐ๋ณธ๊ฐ ์ค์ , ๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ ๋ฑ์ ์ํํ ์ ์๋ค.
- Lifecycle Hooks:
- [์ฐธ๊ณ ] ์ฟ ๋ฒ๋คํฐ์ค(Kubernetes)์์ ํ
(Hook) ํธ๋ค๋ฌ ์ข
๋ฅ
- ์ง์ฐ๋ฐ์
- ์์ ์ฟจ๋ค์ด๊ณผ ๊ฐ์ ๋งฅ๋ฝ์ธ๊ฒ ๊ฐ๋ค.
- ์ฃผ์ํด์ผํ ๊ฑด, ์ง์ฐ์๊ฐ์ ๋๋ฆฌ๋ฉด AutoScaling๋์์ด ๋ํด์ง๊ณ , ์ง์ฐ์๊ฐ์ด ์งง๊ฑฐ๋ ์์ผ๋ฉด ์ค๋ ์ฑ์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
- ๋ฉํธ๋ฆญ ์ ํ
# ์ง์ฐ๋ฐ์(Cooldown) ์ค์ ์์
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
namespace: my-namespace
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # ์ค์ผ์ผ ๋ค์ด ๊ฒฐ์ ์ ์ง์ฐ์ํค๋ ์๊ฐ์ ์ด ๋จ์๋ก ์ค์ (5๋ถ)
policies:
- type: Pods
value: 1
periodSeconds: 60
- type: Percent
value: 10
periodSeconds: 60
2.3 ๊ด์ธก๊ฐ๋ฅ์ฑ ํ๋ก์ธ์ค
2.3.1 ๊ด์ธก๊ฐ๋ฅ์ฑ ์ด์ ํ๋ก์ธ์ค
[ ๋ฉํธ๋ฆญ ๋ถ์ ] → [ ์ถ์ ๋ถ์ ] → [ ๋ก๊ทธ ๋ถ์ ]
โโโโโโ
์ด ๋ถ๋ถ์์ ๋ฌด์์ ์ค๋ช ํ๊ณ ์ถ์๊ฑด์ง ์ ํํ๊ฒ ๋ชจ๋ฅด๊ฒ ๋ค.. ๊ทธ๋๋ ํน์๋ชจ๋ฅด๋ ์ ์ด๋์.
- ๋ฉํธ๋ฆญ ๋ถ์: SLI (Service Lever Indicater(์๋น์ค ์์ค ์งํ)), SLO (Service Lever Object(์๋น์ค ์์ค ๋ชฉํ))๋ฑ ๋ค์ํ ์ ๋ขฐ์ฑ ์งํ๋ฅผ ์์ฉํด์ ์๋์ ๋ฌด ๊ท์น์ ๊ฐ๋ฐํ๋ค.
- ์ถ์ ๋ฐ ๋ก๊ทธ๋ ๋น์ฉ์ ์ ์ดํ๊ธฐ ์ํด ์ํ๋ง ๋๋ค.
- ๋ฉํธ๋ฆญ๊ณผ ์ถ์ ์ ์ํธ ์ฐ๊ฒฐ๋ ์ ์๋๋ก ํ๊ทธ๋ฅผ ์ค์ฒฉ์์ผ์ผ ํ๋ค. ๋ถ์ฐ์ถ์ ์ ํน์ ์ฌ์ฉ์๋ ์ํธ์์ฉ์ ์์ฒญ์ ๊ด์ฐฉํ ์ ์๋๋ก ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ ํ๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด ์ข๋ค (*์นด๋๋๋ฆฌํฐ: ์ ์ฒด ํ์ ๋ํ ํน์ ์ปฌ๋ผ์ ์ค๋ณต ์์น)
- ๋ฉํธ๋ฆญ๊ณผ ์ถ์ ๋ช ์ ์ผ๊ด๋๊ฒ ์ ์งํ๋๊ฒ์ด ํ ๋ ๋ฉํธ๋ฆฌ์ ์ํธ ์ฐ๊ด์ฑ์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ฆ๊ฐํ ํธ๋ํฝ์ผ๋ก ์ธํด์ ์ง์ฐ์ด ๋ฐ์ํ๊ณ ์ฒ๋ฆฌ ์๊ฐ์ด ์ฆ๊ฐํ๋ค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ํธ๋์ญ์ ์ ์์ธํ ๋ถ์ํด์ผํ๋ค. TraceID๋ก ๊ฑฐ๋๋ฅผ ์๋ณํ๊ณ ์ง์ฐ์ด ๋ฐ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ธํ๋ค. ์ถ์ ์ ๋ก๊ทธ (์คํฌ์ฝํ ์คํธ)์ ํ๊ทธ๋ฅผ ์์ธํ ๋ถ์ํ๋ค.
- ์ถ์ ์ ๋ก๊น ๋ณด๋ค ์ฐ์ ๋์ด์ผ ํ๋ค. ์์งํ๋์ ๋ณด๋ ๊ฐ์ง๋ง ์ฝํ ์คํธ๊ฐ ๋ ํ๋ถํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์คํ ์ ์ ์ ์๋ ์ฌ๋ถ๋ถํฐ ํ๋จํด์ผํ๋ฏ๋ก, ์ถ์ ๊ณผ ๋ฉํธ๋ฆญ์ ์ญํ ์ด ๊ฒน์น ๋๋ ๋ฉํธ๋ฆญ์ผ๋ก ์์ํ๋ค.
- TraceID๋ฅผ ํฌํจํ๋ ๋ก๊ทธํ์ผ์ ๊ฒ์ํ๊ณ ๋ก๊ทธ ํ์ผ์ ์๋ ์์ธ ์ ๋ณด๋ฅผ ํ์ธํ ํ ๋๋ฒ๊น ์ ์์ํ๋ค. ์๊ด๊ด๊ณ์ ๋ฐ๋ผ ์ถ์ ๋ก๊ทธ ๋ฉํธ๋ฆญ์ ์ ํํ๋ฉด์ ๋ค์ํ ์ธก๋ฉด์์ ๋ด๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ด์ฐฐํ๋ค.
2.3.2 ๊ด์ธก๊ฐ๋ฅ์ฑ ์ฅ์ ํ๋ก์ธ์ค
[ ์ฅ์ ๋ฐ์ ] → [ ์๋ ์ ์ก ] → [ ์ถ์ ๋ถ์ ] → [ ๋ก๊ทธ๋ถ์ ]
- ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ด ์ฌ ์ ์๋๋ก ํด์ผํ๋ค. ์๋์ ๋ฐ์ผ๋ฉด ๋ฉํธ๋ฆญ/์ถ์ /๋ก๊ทธ๋ฅผ ํ์ฉํด์ ๋ฌธ์ ์ ์์ธ์ ๋น ๋ฅด๊ฒ ํ์ธํด์ผ ํ๋ค.
- ์์ธํ๋ถ์์๋ ๋ก๊ทธ๋ฅผ ํ์ฉํ ์ ์๋ค. ๊ตฌ์ฒด์ ์ธ ์๋ฌ๋ฒ ์ธ์ง, ์ ์ถ๋ ฅ๋ฉ์ธ์ง๋ฑ์ ์ ๋ณด๋ฅผ ํ์ธํ๊ณ ๋๋ฒ๊น ์ ํ์ฉํ๋ค.
- ์ถ์ ์ผ๋ก๋ ์ง์ฐ์๊ฐ, ์์คํ ๋ณ ์ฒ๋ฆฌ์๊ฐ๋ฑ์ ๋ถ์ํด์ ์ฅ์ ๊ฐ ๋ฐ์ํ ์์คํ ์ ์๋ณํ ์ ์๋ค.
- ์ถ์ ๊ณผ ๋ก๊ทธ์ ์ถ๋ ฅ๋์ง ์๋, ๋ณด๋ค ์์ธํ ์์คํ ์์ค์ ๋๋ฒ๊น ์ ํ๋กํ์ผ์ ์ฌ์ฉํ๋ค.
2.4 ์ํ์ค๋ฉ
์ํ ์ค๋ฉ(Horizontal Sharding)์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์๋ฒ์ ๋ถ์ฐ์์ผ ์ ์ฅํ๋ ๋ฐฉ์์ ๋งํ๋ค.
๊ทธ๋ผํ๋ํจ๋ฐ๋ฆฌ ๋ฟ ๋ง ์๋๋ผ Kafka, Redis, Cassandra ๋ฑ ๋ง์ ์์คํ
์์ ์ ์ฌํ ๊ฐ๋
์ผ๋ก ์ค๋ฉ์ ๊ตฌํํ๋ค.
- ์ค๋ฉ์ ํน์ง
- ๋ถํ๋ถ์ฐ: ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์๋ฒ์ ๋ถ์ฐ์์ผ ๊ฐ ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ฌ ์์คํ ์ ์ฒด์ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
- ํ์ฅ์ฑ: ์์คํ ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๊ตฌ๊ฐ ์ฆ๊ฐํ๋๋ผ๋, ์ถ๊ฐ ์๋ฒ๋ฅผ ๋์ ํ์ฌ ์ค๋ฉ์ ํ์ฅํจ์ผ๋ก์จ ์ฉ์ดํ๊ฒ ๋์ํ ์ ์๋ค.
- ๊ณ ๊ฐ์ฉ์ฑ: ๋จ์ผ ์ฅ์ ์ง์ (Single Point of Failure, SPOF)์ ์ค์ด๋ฉฐ, ํน์ ์๋ฒ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ ์์คํ ์ ์ฒด์ ๊ฐ์ฉ์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
- ์ํ์ค๋ฉ ๊ตฌํ ๊ณ ๋ ค์ฌํญ
- ์ค๋ฉ ํค ์ ํ: ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๋ถํ ํ ์ง ๊ฒฐ์ ํ๋ ์ค๋ฉ ํค(Sharding Key)๋ฅผ ์ ์คํ๊ฒ ์ ํํด์ผ ํ๋ค. (๋ฐ์ดํฐ ๋ถ์ฐ ๊ท ํ/ ๊ฒ์ ์ฑ๋ฅ)
- ๋ฐ์ดํฐ ๋ถ์ฐ: ๋ฐ์ดํฐ ๋ถ์ฐ ๋ฐฉ์์ ๊ฒฐ์ ํด์ผํ๋ค. (๋ฐ์ดํฐ๊ฐ ์๋ฒ ๊ฐ์ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ๋์ด์ผ ์ฑ๋ฅ ์ด์ ์ ์ต๋ํ ํ ์ ์๋ค.)
- ์กฐ์ธ๊ณผ ํธ๋์ญ์ ์ฒ๋ฆฌ: ์ํ ์ค๋ฉ ํ๊ฒฝ์์๋ ๋ค๋ฅธ ์๋ฒ์ ๋ถ์ฐ๋ ๋ฐ์ดํฐ ๊ฐ์ ์กฐ์ธ์ด๋ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ๋ณต์กํด์ง ์ ์๋ค.
- ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ: ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ์๋ฒ์ ๋ถ์ฐ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ์ํ์ค๋ฉ์ ๋ฌธ์ ์
-
- ๋ฐ์ดํฐ์ ์ฌ๋ถ๋ฐฐ
- ์ค๋๊ฐ ๋ฐ์ดํฐ์ ์ฌ๋ถ๋ฐฐ๊ฐ ์ด๋ฃจ์ด์ง๋(๋ฆฌ๋ฒจ๋ฐ์ฑ) ์ฑ๋ฅ์ด ์์ฒญ๋๊ฒ ๋ฎ์์ง ์ ์๋ค.
- ๋ฐ์ดํฐ์ ์ฌ๋ถ๋ฐฐ๊ฐ ํ์ํ ๋๋?
- ํ๋์ ์ค๋๋ก๋ ๋์ด์ ๊ฐ๋นํ๊ธฐ ์ด๋ ค์ธ๋, ์ค๋๊ฐ ๋ฐ์ดํฐ ๋ถํฌ๊ฐ ๋ถ๊ท ๋ฑํ์ฌ ์ค๋์์ง(Shard Exhaustion)์ด ๋ฐ์ํ ์ ์์ด ์ค๋ ํค๋ฅผ ๊ณ์ฐํ๋ ํจ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐฐ์นํด์ผํ๋ค.
- ๋ ธ๋ ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค (๋ ธ๋์ ์ถ๊ฐ/์ญ์ ) ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐฐ์น ํด์ผํ๋ค.
- ์ ๋ช
์ธ์ฌ ๋ฌธ์
- "์ ๋ช ์ธ์ฌ ๋ฌธ์ " ๋๋ "ํซ ์คํ" ๋ฌธ์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ๋ถ์ฐ ์์คํ ์์ ํน์ ๋ฐ์ดํฐ์ ๋ํ ์์ฒญ์ด ์ง์ค๋์ด ๊ณผ๋ํ ํธ๋ํฝ์ด ๋ฐ์ํ๋ ํ์์ ๋งํ๋ค.
- ์๋ฅผ ๋ค์ด, ์๋ฆฌ ๋ ์ํผ๋ฅผ ์ ๊ณตํ๋ ์จ๋ผ์ธ ์๋น์ค๊ฐ ์์ผ๋ฉฐ, ์ด ์๋น์ค๋ ์ฌ๋ฃ ์ด๋ฆ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ค๋์ ๋ถ๋ฅํ์ฌ ์ ์ฅํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ค๋ฉ ํค๋ก๋ ์ฌ๋ฃ์ ์ํ๋ฒณ ์ฒซ ๊ธ์๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ "Apple pie"์ "Avocado salad"๊ฐ ์ ๋ช ํ ๋ฐฉ์ก์ ์๊ฐ๋๋ฉด์ ๋ ๋ ์ํผ์ ๋ํ ๊ฒ์ ์์ฒญ์ด ๊ธ์ฆํ๋ค. 'A' ์ค๋์ ํด๋นํ๋ ์ฌ๋ฃ๋ฅผ ์ฌ์ฉํ๋ ๋ ์ํผ ๋ฐ์ดํฐ์ ๋ํ ๊ฒ์ ์์ฒญ์ด ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๋ฉฐ, ํด๋น ์ค๋๊ฐ ์ฒ๋ฆฌํด์ผ ํ ํธ๋ํฝ ์์ด ๊ธ๊ฒฉํ ๋์ด๋๊ฒ ๋๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก, 'A' ์ค๋์ ๊ณผ๋ถํ๊ฐ ์ ์ฒด ์๋น์ค์ ์๋ต ์๊ฐ ์ฆ๊ฐ, ์ฌ์ฉ์ ๊ฒฝํ ์ ํ ๋ฑ์ผ๋ก ์ด์ด์ง ์ ์๋ค.
- ์ ๋ช ์ธ์ฌ ๋ฌธ์ ๋ ์์ ์์์ ๊ฐ์ด ๋ฐ์ดํฐ ์ค๋ฉ ์ ๋ต์์ ํน์ ํค(์ฌ๊ธฐ์๋ ์ํ๋ฒณ)์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ ๋, ์ผ๋ถ ํค์ ํด๋นํ๋ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ ๋น๋๊ฐ ์์๋ณด๋ค ํจ์ฌ ๋์ ๊ฒฝ์ฐ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์กฐ์ธ๊ณผ ๋น์ ๊ทํ
- ์ฌ๋ฌ ์ค๋ ์๋ฒ๋ฅผ ์ชผ๊ฐ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ชผ๊ฐ์ด ์ ์ฅํ๋ฉด, ์ฌ๋ฌ ์ค๋์ ๊ฑธ์น ๋ฐ์ดํฐ๋ฅผ ์กฐ์ธํ๊ธฐ๊ฐ ํ๋ค์ด์ง๋ค. ํนํ RDB์๋ ํนํ ๋์ ๊ณผ์ ๊ฐ ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋น์ ๊ทํ ํ์ฌ ์กฐ์ธ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค. (ํ๋์ ํ ์ด๋ธ์์ ์ง์๊ฐ ์ํ๋ ์ ์๋๋ก)
- ์ ๊ทํ(Normalization)๊ฐ ๋ฐ์ดํฐ์ ์ค๋ณต์ ์ต์ํํ๊ณ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ํ ์ด๋ธ๋ก ๋ถํ ํ๋ ๊ณผ์ ์ด๋ผ๋ฉด, ๋น์ ๊ทํ๋ ์ด๋ฌํ ๋ถํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ํตํฉํ๊ฑฐ๋ ์ค๋ณต์ ํ์ฉํ๋ ๊ฒ์ด๋ค.
- ๋ฐ์ดํฐ์ ์ฌ๋ถ๋ฐฐ
-
2.5 ๋ง์ดํฌ๋ก์๋น์ค
๊ฒฌ๊ณ ํ๊ณ ์์ ์ ์ธ ๋ถ์ฐ์์คํ
์ ๊ตฌ์ฑํ๊ธฐ ์ํด์๋ ์ฟผ๋ผ(Quorum), ๊ฐ์ญ(Gossip), ํด์ฑ, ์ค๋ฉ๋ฑ์ด ํ์ํ๋ค.
์ด์๊ฐ์ ๊ธฐ๋ฒ๋ค์ด ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ด๋ป๊ฒ ๊ตฌํ๋์ด์๋์ง ์ด ์ฑ
์์๋ ์์ฃผ ์์ธํ๊ฒ ์ค๋ช
ํ๊ณ ์๋ค.
์ด ์ฑ
์์ ๋งํ๋ ๊ด์ธก๊ฐ๋ฅ์ฑ์ ๊ตฌํ์ฒด๋ก Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋ฅผ ์ด์ผ๊ธฐํ๋ฉฐ, ์๋ ์ค๋ช
์ Grafana ํจ๋ฐ๋ฆฌ๊ฐ ๊ทธ ๋์์ด๋ค.
- ๋ฉํธ๋ฆญ ๊ธฐ์ค์ผ๋ก AutoScaling์ ๊ตฌํํ๋๊ฒ ๋ฟ๋ง ์๋๋ผ, ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ๋ฆฌ์์ค์ ์์ ์ ์ผ๋ก ํธ๋ํฝ์ ๋ถ๋ฐฐํ๊ณ , ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ๋ชจ๋ํฐ๋ง ํ๋๊ฒ๋ ๋งค์ฐ ์ค์ํ๋ค.
- ๊ทธ๋ผํ๋ ํจ๋ฐ๋ฆฌ(Loki,Grafana,Tempo,Mimir)๋ ๋ง์ดํฌ๋ก์๋น์ค, ์ค๋ฉ, ํด์ฑ์ ์์ฃผ ์ ๊ตฌํํ๋ค.
2.5.1. ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ๋ฐ ํ๋ฆ
[ ๋ฐ์ด๋๋ฆฌ ] → [ ๋์ปค์ด๋ฏธ์ง ] → [ K8s Pod ]
- ์คํ๋ง๋ถํธ, Go๋ก ๊ฐ๋ฐ๋ ์์ค๋ฅผ Makefile๋ก ๋น๋ํด์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ฑํ๋ค. ์ด์ํ๊ฒฝ์์๋ ๋ฐ์ด๋๋ฆฌ๋ก ์คํ๋ ์๋ ์๊ณ ๋์ปค ์ปจํ
์ด๋, ์ฟ ๋ฒ๋คํฐ์ค ํ๋ ๋ฑ ๋ค์ํ *๋ฐํ์ํ๊ฒฝ์ ๋น ๋ฅด๊ฒ ๋ฐฐํฌ๋๊ณ ์ด์๋ ์์๋ค.
* ๋ฐํ์: ์คํํ๊ฒฝ, ๋จ์ํ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ์๊ฐ์ ๋์ด ์คํ ํ๊ฒฝ์ ํน์ฑ๊ณผ ๊ทธ ํ๊ฒฝ์์ ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ๋์ํ๊ณ ๊ด๋ฆฌ๋๋์ง๊น์ง ํฌํจํ๋ ํฌ๊ด์ ์ธ ๊ฐ๋ - ๋์ปคํ์ผ๋ฑ์ ์ฌ์ฉํ์ฌ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ค.
- ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฐธ์กฐํด์ Helm์ฐจํธ๋ฅผ ๋ง๋ค๊ณ , ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฐฐํฌํ๋ค.
- Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ฟ๋ง ์๋๋ผ Docker, K8s๋ฑ ์ฌ๋ฌ ๋ฐํ์์ ์ด์๋ ์ ์๋๋ก ๋ค์ํ ํํ๋ก ์ ๊ณต๋๋ค.
- ์ด ์ฑ
์์๋ Grafana ํจ๋ฐ๋ฆฌ๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฐฐํฌํ๋ค. ์ฟ ๋ฒ๋คํฐ์ค์ ๋ฐฐํฌํจ์ผ๋ก์จ Istio Sidecar, Telemetry API ๊ณ์ธก, AutoScaling ๋ฑ์ด ์ ์ฐํ๊ณ ์ฝ๊ฒ ํตํฉ๋๋ค.
2.5.2 ๊ด์ธก๊ฐ๋ฅ์ฑ์ ๋ง์ดํฌ๋ก์๋น์ค
Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋ ๋ง์ดํฌ๋ก์๋น์ค ํํ๋ก ๊ฐ๋ฐ๋์ด ์ฟ ๋ฒ๋คํฐ์ค์ ์ด์๋๋ค.
๋ชจ๋ํ๋ ๊ฐ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๊ตฌ์ฑ๋์๊ณ , ์ธ๋ถํต์ ์ REST, ๋ด๋ถํต์ ์ gRPC๋ฅผ ์ฌ์ฉํ๋ค.
์ฑ ์์๋ Mimir๋ฅผ ์์๋ก ๋ค์ง๋ง, Mimir๋ณด๋ค๋ Loki๊ฐ ์กฐ๊ธ ๋ ๋์๊ฒ ํธํจ์ผ๋ก Loki๋ก ์ค๋ช ์ ๋์ฒดํ๋ค.
- Loki๋?
Loki๋ ์ฌ๋ฌ clients์์ ๋ก๊ทธ๋ฅผ ์์งํ๊ณ , ๋ฐฑ์๋ ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ , ์ ์ฅ๋ ๋ก๊ทธ๋ฅผ ๊ฒ์ํ ์ ์๋ ๋ก๊ทธ ์ง๊ณ์์คํ ์ด๋ค.- ์์ง: ์ฌ๋ฌ ํด๋ผ์ด์ธํธ (e.g. promtail, fluentbit…)์์ ๋ณด๋ด์ฃผ๋ ๋ก๊ทธ๋ฅผ ์์งํ๋ค.
- ์ ์ฅ: ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๋ก๊ทธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ฐ ์ผ์ ์ฃผ๊ธฐ๋ก ์๊ตฌ์คํ ๋ฆฌ์ง(e.g. s3, minio…)๋ก ๋ณด๋ธ๋ค.
- ์ฟผ๋ฆฌ: ์ ์ฅ๋ ๋ก๊ทธ๋ LogQL ๋ก ์ฟผ๋ฆฌํ ์ ์์ผ๋ฉฐ, Grafana์ ๋ฐ๋ก ํตํฉ๋๋ค.
- ๋ชจ๋ํ๋ ์ปดํฌ๋ํธ
- ๊ฐ ์ปดํฌ๋ํธ๋ ๊ฐ์์ ์ญํ ์ ์ํํ๋ฉฐ, ํจ๊ป ๋์ํ๋ฉฐ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์ง/์ ์ฅ/์กฐํํ๋ ์ ์ฒด ์์คํ ์ ๊ตฌ์ฑํ๋ค.
- Distributer
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์, Ingester๋ฅผ ์ ํํ๊ณ , Ingesterd์๊ฒ ๋ก๊ทธ๋ฅผ ์ ๋ฌํ๋ค.
- ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ํด์ฑํ์ฌ ํด๋น ๋ฐ์ดํฐ๊ฐ ์ด๋ค Ingester๋ก ์ ์ก๋ ์ง ๊ฒฐ์ ํ๊ณ , ์ด ๊ณผ์ ์ ๋ก๋๋ฒจ๋ฐ์ฑ ์ญํ ๋ก ๋ฐ์ดํฐ๊ฐ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ๋๋๋ก ํ๋ค.
- ๋ ์ด๋ธ์ด ์ฌ๋ฐ๋ฅธ์ง, ์ ์ก๋ฅ ์ ํ์ ๊ฑธ๋ฆฌ์ง๋ ์๋์ง ๋ฑ ๋ค์ด์ค๋ ๋ก๊ทธ๊ฐ ์ฌ์์ ๋ง๋์ง ํ์ธํ๋ค.
- ๋ ์ด๋ธ์ ์ ๊ทํ ํ๋ค. e.g. {foo="bar", bazz="buzz"}๋ฅผ {bazz="buzz", foo="bar"}์ ๋๋ฑํ๊ฒ ๋ง๋ ๋ค.
- Ingester
- Ingester๋ Distributor๋ก๋ถํฐ ๋ฐ์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์์๋ก ์ ์ฅํ๊ณ , ์ผ์ ์๊ฐ์ด๋ ํฌ๊ธฐ์ ๋๋ฌํ๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ Chunk๋ก ๋ง๋ค์ด ์ฅ๊ธฐ ์ ์ฅ์๋ก ํ๋ฌ์(flush)ํ๋ค.
- ๋ฐ์ดํฐ๊ฐ ์ฅ๊ธฐ ์ ์ฅ์๋ก ์ฎ๊ฒจ์ง๊ธฐ ์ ๊น์ง Ingester์์ ์์๋ก ๊ด๋ฆฌ๋๋ฏ๋ก, ๊ณ ์์ ๋ฐ์ดํฐ ์ฐ๊ธฐ์ ์ง์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ค.
- ์์ง๋ ๋ก๊ทธ๊ฐ ์์์ ๋ง๋์ง ํ์ธํ๋ค. (Write ahead log ์ค์ ์ ๋ฐ๋ผ ๋์์ด ๋ฌ๋ผ์ง๋ค)
- Ruler
- Ruler ์ปดํฌ๋ํธ๋ ๋ก๊ทธ ๋ฐ์ดํฐ์ ๋ํ ๊ฒฝ๊ณ ๊ท์น(alerting rules)์ ํ๊ฐํ๊ณ , ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํค๋ ์ญํ ์ ํ๋ค.
- ๋ก๊ทธ ํจํด์ด๋ ํน์ ์กฐ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฝ๊ณ ๋ฅผ ์ค์ ํ ์ ์๋ค.
- Querier
- ์ค์ ์ฟผ๋ฆฌ๋ฅผ ํ๋ ์ปดํฌ๋ํธ์ด๋ค. ์ ์ฅ๋ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
- Ingester ์ธ๋ฉ๋ชจ๋ฆฌ ์ฟผ๋ฆฌ์ ์๊ตฌ์ ์ฅ์์ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ์ฌ ๋ฐํํ๋ค.
- Query frontend
- ์ต์ ์ด๋ค. ์์ด๋ ๋๊ณ ์์ด๋ ๋๋ค. ํ์ง๋ง ์ฌ์ฉํ๋๊ฒ์ ๊ถ์ฅํ๋๊ฒ ๊ฐ๋ค.
- ์ฟผ๋ฆฌ Queue์ Caching์ ๋ด๋นํ๋ค. Querier์ ๋ถํ๋ฅผ ์ค์ด๊ณ , ์ฌ์ฉ์์๊ฒ ๋ ๋น ๋ฅธ ์ง์ ์๋ต ์๊ฐ์ ์ ๊ณตํ๋ค.
- ํฐ ์ฟผ๋ฆฌ๊ฐ ์์๋ OOM์ ๋ฐฉ์งํ๋๋ก ์์ ์ฟผ๋ฆฌ๋ก ๋๋์ด Querier์๊ฒ ์ ๋ฌํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ฐ๊ฒฐํ๋ค.
- Chunk Store / Index Store
- ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ "Chunk" ํํ๋ก ์ ์ฅํ๋ฉฐ, ์ด ๋ฐ์ดํฐ๋ Chunk Store์ ์ ์ฅํ๋ค. ๋ํ, ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์กฐํํ ์ ์๋๋ก ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ Index Store์ ์ ์ฅํ๋ค.
- Amazon S3, Google Cloud Storage, Microsoft Azure Storage์ ๊ฐ์ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๋๋ ๋ก์ปฌ ํ์ผ ์์คํ ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ธ๋ถํต์ ์ REST, ๋ด๋ถํต์ ์ gRPC
- Loki ์ํคํ ์ฒ์์ ์ด๋ฌํ ํต์ ๋ฐฉ์์ ์กฐํฉํ์ฌ ์ธ๋ถ ์ฌ์ฉ์์์ ์ํธ์์ฉ์ ์ํ ํธ๋ฆฌํจ๊ณผ ๋ด๋ถ ์๋น์ค ๊ฐ์ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ํต์ ์ ํ์์ฑ์ ๋ชจ๋ ์ถฉ์กฑํ๋ค.
- ์ธ๋ถ ํต์ : ํด๋ผ์ด์ธํธ์์ ์ํธ์์ฉ์์ REST API๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ฉฐ, HTTP/HTTPS ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์น ์๋น์ค์์ ํตํฉ์ด ์ฉ์ดํ๋ค. ์ฌ์ฉ์๊ฐ ์์คํ ๊ณผ ์ํธ์์ฉํ ๋, ์๋ฅผ ๋ค์ด ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์ค์ ์ ๋ณ๊ฒฝํ๋ ๋ฑ์ ์์ ์ REST API๋ฅผ ํตํด ์ํํ ์ ์๋ค.
- ๋ด๋ถ ํต์ : Loki์ ๋ด๋ถ ์๋น์ค ๊ฐ ํต์ ์๋ gRPC๊ฐ ์ฌ์ฉ๋๋ค. (gRPC๋ ๊ณ ์ฑ๋ฅ, ํ์ฅ ๊ฐ๋ฅํ API ๊ฐ๋ฐ์ ์ํด ๊ตฌ๊ธ์ ์ํด ๊ฐ๋ฐ๋ ์คํ ์์ค RPC ํ๋ ์์ํฌ) gRPC๋ ํ๋กํ ์ฝ ๋ฒํผ(Protocol Buffers)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๋ฏ๋ก, ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ์ก์ด ๊ฐ๋ฅํ๋ฉฐ, ๋คํธ์ํฌ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ ์ ์๋ค. ์ด๋ Loki์ ๋ถ์ฐ๋ ๊ตฌ์ฑ ์์ ๊ฐ์ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค
Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋ ๊ทธ ์์ฒด๋ก ์ฐ์ํ ๋ง์ดํฌ๋ก ์๋น์ค ๊ตฌํ์ฒด๋ค.
2.5.3 ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ
๋ฐ์ดํฐ ์ ์ฅ์๋ก๋ถํฐ ์ฝ๊ธฐ์ ์ฐ๊ธฐ๋ฅผ ๋ถ๋ฆฌํ๋ ํจํด์ CQRS(Command and Query Responsibility Segregation)๋ผ ํ๋ค.
์์ ์ค๋ช ํ Loki๋ฟ๋ง ์๋๋ผ ๋์ค์ ์ผ๋ก ์ฐ์ด๋ ๋ง์ ์์คํ ์์ ์ด๋ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ด๋ฐ CQRS ํจํด์ ์ฌ๋ฌ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋ค.
- CQRS ํจํด์ ์ด์
- ๋ ๋ฆฝ์ ์ธ ํฌ๊ธฐ ์กฐ์ : ์์คํ ์ ๋ถํ๊ฐ ๋ช ๋ น ์ฒ๋ฆฌ ๋๋ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ ์ค ์ด๋ ํ ์ชฝ์ ์น์ฐ์ณ ์์ ๋ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์๋ค.
- ์ต์ ํ๋ ๋ฐ์ดํฐ ์คํค๋ง: ์ฟผ๋ฆฌ ๋ชจ๋ธ์ ์ฝ๊ธฐ ์ฐ์ฐ์ ์ต์ ํํ๊ธฐ ์ํด ์ค๊ณ๋๋ฉฐ, ๋ช ๋ น ๋ชจ๋ธ์ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ๋ณ๊ฒฝ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ต์ ํํ๋ค. ์ด๋ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณผ ์กฐํ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
- ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ: ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ, ์ต์ ํ, ์ ์ง๋ณด์๋ ์ ์์ผ๋ฉฐ ์์คํ ์ ๋ณต์ก์ฑ์ ๋ฎ์ถฐ ๊ฐ๋ฐํ์ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
- ๋ณด์๊ฐํ: ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ ์๊ฒฉํ ํต์ ํ๊ณ , ํ์ํ ์ ๋ณด๋ง์ ์ ๊ณตํ ์ ์๋ค.
- ๋จ์ํ ์ฟผ๋ฆฌ: ์ฟผ๋ฆฌ ๋ชจ๋ธ์ ์ฝ๊ธฐ ์ฐ์ฐ์ ํนํ๋์ด ์ค๊ณ๋๋ฏ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ํจ์ฌ ๋จ์ํด์ง๋ค.
- CQRS ํจํด์ ๋จ์ (์ฅ์ ๋ง ๋งํ๊ธธ๋ ๋จ์ ๋ ์ถ๊ฐ ๐)
- ๋ณต์ก์ฑ ์ฆ๊ฐ: CQRS๋ ์์คํ ์ ๋ ๊ฐ์ ๋ณ๋ ๋ถ๋ถ(๋ช ๋ น ์ฒ๋ฆฌ์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ)์ผ๋ก ๋ถ๋ฆฌํ๋ฏ๋ก,์ ์ฒด ์ํคํ ์ณ๊ฐ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ ์ ์๋ค.
- ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ ์ ์ง ์ด๋ ค์: ๋ช ๋ น๋ชจ๋ธ๊ณผ ์ฟผ๋ฆฌ๋ชจ๋ธ์ด ๋ถ๋ฆฌ๋์ด์์๋ ๋ ๋ชจ๋ธ๊ฐ์ ๋ฐ์ดํฐ ์ผ๊ด์ ์ ์ ์งํ๊ธฐ ์ด๋ ต๋ค. ํนํ ์ด๋ฒคํธ์์ฑ(Event Sourcing)๊ณผ ํจ๊ป ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ๋๊ธฐํ์ ์ผ๊ด์ฑ ์ ์ง์ ๋ ๋ง์ ์ฃผ์๊ฐ ํ์ํ๋ค.
- ๊ฐ๋ฐ ๋ฐ ์ด์๋น์ฉ ์ฆ๊ฐ/ํ์ต๊ณก์ /์ค๋ฒ์์ง๋์ด๋ง์ ์ํ: ์์คํ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ, ๊ฐ๋ฐ ์ด๊ธฐ๋จ๊ณ์์ ๋ณด๋ค ๋ง์ ์ค๊ณ์ ๊ณํ์ด ์๊ตฌ๋๋ค. ๋ถ๋ฆฌ๋ ์ํคํ ์ณ๋ฅผ ์ด์ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ๋ฆฌ์์ค ๋น์ฉ์ด ๋ฐ์ํ ์ ์๋ค.
Q. ์ด๋ฒคํธ์์ฑ์ด ๋ญ๊ฐ? ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋ ๋ฐ์ดํฐ ๋๊ธฐํ์ ์ผ๊ด์ฑ ์ ์ง์ ์ด๋ ค์์ด ๋ฐ์ํ ๊น? (์๋๋๋ณด๊ธฐ)
[๊ธฐ๋ณธ๊ฐ๋ ์ ๋ฆฌ]
- ์ด๋ฒคํธ ์์ฑ(Event Sourcing): ์์คํ
์์ ๋ฐ์ํ๋ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ(์ด๋ฒคํธ)์ ์์ฐจ์ ์ผ๋ก ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
์๋ฅผ ๋ค์ด, ์ํ ๊ณ์ข์์ ๋์ ์ ๊ธํ๊ฑฐ๋ ์ถ๊ธํ๋ ๊ฐ๊ฐ์ ํ๋์ด ์ด๋ฒคํธ๊ฐ ๋์ด ๊ธฐ๋ก๋๊ฒ ๋๋ค. - CQRS(Command Query Responsibility Segregation): ์์คํ
์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ ํจํด์ด๋ค.
ํ๋๋ ๋ช ๋ น(๋ฐ์ดํฐ ๋ณ๊ฒฝ)์ ์ฒ๋ฆฌํ๊ณ , ๋ค๋ฅธ ํ๋๋ ์ฟผ๋ฆฌ(๋ฐ์ดํฐ ์กฐํ)๋ฅผ ์ฒ๋ฆฌํ๋ค.
[์ด๋ฒคํธ ์์ฑ(Event Sourcing)์ ์์]
์๋ฅผ ๋ค์ด, ์ํ ๊ณ์ข ์์คํ ์ ์ด๋ฒคํธ ์์ฑ์ผ๋ก ๊ตฌํํ๋ค๊ณ ๊ฐ์ ํ๋ค.
- ๊ณ์ข ์์ฑ ์ด๋ฒคํธ: ์ฌ์ฉ์๊ฐ ์๋ก์ด ๊ณ์ข๋ฅผ ์์ฑํ๋ฉด "๊ณ์ข ์์ฑ" ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ ์ด๋ฒคํธ ์คํ ์ด์ ์ ์ฅ
- ๊ธ์ก ์
๊ธ ์ด๋ฒคํธ: ์ฌ์ฉ์๊ฐ ๊ณ์ข์ ๊ธ์ก์ ์
๊ธํ๋ฉด "๊ธ์ก ์
๊ธ" ์ด๋ฒคํธ๊ฐ ์์ฑ๋์ด ์ด๋ฒคํธ ์คํ ์ด์ ์์ฐจ์ ์ผ๋ก ์ถ๊ฐ
- ๊ธ์ก ์ถ๊ธ ์ด๋ฒคํธ: ์ฌ์ฉ์๊ฐ ๊ณ์ข์์ ๊ธ์ก์ ์ถ๊ธํ๋ฉด "๊ธ์ก ์ถ๊ธ" ์ด๋ฒคํธ๊ฐ ์์ฑ๋์ด ์ ์ฅ
์ด๋ฒคํธ ์คํ ์ด์๋ ๊ณ์ข์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ด๋ฒคํธ์ ํํ๋ก ์ ์ฅ๋๋ฉฐ, ์ด๋ฅผ ํตํด ํ์ฌ ๊ณ์ข์ ์ํ(์์ก ๋ฑ)๋ฅผ ์ธ์ ๋ ์ง ์ฌ๊ตฌ์ฑํ ์ ์๋ค. ๋ํ, ์ด ์์คํ ์ ๊ณผ๊ฑฐ์ ํน์ ์์ ์ผ๋ก ๊ณ์ข์ ์ํ๋ฅผ ๋๋์๋ณผ ์ ์์ผ๋ฉฐ, ์์คํ ์ ๋ณ๊ฒฝ์ฌํญ์ ๋ํ ์๋ฒฝํ ๊ฐ์ฌ ๋ก๊ทธ(audit log)๋ฅผ ์ ๊ณตํ๋ค.
์ด๋ ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS(Command Query Responsibility Segregation) ํจํด์ ํจ๊ป ์ฌ์ฉํ ๋, ๋ฐ์ดํฐ ๋๊ธฐํ์ ์ผ๊ด์ฑ ์ ์ง์ ์ด๋ ค์์ ๋ช ๋ น ๋ชจ๋ธ๊ณผ ์ฟผ๋ฆฌ ๋ชจ๋ธ ๊ฐ์ ๋๊ธฐํ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ค.
- ๋น๋๊ธฐ์ฑ: ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ ์ ์ฅ๋๋ ๊ณผ์ (๋ช
๋ น ์ฒ๋ฆฌ)๊ณผ ์ด ์ด๋ฒคํธ๋ฅผ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ณผ์ (์ฟผ๋ฆฌ ์ฒ๋ฆฌ)์ ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ์ฆ, ์ด๋ฒคํธ๊ฐ ์ ์ฅ๋๊ณ ๋์ ์ฆ์ ์ฟผ๋ฆฌ ๋ชจ๋ธ์ด ์
๋ฐ์ดํธ๋์ง ์์ ์ ์๋ค.
์ด๋ก ์ธํด ์ฌ์ฉ์๊ฐ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ค ํ ๋, ์์ง ์ฟผ๋ฆฌ ๋ชจ๋ธ์ด ์ต์ ์ํ๋ก ์ ๋ฐ์ดํธ๋์ง ์์ ์ค๋๋ ์ ๋ณด๋ฅผ ๋ณด๊ฒ ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. - ์ด๋ฒคํธ ์ฒ๋ฆฌ ์์: ์ฌ๋ฌ ์ด๋ฒคํธ๊ฐ ๊ฑฐ์ ๋์์ ๋ฐ์ํ๋ฉด, ์ด ์ด๋ฒคํธ๋ค์ด ์ฒ๋ฆฌ๋๋ ์์๊ฐ ์ค์ํ๋ค.
์๋ฅผ ๋ค์ด, ๊ณ์ข์ ๋์ ์ ๊ธํ ํ์ ์ถ๊ธํ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ์ด ๋ ์ด๋ฒคํธ๊ฐ ์ ํํ ์์๋๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค. ๋ง์ฝ ์์๊ฐ ๋ค๋ฐ๋๋ฉด, ์ฟผ๋ฆฌ ๋ชจ๋ธ์ด ์๋ชป๋ ์ํ๋ฅผ ๋ฐ์ํ๊ฒ ๋๋ค. - ๋๊ธฐํ ๊ณผ์ : ๋ช ๋ น ๋ชจ๋ธ์์ ์ฒ๋ฆฌํ ์ด๋ฒคํธ๋ฅผ ๋ฐํ์ผ๋ก ์ฟผ๋ฆฌ ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํ๋ ๊ณผ์ ์์ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฒคํธ ์ฒ๋ฆฌ ์์คํ ์ด ๋ฐ์๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ์ฟผ๋ฆฌ ๋ชจ๋ธ์ด ์ต์ ์ํ๋ฅผ ๋ฐ์ํ๋ ๋ฐ ์ง์ฐ์ด ์๊ธธ ์ ์๋ค.
๋ค์ ์ ๋ฆฌํด์ ์ฝ๊ฒ ์ด์ผ๊ธฐ ํ์๋ฉด,
์ฟ ํก์์ ์ฌ๊ณผ๋ฅผ ๊ตฌ๋งคํ๋๊ฒ์ ๊ฐ์ ํ๋ค.
์ฌ๊ณผ๋ฅผ ์ฐ๋ค๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ธฐ๋ก(์ด๋ฒคํธ ์์ฑ)ํ๊ณ , ์ฟ ํก์ ์ฌ๊ณ ๋ฅผ ๊ฐ์์ํค๋ ์์
(๋ช
๋ น ์ฒ๋ฆฌ)๊ณผ ์ฌ๊ณ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์
(์ฟผ๋ฆฌ ์ฒ๋ฆฌ)์ด ์๋ค. ์ฌ๊ณผ๋ฅผ ์ฌ๊ณ ์ฌ๊ณ ๊ฐ ๊ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋กํ์ง๋ง, ์ฌ๊ณ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ฉด์ด ์์ง ๊ทธ ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ํ์ง ์์๋ค๋ฉด, ๋๋ ์ฌ์ ํ ์ค๋๋ ์ฌ๊ณ ์ ๋ณด๋ฅผ ๋ณด๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๋๊ธฐํ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์ด๋ ต๊ฒ ๋๋ค.
์ฆ, CQRS ํจํด์ด ์๋ ๋จ์ผ๋ชจ๋ธ์ ๊ทผ ๋ฐฉ์์ด๋ผ๋ฉด ์ฐ๊ธฐ์ ์ฝ๊ธฐ๊ฐ ๋์ผํ ๋ชจ๋ธ์ ์ฌ์ฉํ๋๊น ์ด๋ฐ ์ด์๊ฐ ์๋์ค๊ฒ ๋๋ค.
2.6 ์ผ๊ด๋ ํด์
์์์ ์์๋ดค๋ ์ค๋ฉ(Sharding)๊ณผ ํจ๊ป ํด์ฑ(Hashing)์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ถ์ฐ ์ฒ๋ฆฌํ๊ณ , ์์คํ ์ ํ์ฅ์ฑ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, ์ํธ ๋ณด์์ ์ธ ๊ด๊ณ์ ์๋ค.
- ํด์ฑ์ ์ญํ
- ํด์ฑ์ ํค๊ฐ์ ํด์ ํจ์๋ผ๋ ์์์ ๋์ ํ์ฌ ๊ณ์ฐํ ํ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ์๋ก ์ฌ์ฉํ์ฌ ๋ฐ๋ก ๊ฐ์ ์ ๊ทผ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋ฐ์ดํฐ ๋ถ์ฐ: ํด์ฑ ํจ์๋ ์ ๋ ฅ๊ฐ(์: ํค ๊ฐ)์ ๋ฐ์ ๊ณ ์ ๋ ํฌ๊ธฐ์ ํด์๊ฐ์ ์ถ๋ ฅํ๋ค. ์ด ํด์๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ค๋์ ๊ท ๋ฑํ๊ฒ ๋ถ์ฐ์ํค๋ ๋ฐ ์ฌ์ฉ๋๋ค. ํด์ฑ์ ํตํด ๊ฐ ๋ฐ์ดํฐ ํญ๋ชฉ์ด ์ด๋ค ์ค๋์ ์ ์ฅ๋ ์ง ๊ฒฐ์ ํ๊ฒ ๋๋ค..
- ์ผ๊ด๋ ํด์ฑ(Consistent Hashing): ์ผ๊ด๋ ํด์ฑ์ ์ค๋๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์ต์ํ์ ์ฌ๋ถ๋ฐฐ๋ง์ ์ ๋ฐํ์ฌ, ์์คํ ์ ํ์ฅ์ฑ์ ๊ฐ์ ํ๋ค.
- ํด์ฑ์ ๋ฐ์ดํฐ์ ์ฅ ๋ฟ๋ง ์๋๋ผ ๊ฒ์(ํด์ํ ์ด๋ธ), ์ํธํ, ๋ฐ์ดํฐ๋ฌด๊ฒฐ์ฑ๊ฒ์ฌ์ ์ฌ์ฉํ ์ ์๋ค.
- ์ค๋ฉ์ ์ญํ
- ๋ฐ์ดํฐ ๋ถํ ๋ฐ ํ์ฅ์ฑ: ์ค๋ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ ๋ฐ์ดํฐ ์คํ ์ด๋ฅผ ๋ ์์ ํํฐ์ (์ค๋)์ผ๋ก ๋ถํ ํ๋ ํ๋ก์ธ์ค์ ๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ , ์์คํ ์ ํ์ฅ์ฑ์ ํฅ์์ํฌ ์ ์๋ค.
- ์ฑ๋ฅ ๊ฐ์ : ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ค๋์ ๋ถ์ฐ์ํด์ผ๋ก์จ, ๋จ์ผ ์ค๋์ ๋ํ ๋ถํ๋ฅผ ์ค์ด๊ณ , ๋์์ ์ฌ๋ฌ ์ค๋์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ๋์ด ์ ์ฒด ์์คํ ์ ์ฑ๋ฅ์ด ๊ฐ์ ๋๋ค.
- ๋ฐ์ดํฐ์ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์ ์ด ๋ฐ๋ก ์ค๋ฉ์ด๋ค.
- ์ค๋ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ์ฌ๋ฌ ๊ฐ์ ํํฐ์ ์ผ๋ก ๋ถํ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ฉฐ, ํด์ฑ๋ฐฉ์์ด ์๋๋๋ผ๋ ๋ฒ์๊ธฐ๋ฐ์ค๋ฉ(Range-based Sharding), ๋๋ ํฐ๋ฆฌ ๊ธฐ๋ฐ ์ค๋ฉ(Directory-based Sharding), ์ฌ์ฉ์์ ์ ์ฌ๋ฉ(Custom Sharding)์ด ์๋ค. ์ฆ, ํด์ฑ์ ์ค๋ฉ์ ๊ตฌํํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ค์ ํ๋์ด๋ฉฐ, ํด์ฑ์์ด ์ค๋ฉ์ ๊ตฌํํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด, ํด์ฑ์ ๋ํด ์กฐ๊ธ๋ ํ์ธํด๋ณด์
- ๋จ์(์ผ๋ฐ)ํด์ฑ (General/Standard/Simple Hashing)
- ์๋ ๋ฐฉ์: ๋ฐ์ดํฐ์ ํค๋ฅผ ํด์ ํจ์์ ์ ๋ ฅํ์ฌ, ๊ฒฐ๊ณผ๊ฐ์ ํด์ ํ ์ด๋ธ์ ์ฌ๋กฏ ๋ฒํธ๋ก ์ฌ์ฉํ๋ค. ์ด ๋ฐฉ์์ ๋ฐ์ดํฐ๋ฅผ ํด์ ํ ์ด๋ธ์ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ์ํค๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
- ๋ฌธ์ ์ : ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ(์: ์๋ฒ์ ๊ฐ์)๊ฐ ๋ณ๊ฒฝ๋ ๋, ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐฐ์นํด์ผ ํ๋ค. ์ด๋ ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋ก์ด ํด์ ํจ์ ๊ฒฐ๊ณผ๊ฐ์ด ๋ค๋ฅธ ์ฌ๋กฏ ๋ฒํธ๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์, ์๋ฒ ์ถ๊ฐ๋ ์ ๊ฑฐ ๊ฐ์ ์์คํ ์ ํ์ฅ ๋ฐ ์ถ์ ์์ ์ด ๋ฐ์ํ ๋ ๋ง์ ์์ ๋ฐ์ดํฐ ์ด๋์ ์ด๋ํ๋ฉฐ, ์ด๋ ์์คํ ์ ํฐ ๋ถํ๋ฅผ ์ฃผ๊ณ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
- ์ผ๊ด๋ ํด์ฑ(Consistent Hashing)
- ์๋ ๋ฐฉ์: ์ผ๊ด๋ ํด์ฑ์ ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋ ์ค์ง ์ผ๋ถ ๋ฐ์ดํฐ๋ง ์ฌ๋ฐฐ์น๋๋๋ก ํ๋ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํด์ ๊ณต๊ฐ์ ์ํ์ผ๋ก ๊ฐ์ ํ๊ณ , ๋ฐ์ดํฐ์ ์๋ฒ๋ฅผ ํด์ ๊ณต๊ฐ ์์ ํฌ์ธํธ๋ก ๋งคํํ๋ค. ๋ฐ์ดํฐ๋ ํด์ ๊ฐ์ ๋ฐ๋ผ ์ด ์ ์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์๋ฒ ํฌ์ธํธ์ ํ ๋น๋๋ค.
- ์ฅ์ : ์๋ฒ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ๊ฑฐ๋ ๋, ๋ณ๊ฒฝ์ด ํ์ํ ๋ฐ์ดํฐ์ ์์ด ํจ์ฌ ์ ๋ค. ์ค์ง ์ ์๋ฒ์ ์ธ์ ํ ๋ฐ์ดํฐ๋ง ๋ค์ ํ ๋น๋๋ฉฐ, ๋๋จธ์ง ๋ฐ์ดํฐ๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค. ์ด๋ก ์ธํด ์์คํ ์ ํ์ฅ์ฑ๊ณผ ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋๋ค. ๋ํ, ํซ์คํฟ ํค ๋ฌธ์ ๋ฅผ ์ค์ผ ์ ์๋ค.
- ๋จ์(์ผ๋ฐ)ํด์ฑ VS ์ผ๊ด๋ ํด์ฑ
- ๊ธฐ๋ณธํด์ฑ์ ์ฌ๋กฏ(์๋ฒ)์ ๊ฐ์๊ฐ ๋ฐ๋๋ ๋๋ถ๋ถ ์์ดํ ์ ์ฌ๋ฐฐ์น ํด์ผํ๋ค.
- ์ผ๊ด๋ ํด์ฑ์ ์์์ ์์ดํ ๋ง ์ฌ๋ฐฐ์นํ๊ฒ๋์ด ์์คํ ์ ์ฒด์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ด ์ต์ํ ๋๋ค.
- ํด์ ํ
์ด๋ธ(Hash Table)๊ณผ ํด์ ๋ง(Hash Ring)์ ๊ฐ๋
์ ์ธ ๋ชจ๋ธ์ด๋ฉฐ, ๋ฌผ๋ฆฌ์ ์ธ ํ
์ด๋ธ์ด๋ ์ ์ฅ์๊ฐ ์กด์ฌํ๋๊ฒ์ด ์๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ๋ ๋งค์ปค๋์ฆ์ ๊ตฌํํ๊ธฐ ์ํ ์ถ์์ ์ธ ๊ตฌ์กฐ(๋ ผ๋ฆฌ์ ์ธ ๋ชจ๋ธ)์ด๋ฉฐ, ์ค์ ๋ฐ์ดํฐ ์ ์ฅ์ ์์ ์ถ์ํ๋ ๊ณ์ธต์ ์ ๊ณตํ๋ค. ์ด๋ฐ ๊ฐ๋ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ๋น ๋ฅด๊ฒ ์ ๊ทผํ๊ธฐ ์ํ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ์ ์ผ๋ถ์ด๋ค.
Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋ ํน์ ์คํ ๋ฆฌ์ง์ ์ข
์๋์ง ์๋๋ค.
์ด๋ ๊ณง ์คํ ๋ฆฌ์ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๊ณตํ๋ ์ค๋ฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ๋ชปํ๊ณ , ์คํ ๋ฆฌ์ง ์ ํ์ ์๊ด์์ด ์ดํ๋ฆฌ์ผ์ด์
๋ ๋ฒจ์์ ์ค๋ฉ์ ๊ตฌํํ๊ณ ์๋ค๋ ๋ป์ด๋ค. ๋ํ ๋์คํฌ๋ ๋ฒจ์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ตฌํ๋๋ค.
2.7 ๊ด์ธก๊ฐ๋ฅ์ฑ ์๊ฐํ
Grafana๋ ์๊ฐํ ๊ฐ๋ฅํ ์๋ง์ ์ข
๋ฅ์ ์ฐจํธ๋ฅผ ์ ๊ณตํ๋ค.
* ์ต์ ์๊ฐํ ํจ๋: https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/
๋ฌธ์์ ๊ฐ์ฅ ์ข์ ์ต์ ์๋ฃ๋ฅผ ์ฐธ๊ณ ํ ์ ์์ผ๋, ์์ผ๋ก๋ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค.
์ข ์ ๊ธฐํ๊ฑด Canvas์ด๋ค.
Canvas ํจ๋์ ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ์ปค์คํ
์๊ฐํ๋ฅผ ์์ฑํ๊ณ , ๋์๋ณด๋์ ๋ค์ํ ์๊ฐ์ ์์์ ์ธํฐ๋ํฐ๋ธํ ๊ทธ๋ํฝ์ ์ถ๊ฐํ ์ ์๋ค.
2.8 ํค-๊ฐ ์ ์ฅ์
ํค-๊ฐ ์ ์ฅ์๋, ๋ฐ์ดํฐ๋ฅผ ํค(Key)์ ๊ฐ(Value)์ ์์ผ๋ก ์ ์ฅํ๋ ๋จ์ํ๋ฉด์๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ์์ ๊ฐ์ง NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฉฐ, ๋ํ์ ์ผ๋ก Redis, Memcached, AWS Dynamodb, Apache Cassandra, Google LevelDB ๋ฑ์ด ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํค๊ฐ์ ์ฅ์๋ Redis์ด๋, Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)๋ Redis๋ณด๋ค๋ Memcached๋ฅผ ๊ถ์ฅํ๊ณ , ์ฃผ๋ก ์ฝ๊ธฐ์ ์ฌ์ฉํ๋ค. ๋ณ๋ชฉ์ด ๋ฐ์ํ๋ ๋ถ๋ถ๊ณผ ์ง์ฐ์์ด ๋ง์ ํธ๋์ ์ ์ ์ฒ๋ฆฌํด์ผํ๋ ์๊ตฌ์ฌํญ์ด ์๋ค๋ฉด ์บ์๋ฅผ ์ฌ์ฉํด์ ๋น์ฝ์ ์ผ๋ก ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค. (+๋น์ฉ์ ๊ฐ) --> ์ฐ๋ฆฌ Loki๋ Redis/Memcached ์์จ์ ์ฝ๊ธฐ๊ฐ ์ข๋ง ์ปค์ง๋ฉด ํ๋ ๊ฑธ๊น ๐ญ
ํค-๊ฐ ์์์์ ํค๋ ์ ์ผํด์ผ ํ๋ฉฐ, ํด๋น ํค์ ๋งค๋ฌ๋ฆฐ ๊ฐ์ ํค๋ฅผ ํตํด์๋ง ์ ๊ทผํ ์ ์๋ค.
- ํค๋ ์ผ๋ฐ ํ ์คํธ์ผ์๋ ์๊ณ , ํด์๊ฐ์ผ์๋ ์๋ค.ํค๋ ์ฑ๋ฅ์์ ์ด์๋ก ์งง์์๋ก ์ข๋ค.
- ๊ฐ์ ๋ฌธ์์ด, ๋ฆฌ์คํธ, ๊ฐ์ฒด์ผ ์ ์๋ค. (์ ํ์๋ค)
์ด ์ฑ ์์ ํค-๊ฐ ์ ์ฅ์๋ ์๋์ ๊ฐ์ ์ ์ฅํ๋ ์ฉ๋๋ก ์ฐ์ธ๋ค.
- ์ฝ์ (Consul), Etcd, ๋ฉค๋ฒ๋ฆฌ์คํธ(Memberlist) ๋ฑ์ ์ฌ์ฉํด ๊ตฌ์ฑ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๋ก๊ทธ ๊ด๋ฆฌ์ ์ฌ์ฉํ๋ ์ธ๋ฑ์ค ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
ํค-๊ฐ ์ ์ฅ์ ์ค๊ณ์ ๊ณ ๋ คํด์ผํ ํน์ฑ
- ํค-๊ฐ ์์ ํฌ๊ธฐ๋ 10KB ์ดํ๋ค.
- ์ฌ์ด์ฆ๊ฐ ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ด์ผ ํ๋ค.
- ์์คํ ์ ์ฅ์ ์๋ ๋น ๋ฅด๊ฒ ์๋ตํ๋ ๋์ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํด์ผ ํ๋ค.
- ํธ๋ํฝ ์์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ์๋ฒ์ฆ์ค,์ญ์ ๊ฐ ์ด๋ฃจ์ด์ง๋ ๋์ ๊ท๋ชจ์ ํ์ฅ์ฑ์ ์ ๊ณตํด์ผํ๋ค.
- ๋ฐ์ดํฐ์ผ๊ด์ฑ ์์ค์ ์กฐ์ ์ด ๊ฐ๋ฅํด์ผ ํ๋ค. -> ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ ์ฌ์ด์ ๊ณ ๋ฏผ์ ํญ์ ํด์ผํ๋ค.
- ์๋ต ์ง์ฐ ์๊ฐ์ด ์งง์์ผ ํ๋ค.
Q. ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ(Consistency)๊ณผ ๊ฐ์ฉ์ฑ(Availability) ์ฌ์ด์ ๊ณ ๋ฏผ
[์ํฉ ์ค์ ]
์จ๋ผ์ธ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์ ๋ฐ์ดํฐ ์ผํฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ฐํ์ฌ ์ ์ฅํฉ๋๋ค. ์ฌ์ฉ์๋ ์ด๋ ์ง์ญ์์๋ ์ง ์ฑ
์ ๊ฒ์ํ๊ณ , ๊ตฌ๋งคํ๋ฉฐ, ๋ฆฌ๋ทฐ๋ฅผ ๋จ๊ธธ ์ ์๋ค.
[์ผ๊ด์ฑ(Consistency)์ ์ค์์ฑ]
์ผ๊ด์ฑ์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ์๋ค๋ ๊ฒ์ ๋ณด์ฅํ๋ ์ฑ์ง์ด๋ค.
์๋ฅผ ๋ค์ด, ํ ์ฌ์ฉ์๊ฐ ํน์ ์ฑ
์ ์ฌ๊ณ ๋ฅผ ์
๋ฐ์ดํธ(์: ์ฌ๊ณ +1)ํ๋ฉด, ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ์๋ ์ฆ์ ์
๋ฐ์ดํธ๋ ์ฌ๊ณ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ด์ผ ํ๋ค.
๋ง์ฝ ํ ์ง์ญ์ ๋ฐ์ดํฐ ์ผํฐ๊ฐ ์
๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ ๋ค๋ฅธ ์ง์ญ์ ๋ฐ์ดํฐ ์ผํฐ์ ๋๊ธฐํํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ฉด, ์ผ๋ถ ์ฌ์ฉ์๋ ๊ตฌ์ ์ฌ๊ณ ์ ๋ณด๋ฅผ ๋ณด๊ฒ ๋ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฌ๊ณ ๊ฐ ์ค์ ๋ณด๋ค ์ ๋ค๊ณ ์๋ชป ๋ณด์ฌ, ์ฌ์ฉ์๊ฐ ๊ตฌ๋งค๋ฅผ ๋ง์ค์ด๊ฒ ๋ง๋ค ์ ์๋ค.
[๊ฐ์ฉ์ฑ(Availability)์ ์ค์์ฑ]
๊ฐ์ฉ์ฑ์ ์์คํ
์ด ์ฌ์ฉ์์ ์์ฒญ์ ๋ํด ํญ์ ์๋ต์ ์ ๊ณตํ๋ ์ฑ์ง์ด๋ค. ์ฌ์ฉ์๊ฐ ์ธ์ ๋ ์ง ์ฑ
์ ๊ฒ์ํ๊ณ ๊ตฌ๋งคํ ์ ์์ด์ผ ํ๋ค.
๋ง์ฝ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ชจ๋ ๋ฐ์ดํฐ ์ผํฐ๊ฐ ๋๊ธฐํ๋ ๋๊น์ง ์ฌ์ฉ์์ ์์ฒญ์ ๋๊ธฐ์ํจ๋ค๋ฉด, ์ผ๋ถ ์ง์ญ์์๋ ์์คํ
์ ์๋ต์ด ์ง์ฐ๋ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ํ ์ง์ญ์ ๋ฐ์ดํฐ ์ผํฐ์ ์ฅ์ ๊ฐ ๋ฐ์ํด ๋๊ธฐํ๊ฐ ์ง์ฐ๋๋ค๋ฉด, ๊ทธ ์ง์ญ์ ์ฌ์ฉ์๋ ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์๊ฒ ๋๋ค.
[๊ท ํ ์ฐพ๊ธฐ]
์ผ๊ด์ฑ๊ณผ ๊ฐ์ฉ์ฑ ์ฌ์ด์ ๊ท ํ์ ์ฐพ๋ ๊ฒ์ ์ฝ์ง ์๋ค.
- ์ผ๊ด์ฑ์ ์ ํ: ๋ชจ๋ ์ฌ์ฉ์๊ฐ ํญ์ ์ต์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๊ฒ์ ๋ณด์ฅํ๋ค.
ํ์ง๋ง, ์ด๋ ๋ฐ์ดํฐ ์ผํฐ ๊ฐ์ ๋๊ธฐํ๋ก ์ธํด ์๋ต ์๋๊ฐ ๋๋ ค์ง ์ ์๋ค. - ๊ฐ์ฉ์ฑ์ ์ ํ: ์ฌ์ฉ์๊ฐ ์์คํ
์ ํญ์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
ํ์ง๋ง, ์ด๋ ์ฌ์ฉ์๊ฐ ํญ์ ์ต์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ ๊ฒ์ ๋ณด์ฅํ์ง ๋ชปํ ์ ์๋ค.
--๋ฒ์ธ
์์ ์ S3๊ณต๋ถํ ๋ ๊ฐ์ฉ์ฑ, ์ผ๊ด์ฑ, ๋ด๊ตฌ์ฑ์ ๋ํด ๊ณต๋ถํ์๋๋ฐ ๊ทธ๋ ์ผ๊ด์ฑ์ ๋ํด ๊ธฐ์ต์ด ๊ฐ๋ฌผ๊ฐ๋ฌผํด์ ํ๋ฒ ๋ค์ ์ฐพ์๋ดค๋ค.
- 2020๋ ๋ง, AWS S3๋ ๊ฐ๋ ฅํ ์ฝ๊ธฐ ์ผ๊ด์ฑ(Strong Read-After-Write Consistency) ๋ชจ๋ธ์ ๋์ ํ๋ค. ์ด์ ์๋ ์ต์ข ์ผ๊ด์ฑ(eventual consistency) ๋ชจ๋ธ์ ์ฌ์ฉํ์๋ค.
- https://aws.amazon.com/ko/blogs/korea/amazon-s3-update-strong-read-after-write-consistency/
2.9 ๊ฐ์ฒด์คํ ๋ฆฌ์ง
๊ฐ์ฒด ์คํ ๋ฆฌ์ง (Object Storage)๋, ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด(Object) ๋จ์๋ก ์ ์ฅํ๋ ๋ฐ์ดํฐ ์คํ ๋ฆฌ์ง์ด๋ค.
๊ฐ์ฒด์ ๋ฐ์ดํฐ ํ์ผ์์ฒด ๋ฟ ๋ง ์๋๋ผ, ๋ฐ์ดํฐ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ์ ๊ณ ์ ์๋ณ์๊ฐ ํฌํจ๋๋ฉฐ, ๊ณ ์ ์๋ณ์๋ฅผ ํตํด ์ง์ ์ฐธ์กฐํ๊ณ ์ ๊ทผํ ์ ์๋ค. ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ ํ์ฅ์ฑ์ด ๋ฐ์ด๋๊ณ , ๋๊ท๋ชจ์ ๋น์ ํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
- ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ํน์ง
- ํ์ฅ์ฑ: ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ ๊ฑฐ์ ๋ฌดํ์ ๊ฐ๊น์ด ํ์ฅ์ฑ์ ์ ๊ณตํ๋ค. ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด๊ตฌ์กฐ์ ์ ์ฅํ๊ธฐ๋๋ฌธ์ ํ์ผ์์คํ ์ด๋ ๋ธ๋ก์คํ ๋ฆฌ์ง ์์คํ ์์ ๋ฐ์ํ ์ ์๋ ๊ณ์ธต์ ๊ตฌ์กฐ์ ๋ณต์ก์ฑ๊ณผ ํ๊ณ์์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
- ๋ฉํ๋ฐ์ดํฐ ๊ด๋ฆฌ: ๊ฐ ๊ฐ์ฒด์๋ ํ์ผ ์์ฒด ์ธ์๋ ์์ธํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋ค. ๋ฉํ๋ฐ์ดํฐ๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฅํ๊ณ ๊ฒ์ํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ค.
- ๋ฐ์ดํฐ ์ ๊ทผ: ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ HTTP/HTTPS ํ๋กํ ์ฝ์ ์ด์ฉํด ์ ๊ทผํ๋ค. RESTful API๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํ ์ ์๋ค.
- ๋ด๊ตฌ์ฑ๊ณผ ๊ฐ์ฉ์ฑ: ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์์น์ ์๋์ผ๋ก ๋ณต์ ํ๊ณ , ๋ถ์ฐํ์ฌ ์ ์ฅํจ์ผ๋ก์จ ๋์ ๋ด๊ตฌ์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ๋ค. ๋ฐ์ดํฐ ์์ค์ ์ํ์ ์ต์ํ ํ๊ณ ์ธ์ ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ SSD์ ๋นํด IOPS๊ฐ ๋ฎ์ง๋ง(์ด ์ฑ ์์๋ IOPS๊ฐ ๋ฎ๋ค๊ณ ์ด์ผ๊ธฐ ํ์ง๋ง, ์ ํํ๊ฒ ์ด์ผ๊ธฐํ๋ฉด ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์๋ IOPS ๊ฐ๋ ์ด ์๋ค. ์ธก์ ์ ๊ด์ ์ด ๋ค๋ฅด๋ค.), ๋์ฉ๋ ์ฒ๋ฆฌ์ ๋ํ ๋์ ์ฒ๋ฆฌ๋(Throughput)์ ์ ๊ณตํ๋ค. (๋ ์์ ํ ๋ฌด์ ํ์ ์๋๋ค. S3๋ง ํ๋๋ผ๋ api์ ๋ฐ๋ผ prefix๋ณ limit์ด ์กด์ฌํ๋ค)
Q. ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ ํ๋ฉด๊ตฌ์กฐ์ ์ ์ฅ๋๋ ๋ง ๊ทธ๋๋ก์ Object ์ ์ฅ์์ธ๋ฐ, ์ Prefix๋ณ ์ ํ์ด ์์ง?
์ฐธ๊ณ : https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html
S3๋ Prefix๋น Amazon S3 ์ ๋์ฌ๋น ์ด๋น ์ต์ 3,500๊ฐ์ PUT/COPY/POST/DELETE ๋๋ 5,500๊ฐ์ GET/HEAD ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค. (Prefix๋ฅผ ๋๋๋ฉด ๋ฌผ๋ก x3500, x5500์ด ๋์ง๋ง..)
๊ทธ๋ฐ๋ฐ ์๊ฐํด๋ณด๋ฉด ๊ฐ์ฒด์คํ ๋ฆฌ์ง๋ ํ๋ฉด๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ๋ Object๋ ๋ง ๊ทธ๋๋ก ๊ฐ์ฒด ๊ทธ๋๋ก๋ฅผ ์ ์ฅํ๋๊ฑฐ๋ผ Prefix๊ฐ ๋๋ ํ ๋ฆฌ๊ฐ ์๋๋ฐ (์, test/object1, test/object2 ์์ test/๊ฐ ๋๋ ํ ๋ฆฌ์ ๊ฐ๋ ์ด ์๋๊ณ ๊ฐ ์ค๋ธ์ ํธ์ ์ด๋ฆ์ด test/object1, test/object2 ์ด๋ค. test/๋ prefix(์ ๋์ฌ)๋ค.) ์ด์งธ์ Prefix๋น Limit์ด ์กด์ฌํ๋๊ฑธ๊น?
- Prefix์ ์ญํ
- ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์์ Prefix๋ ๊ฐ์ฒด๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ทธ๋ฃนํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ํน์ ํจํด์ ๊ฐ์ง ํค๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ค์ ์ฝ๊ฒ ์กฐํํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํ๋ค.
- ์๋ฅผ ๋ค์ด, 'test/' ์ ๋์ฌ๋ฅผ ๊ฐ์ง ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋์ดํ๋ ๊ฒ์ 'test'๋ผ๋ "๊ฐ์์ ํด๋" ๋ด์ ๋ชจ๋ ํญ๋ชฉ์ ์กฐํํ๋ ๊ฒ๊ณผ ์ ์ฌํ ํจ๊ณผ๋ฅผ ์ ๊ณตํ๋ค.
- Limit์ ์กด์ฌ ์ด์
- Prefix ๋ณ limit์ด ์กด์ฌํ๋ ์ด์ ๋, ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์์คํ ์ ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๊ด๋ฆฌ ํจ์จ์ฑ์ ์ํจ์ด๋ค.
- ๋๊ท๋ชจ์ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์์คํ ์์๋ ์๋ฐฑ๋ง์์ ์์ญ์ต ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ์ ์์ด์ ํน์ Prefix๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์ ์์ ์ ํ์ ๋์ง ์๋๋ค๋ฉด, ํ "๊ฐ์์ ํด๋" ์์ ๊ทน๋๋ก ๋ง์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ ์ ์์ผ๋ฉฐ, ์ด๋ ์กฐํ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง ์ ์๋ค. ๋ฐ๋ผ์, Prefix ๋ณ๋ก ์ผ์ ์์ ๊ฐ์ฒด๋ฅผ ๋์ง ์๋๋ก ์ ํํจ์ผ๋ก์จ ์์คํ ์ ์ฑ๋ฅ์ ์ ์งํ๊ณ , ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ํ๋ค.
์ฆ, Prefix์ ๊ด๋ จ๋ ์ ํ์ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์์คํ ์ ์ฑ๋ฅ ๋ฐ ์ฌ์ฉ์ฑ์ ์ต์ ํํ๊ธฐ ์ํ ์ค๊ณ ์ ํ์ด๋ค!
์๊ณ์ด ๋ฐ์ดํฐ๋ ์๊ฐ๊ณผ ํจ๊ป ์์ฑ๋๋ ๋น ๋ฐ์ดํฐ ์ด๋ฉฐ, ์๊ณ์ด ๋ฐ์ดํฐ๊ฐ ์์๋ก ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ๊ธฐ๋ก๋๋ฉด ์์ธ ํ์ผ์ด ๋๋์ผ๋ก ์์ฐ๋๋ค.์์ ๋ฐ์ดํฐ๋ ๋ชจ์์ ํ๋์ ํฐ ํ์ผ๋ก ๋ง๋ค์ด ํจ์จ์ ๋์ฌ์ผ ํ๋ฉฐ, ์ง๋์น๊ฒ ํฐ ํ์ผ๋ ๋คํธ์ํฌ ์ ์ก์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ฑฐ๋ ์์์น ๋ชปํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ํ๋ฅ ์ ๋์ธ๋ค. ๋ฐ์ดํฐ๋ ์ ๋นํ ๋ถํ ํ์ฌ ์ ์ฅ๋์ด์ผ ํ๋ค.
CSV, JSON๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ํ์์ ์ปฌ๋ผ๋ฌ๋ฐฉ์์ ํ์ผ์ด(Parquet), ORC ๋ฑ์ ํ์์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ์ฌ ์ฝ๊ณ ์ฐ๋ ์ฒ๋ฆฌ ์๋๋ฅผ ํฅ์์ํฌ ์ ์๋ค.
Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)์์๋ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ฅผ ์๊ตฌ์ ์ฅ์คํ ์ด๋ก ์ฌ์ฉํ๊ณ ์๋ค.
- Loki: ๋ก๊ทธ๋ฅผ ๋น์ฉ ํจ์จ์ ์ธ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ์ฅ
- Tempo: ์ถ์ ๋ฐ์ดํฐ(Trace Data)๋ฅผ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ์ฅ
- Mimir: ์๊ณ์ด ๋ฐ์ดํฐ์ ์ฅ๊ธฐ ์ ์ฅ ๋ฐ ํ์ฅ์ฑ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ์ฅ
2.10 ์์ ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ
Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)์์๋ ์์ ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ๋ฌ ๊ธฐ์ ์ ์ ์ฉํ๊ณ ์๋ค.
์์คํ
์ ํ๋ํ๊ณ , ํธ๋ฌ๋ธ์ํ
์ ์ํด์๋ ๊ผญ ์์์ผ ํ ๋ช๊ฐ์ง๋ฅผ ์๊ฐํ๋ค.
- ๋ฐ์ดํฐ ํํฐ์
- ๋ฐ์ดํฐ ๋ค์คํ
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ (์ฟผ๋ผ)
- ์ฅ์ ๊ฐ์ง
- ์ผ์์ ์ฅ์ ์ฒ๋ฆฌ
๋ฐ์ดํฐ ํํฐ์
๋๊ท๋ชจ ์ดํ๋ฆฌ์ผ์ด์
์์๋ ํ๋์ ์๋ฒ์์ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ํ๋๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ผ๊ด๋ ํด์ (Consistent hash)๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ํํฐ์
ํ๋ฉด ์์คํ
๋ถํ์ ๋ฐ๋ผ ์๋ฒ์ ์๋ ์ถ๊ฐ/์ญ์ ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
- ์ค๋ฉ๊ณผ ํํฐ์
- ์ค๋ฉ: ์ฃผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฉ๋๋ฉฐ ๊ณ ์ ํ ํํฐ์ ํค๋ฅผ ํตํด ์ฌ๋ถ๋ฐฐ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
- ํํฐ์ ๋์ ์๊ฐ ์์์ ๋ฐ๋ผ ์ ์ฌ๋๋ฉฐ ์ฃผ๋ก ๋์คํฌ์ ์ ์ฉ๋๋ค.
ํํฐ์
๋์ ์ฌ์ฉํ๋ฉด ์์์ ํจ์จ์ ์ธ ์ฌ์ฉ์ ํตํด ์ ์ ๋น์ฉ์ผ๋ก ๋ณด๋ค ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ถ๋จ์๋ก ํํฐ์
๋์ ํ๋ฉด ๋งค ๋ถ๋ง๋ค ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด์ ๋ธ๋ก์ ๋ง๋ ๋ค. (๋ง์ฝ ํํฐ์
๋์ด ์
์ฌ๋ฉด, ๋์ฉ๋ ๋ธ๋ก ํ๋๋ฅผ ์์ฑํ๊ฒ ๋๊ณ ์ดํ๋ฆฌ์ผ์ด์
์ ๋์ฉ๋ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ฉํ๊ธฐ ์ํ ์ฒ๋ฆฌ์๊ฐ์ด ๊ธธ์ด์ง๊ณ , ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋๋ฐ๋ ๊ธด ์๊ฐ์ด ํ์ํ๋ค. ์ธ๋ฑ์ค๊ฐ ์๋ค๋ฉด ์๊ฐ์ ๋ ์์๋๋ค)
์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ณ๋ ฌ์ฒ๋ฆฌ์ ๋ณ๋ ฌ ์ฟผ๋ฆฌ๋ฅผ ์ง์ํ๋ค๋ฉด ํํฐ์ ์ ๋๋๊ณ ๋์์ ๋ค์ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋๊ฒ์ด ๊ฐ๋ฅํ๋ค.
๐ฎ๐จ ์ด๊ฒ ๋ฌด์จ์๋ฆฐ์ง ์ดํดํ๊ธฐ ์ํด Loki๋ฅผ ํ์ธํด๋ดค๋ค.
- Client(Promtail)์์ ๋กํค๋ก ๋ก๊ทธ๋ฅผ ๋ณด๋ธ๋ค. (Gateway๋ฑ ์ค๋ช ์ ํ์์๋ ์ปดํฌ๋ํธ๋ ์๋ต)
- Distributor๋ ๋ฐ์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ผ๊ด๋ ํด์ฑ์ ํตํด ํด๋น ๋ฐ์ดํฐ๊ฐ ์ด๋ Ingester์ ์ ์ฅ๋ ์ง ๊ฒฐ์ ํ๊ณ ๋ก๊ทธ๋ฅผ ์ ๋ฌํ๋ค.
- Ingester๋ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ผ์ ์๊ฐ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด๊ดํ ํ(๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ(chunk) ๋จ์๋ก ๊ทธ๋ฃนํํ๊ธฐ ์ํจ), ์ฒญํฌ(chunk) ๋จ์๋ก ๋์คํฌ์ ์ ์ฅํ๋ค.
- Ingester๋ ์ต์ข ์ ์ผ๋ก ๊ฐ์ฒด์คํ ๋ฆฌ์ง์ ๋ฐ์ดํฐ๋ฅผ Flush ํ๋ค.
์ฆ, ์ฌ๊ธฐ์์ ๋งํ๋ ์ค๋ฉ๊ณผ ๋์คํฌ ๋ ๋ฒจ์ ํํฐ์ ์ด ์ค์ ๋ก ์ด๋ ๊ฒ ๊ตฌํ๋ ๊ฒ์ด๋ค. Loki ๋๊ฐ ๋ง๋ ๊ฑด์ง ์ง์ง๋๋ฌด๋๋ฌด ๋๋ํ๋ค.๐๐๐๐
๋ฐ์ดํฐ ๋ค์คํ
๋์ ๊ฐ์ฉ์ฑ๊ณผ ์์ ์ฑ์ ํ๋ณดํ๊ธฐ ์ํด์ ๋ฐ์ดํฐ๋ฅผ N๊ฐ ์๋ฒ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ค์คํ ํด์ผํ๋ค.
N๊ฐ๋ ์ง์ ๊ฐ๋ฅํ ์ต์
์ผ๋ก, N๊ฐ๋ฅผ ์ ์ ํ๋ ๋ฐฉ๋ฒ๋ํ ์ผ๊ด๋ ํด์ ๋งค์ปค๋์ฆ์ ํตํด ๊ฒฐ์ ๋๋ค.
๐ ์ด๊ฒ๋ ์ด์ ์ Loki์ ์ค์ ํ์ ์ด ์์ด์ ์ค๋ช ์ ์ถ๊ฐํ๋ค.
Loki์์๋ replication_factor ์ค์ ์ ํตํด ๋ก๊ทธ ๋ฐ์ดํฐ์ ๋ณต์ ๋ณธ ์๋ฅผ ์ง์ ํ๋ค.
Distributor๊ฐ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ช ๊ฐ์ Ingester์๊ฒ ๋ณต์ฌํ์ฌ ์ ์ฅํ ์ง ๊ฒฐ์ ํ๋ค.
์๋ฅผ๋ค์ด ์ค๋ฅธ์ชฝ ์์๋ฅผ ๋ณด๋ฉด (http://<loki>:3100/config) replication_factor๋ฅผ 3์ผ๋ก ์ค์ ํ๋ค. ์ด ์ค์ ์ ๋ฐ๋ผ Distributor๋ ๋ฐ์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ 3๊ฐ์ ๋ค๋ฅธ Ingester์๊ฒ ์ ์กํ์ฌ, ๊ฐ Ingester๊ฐ ๋ฐ์ดํฐ์ ๋ณต์ฌ๋ณธ์ ๋ณด๊ดํ๋๋กํ๋ค. (Ingester ๊ฐ์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ๋ง์ ๋ณต์ ๋ณธ์ผ๋ก ์ ์งํ ์ง ์ค์ )
์ฆ 3๊ฐ์ ๋ฐ์ดํฐ ๋ณต์ฌ๋ณธ์ด Ingester์๊ฒ ์ ๋ฌ๋๋ค.
Q. Ingester์ 3๊ฐ์ ๋ณต์ ๋ณธ์ด ์๋๋ผ๋, ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์๋ ํ๋๋ง ์ ์ฅ๋์ด์ผ ํ ํ ๋ฐ? ์ด๋ป๊ฒ ๋ณด์ฅํ์ง?
replication_factor๊ฐ 3์ผ ๋, Loki ์์คํ ์ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ 3๊ฐ์ Ingester ์ธ์คํด์ค์ ๋ณต์ ํ์ฌ ์ ์ฅํ๋ค.
์ด ๋ณต์ ๊ณผ์ ์ ์ฃผ๋ก ๋ฐ์ดํฐ์ ๋ด๊ตฌ์ฑ๊ณผ ๊ฐ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ ์์ ๋์คํฌ ์ ์ฅ ๋จ๊ณ์์ ์ด๋ฃจ์ด์ง๋ฉฐ, ์ต์ข ์ ์ผ๋ก ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ๋๋, ๋ฐ์ดํฐ์ ์ค๋ณต ์ ์ฅ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ด ์๋ํด์ผํ๋ค.
- ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ๋ฐ์ดํฐ ์ค๋ณต ๋ฐฉ์ง ๋ฉ์ปค๋์ฆ ์์
- Quorum ๊ธฐ๋ฐ ์ฐ๊ธฐ: Loki๋ ๋ณต์ ๋ ๋ฐ์ดํฐ ์ค์์ ์ฟผ๋ผ(quorum)์ ํ์ฑํ๋ ์ผ๋ถ๋ง์ ์ต์ข ์ ์ผ๋ก ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ฐ๊ธฐ ์ํ ๊ฒฐ์ ์ ๋ด๋ฆฐ๋ค. ์ฟผ๋ผ์ ๋ณต์ ๋ณธ ์ค ๋ค์์ ํฉ์(agreement)๋ฅผ ์๋ฏธํ๋ฉฐ, ์ด๋ ๋ชจ๋ ๋ณต์ ๋ณธ์ด ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
- Deduplication: Loki์ Ingester๋ค์ ์ฒญํฌ(chunk)๋ฅผ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ฐ๊ธฐ ์ ์ ์ฒญํฌ์ ๊ณ ์ ์ฑ์ ๊ฒ์ฌํ๋ค. ์ด๋ฏธ ๋์ผํ ์ฒญํฌ๊ฐ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์กด์ฌํ๋ค๋ฉด, ์ค๋ณต ์ฒญํฌ์ ์ ์ฅ์ ๋ฐฉ์งํ๋ค. ์ด ๊ณผ์ ์ ๋ฐ์ดํฐ์ ์ค๋ณต ์ ์ฅ์ ์ต์ํํ๋ค.
- Flush ์กฐ๊ฑด: Ingester๋ ํน์ ์กฐ๊ฑด(์: ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ์ฒญํฌ์ ์๊ฐ ๋ฒ์, ์์คํ ์ ๋ถํ ๋ฑ)์ ๋ฐ๋ผ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ๋ก ๊ตฌ์ฑํ์ฌ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ Flushํ๋ค. ์ด ๋, ์ฌ๋ฌ Ingester๊ฐ ๋์ผํ ๋ก๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ผ๋, ์ฒญํฌ์ ๊ณ ์ ์๋ณ์๋ ์๊ฐ ๋ฒ์ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ณต์ ๋ฐฉ์งํ๋ ๋ก์ง์ด ์ ์ฉ๋๋ค.
- ์ ์กฑ์ ํฉ์ (Quorum Consensus): ๋ถ์ฐ ์์คํ ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํฉ์(consensus) ์๊ณ ๋ฆฌ์ฆ์ ํตํด, ์ด๋ ๋ณต์ ๋ณธ์ด ์ต์ข ์ ์ผ๋ก ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ์ง ๊ฒฐ์ ํ ์ ์๋ค. Loki ๊ตฌํ์์๋ Ingester ๊ฐ์ ํฉ์๋ฅผ ํตํด ์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ต์ข ์ ์ผ๋ก ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋ ์ง ๊ฒฐ์ ํ๋ค.
๊ณต์๋ฌธ์์๋ ์ด๋ ๊ฒ ๋์์๋ค.
When a flush occurs to a persistent storage provider, the chunk is hashed based on its tenant, labels, and contents. This means that multiple ingesters with the same copy of data will not write the same data to the backing store twice, but if any write failed to one of the replicas, multiple differing chunk objects will be created in the backing store.
์ฆ, ์๊ตฌ์ ์ฅ์๋ก flush๊ฐ ๋ฐ์ํ๋ฉด, ์ฒญํฌ๋ ํ
๋ํธ,๋ ์ด๋ธ,์ฝํ
์ธ ์ ๋ฐ๋ผ ํด์๋๊ณ ์ฐ๊ธฐ๋ฅผ ์คํํ๋ค. ์ด๋ ingester์ ์ฌ๋ฌ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์์ง๋ง ํ๋ฒ๋ง ์ฐ๊ธฐ๋๋ค๋๊ฒ๊ฐ๋ค.. ๐(๋ง๋..)
replication_factor ์ค์ ์ ์ฃผ๋ก ๋ฐ์ดํฐ์ ๊ฐ์ฉ์ฑ๊ณผ ๋ด๊ตฌ์ฑ์ ์ํ ๋ด๋ถ ๋ณต์ ๋ฉ์ปค๋์ฆ์ ์ํฅ์ ์ฃผ๋ฉฐ, ์ต์ข ์ ์ผ๋ก ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ ์ค๋ณต ์์ด ๊ด๋ฆฌ๋๋ค.
๋ฐ์ดํฐ ์ผ๊ด์ฑ
์ฌ๋ฌ ๋ ธ๋์ ๋ค์คํ๋ ๋ฐ์ดํฐ๋ ์ ์ ํ ๋๊ธฐํ ๋์ด์ผ ํ๋ค. ์ด๋ ์ ์กฑ์ ํฉ์(Quorum Consensus)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๊ธฐ/์ฐ๊ธฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ค.
- ์ ์กฑ์ ํฉ์(Quorum Consensus)๋, ์์คํ ๋ด์ ์ฌ๋ฌ ๋ ธ๋ ์ฌ์ด์์ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ํด ํ์ํ ์ต์ํ์ ๋์(๋๋ ํฌํ)์ ์๋ฅผ ์๋ฏธํ๋ค.
- ๋ถ์ฐ ์์คํ ์์ ๋ชจ๋ ๋ ธ๋๊ฐ ํญ์ ๋์์ ๋์ผํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ๋, ํน์ ์์ (์: ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ, ์์คํ ์ค์ ๋ณ๊ฒฝ ๋ฑ)์ ๋ํ ๊ฒฐ์ ์ ๋ด๋ ค์ผ ํ๋ค. ์ ์กฑ์ ํฉ์๋ ์ด๋ฌํ ๊ฒฐ์ ์ด ์ ํจํ๋ ค๋ฉด ์์คํ ๋ด์์ ์ผ์ ์ ์ด์์ ๋ ธ๋๊ฐ ๋์ํด์ผ ํจ์ ์๋ฏธํ๋ค.
- ์ด๋ ์์คํ ์ ์ผ๋ถ ๋ ธ๋๊ฐ ์คํจํ๊ฑฐ๋ ๋คํธ์ํฌ ๋ถํ ๋ก ์ธํด ์ผ์์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ์ํฉ์์๋ ์์คํ ์ด ๊ณ์ํด์ ์์ ์ ์ผ๋ก ์ด์๋ ์ ์๋๋ก ๋ณด์ฅํ๋ค.
- ์ ์กฑ์ ๊ฐ๋ ์ ๋ค์ํ ํฉ์ ํ๋กํ ์ฝ์์ ์ค์ํ ์ญํ ์ ํ๋ค. ์๋ฅผ ๋ค์ด, Paxos๋ Raft์ ๊ฐ์ ํฉ์ ์๊ณ ๋ฆฌ์ฆ์ ์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ปค๋ฐํ๊ธฐ ์ ์ ์ ์กฑ์๋ฅผ ํ๋ณดํด์ผ ํ๋ค. ์ด๋ฌํ ํ๋กํ ์ฝ์ ๋ถ์ฐ ์์คํ ์ ์ผ๊ด์ฑ๊ณผ ๋ด๊ฒฐํจ์ฑ(Fault Tolerance)์ ๋ณด์ฅํ๋ ๋ฐ ํ์์ ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ธํด๋ณด์.
- ๋ฐ์ดํฐ ํํฐ์
- N = ๋ณต์ ๋ณธ ๊ฐ์
- W = ์ฐ๊ธฐ (์ฐ๊ธฐ์ฐ์ฐ์ ๋ํ ์ ์กฑ์, ์ฐ๊ธฐ๊ฐ ์ฑ๊ณตํ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ค๋ฉด ์ ์ด๋ W๊ฐ์ ์๋ฒ๋ก ๋ถํฐ ์ฐ๊ธฐ๊ฐ ์ฑ๊ณตํ์์ ์๋ต๋ฐ์์ผ ํจ)
- R = ์ฝ๊ธฐ (์ฝ๊ธฐ์ฐ์ฐ์ ๋ํ ์ ์กฑ์, ์ฝ๊ธฐ๊ฐ ์ฑ๊ณตํ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ค๋ฉด ์ ์ด๋ R๊ฐ์ ์๋ฒ๋ก๋ถํฐ ์๋ต ๋ฐ์์ผ ํจ)
W, R, N์ ๊ฐ์ ์ ํ๋ ๊ฒ์ ์๋ต ์ง์ฐ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ฌ์ด์ ํํ์ ์ ์ฐพ๋ ์ ํ์ ์ธ ๊ณผ์ ์ด๋ค.
์์คํ
๋ง๋ค ์๊ตฌ๋๋ ์ผ๊ด์ฑ์ ์์ค์ด ๋ค๋ฅด๋ฏ๋ก, ๊ทธ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ R,W,N์ด ์กฐ์ ๋์ด์ผ ํ๋ค.
R=1 ๋๋, W=1 ๊ตฌ์ฑ์ ๊ฒฝ์ฐ, ์ค์ฌ์๋ ์๋ฒ ํ๋์ ์๋ต๋ง ๋ฐ์ผ๋ฉด ๋๋ ์๋ต์๋๋ ๋น ๋ฅด๋ค.
R,W๊ฐ 1๋ณด๋ค ํฐ ๊ฒฝ์ฐ์๋ ์์คํ
์ด ๋ณด์ฌ์ฃผ๋ ์ผ๊ด์ฑ์ ์์ค์ ํฅ์๋ ํ
์ง๋ง ์ค์ฌ์์ ์๋ต์๋๋ ๋๋ ค์ง๋ค.
R+W > N ์ธ ๊ฒฝ์ฐ ๊ฐํ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋๋ค.
R=1, W=N์ธ ๊ฒฝ์ฐ ๋น ๋ฅธ ์ฝ๊ธฐ ์ฐ์ฐ์ ์ต์ ํ ๋์ด์๋ค.
W=1, R=N์ธ ๊ฒฝ์ฐ ๋น ๋ฅธ ์ฐ๊ธฐ ์ฐ์ฐ์ ์ต์ ํ ๋์ด์๋ค.
๐คญ Loki์ ๊ฒฝ์ฐ ์ฌ๊ธฐ ๋ฌธ์์ ๋ณด๋ฉด ์ด๋ ๊ฒ ๋์์๋ค.
Replication factor
In order to mitigate the chance of losing data on any single ingester, the distributor will forward writes to a replication_factor of them. Generally, this is 3. Replication allows for ingester restarts and rollouts without failing writes and adds additional protection from data loss for some scenarios. Loosely, for each label set (called a stream) that is pushed to a distributor, it will hash the labels and use the resulting value to look up replication_factor ingesters in the ring (which is a subcomponent that exposes a distributed hash table). It will then try to write the same data to all of them. This will error if less than a quorum of writes succeed. A quorum is defined as floor(replication_factor / 2) + 1. So, for our replication_factor of 3, we require that two writes succeed. If less than two writes succeed, the distributor returns an error and the write can be retried.
Caveat: If a write is acknowledged by 2 out of 3 ingesters, we can tolerate the loss of one ingester but not two, as this would result in data loss.
Replication factor isn’t the only thing that prevents data loss, though, and arguably these days its main purpose is to allow writes to continue uninterrupted during rollouts & restarts. The ingester component now includes a write ahead log which persists incoming writes to disk to ensure they’re not lost as long as the disk isn’t corrupted. The complementary nature of replication factor and WAL ensures data isn’t lost unless there are significant failures in both mechanisms (i.e. multiple ingesters die and lose/corrupt their disks).
floor(replication_factor / 2) + 1 ์์ผ๋ก ์ฐ๊ธฐ ์ ์กฑ์๊ฐ ๊ฒฐ์ ๋๋ฉฐ, ๊ณผ๋ฐ์์ด์์ด์ด์ผ ํ๋๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
์ฅ์ ๊ฐ์ง
์ฅ์ ๊ฐ์ง(Failure Detection)๋, ๋ดํธ์ํฌ ๋ด์ ๋
ธ๋(์๋ฒ, ์ปดํจํฐ ๋ฑ)๊ฐ ์คํจํ๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๊ณผ์ ์ด๋ค.
๋ถ์ฐ์์คํ
์์์ ์ฅ์ ๊ฐ์ง๋ ์์คํ
์ ๊ฐ์ฉ์ฑ๊ณผ ๋ด๊ตฌ์ฑ์ ์ ์งํ๋๋ฐ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์ด๋ค.
์์ ์๋ multicast ๋ฅผ ์ด์ฉํ์ง๋ง ์์ฆ์ ๊ฐ์ญ(Gossip)ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค.
- ๊ฐ์ญ(Gossip) ํ๋กํ ์ฝ์ด๋?
- ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด, ์ด ํ๋กํ ์ฝ์ ์ฌํ์ ๊ฐ์ญ(์๋ฌธ)์ด ํผ์ง๋ ๋ฐฉ์์ ๋ชจ๋ฐฉํ๋ค.
- ๊ฐ ๋ ธ๋๋ ์ ๊ธฐ์ ์ผ๋ก ๋๋ ๋น์ ๊ธฐ์ ์ผ๋ก ๋ช๋ช ๋ค๋ฅธ ๋ ธ๋์ ์ ๋ณด๋ฅผ ๊ตํํ๋ค. ์ด๋ ๋ ธ๋์ ์ํ ์ ๋ณด(์: ์ด์์์, ์คํจํจ)๊ฐ ํฌํจ๋๋ค.
- ๋ ธ๋๋ ๋ฐ์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ก์ปฌ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ๋ค์ ๊ฐ์ญ ๊ตํ ๋ ์ด ์ ๋ณด๋ฅผ ๋ค๋ฅธ ๋ ธ๋์ ๊ณต์ ํ๋ค.
- ์ด๋ ๊ฒ ํด์ ๋ ธ๋๋ ๋คํธ์ํฌ ์์ ์ฅ์ ์ํ์ ๋ํด ์ผ๊ด๋ ์๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค.
- ๊ฐ์ญ(Gossip) ํ๋กํ ์ฝ ์ฅ์
- ํ์ฅ์ฑ: ๊ฐ์ญ ํ๋กํ ์ฝ์ ๋คํธ์ํฌ์ ํฌ๊ธฐ๊ฐ ์ปค์ ธ๋ ์ ๋์ํ๋ค. ๊ฐ ๋ ธ๋๋ ์ ์ฒด ๋คํธ์ํฌ๊ฐ ์๋ ๋ช๋ช ๋ ธ๋์๋ง ์ ๋ณด๋ฅผ ๊ตํํ๊ธฐ ๋๋ฌธ์, ๋คํธ์ํฌ ํธ๋ํฝ์ด ๋น๊ต์ ์ ๊ฒ ์ฆ๊ฐํ๋ค.
- ๋ด๊ฒฐํจ์ฑ: ํ๋ ๋๋ ์์์ ๋ ธ๋์ ์ฅ์ ๊ฐ ๋ฐ์ํด๋ ์์คํ ์ ์ฒด์ ์ ๋ณด ์ ํ์ ํฐ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค. ๊ฐ์ญ ํ๋กํ ์ฝ์ ๋คํธ์ํฌ ๋ถํ (partition) ์ํฉ์์๋ ์ผ์ ์์ค์ ์ ๋ณด ์ ํ๋ฅผ ๋ณด์ฅํ๋ค.
- ์๊ฐ ์น์ (Self-healing): ์์คํ ์ด ์๋์ผ๋ก ์ฅ์ ๋ ธ๋๋ฅผ ๊ฐ์งํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ์ฌ๊ตฌ์ฑํ ์ ์๋ค.
- ๊ฐ์ญ(Gossip) ํ๋กํ ์ฝ ๋จ์
- ์ต์ข ์ผ๊ด์ฑ(Eventual Consistency): ๊ฐ์ญ ํ๋กํ ์ฝ์ ์ ๋ณด๊ฐ ์ ์ฒด ์์คํ ์ ๊ฑธ์ณ ์ฆ๊ฐ์ ์ผ๋ก ์ ํ๋๋ ๊ฒ์ ๋ณด์ฅํ์ง ์๋๋ค. ๋ฐ๋ผ์, ๋ชจ๋ ๋ ธ๋๊ฐ ๋์ผํ ์์ ์ ๋์ผํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์์ ๋ณด์ฅํ ์ ์๋ค.
Loki๋ Memberlist๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Gossip ํ๋กํ ์ฝ) ์ ์ฌ์ฉํ๋ค. (์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ = ์ฅ์ ๊ฐ์ง?)
์๋ ์บก์ณ๋ minikube์ผ์ ์ผ๋ฅธ ์ฌ๋ ค๋ณธ๊ฑฐ๋ผ Members๊ฐ ๋๋ฌด ์๋ค. ๊ทธ๋๋ ์ค์ํ ๋ถ๋ถ์ ํ์ธํ ์ ์๋ค.
์ผ์์ ์ฅ์ ์ฒ๋ฆฌ
๊ฐ์ญํ๋กํ ์ฝ์ ๋
ธ๋์ ์ํ์ ๋ณด๋ฅผ ์ ํํ์ฌ ๋
ธ๋๊ฐ ์คํจํ๋์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๊ฒ ๋๋ค.
์ด๋ ์ด๋ ํ ๋
ธ๋์ ์ฅ์ ๋ฅผ ๊ฐ์งํ๋ค๋ฉด, ์์คํ
๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํ์ํ ์กฐ์น๋ฅผ ํด์ผํ๋ค.
๋ง์ฝ, ์๊ฒฉํ ์ ๋ณต์ ์ ๊ทผ๋ฒ์ ์ด๋ค๋ฉด, ์ฝ๊ธฐ์ ์ฐ๊ธฐ ์ฐ์ฐ์ด ๊ธ์ง๋๊ฒ ๋์ผํ ๊ฒ์ด๋ค.
๋์จํ ์ ์กฑ์ ์ ๊ทผ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด, ๊ท๋ชจ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง ๋
ธ๋ ํ๋๊ฐ ์ฏค ์ฅ์ ๊ฐ ๋๋๋ผ๋ ์ฌ์ ํ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ ์ ์์๊ฒ์ด๋ค.
Grafana ํจ๋ฐ๋ฆฌ (Loki,Grafana,Tempo,Mimir)์์๋ ์๋ง๋, ์ ์กฑ์ ์๊ตฌ์ฌํญ์ ๊ฐ์ ํ๋๊ฒ์ด ์๋๋ผ ํด์๋ง์์ ๊ฑด๊ฐํ ์ฐ๊ธฐ๋ ธ๋(W)์ ์ฝ๊ธฐ๋ ธ๋(R)๋ฅผ ๊ณจ๋ผ ์์ ์ ๊ณ์ ์งํํ๋๊ฒ ๊ฐ๋ค. (์๋ง ์ฑ ์์ ๋งํ๋ ค๊ณ ํ๋๊ฒ์ด ์ด ๋ถ๋ถ์ธ๊ฒ ๊ฐ๋ค)
2.11 ์๊ณ์ด ๋ฐ์ดํฐ ์ง๊ณ
์๊ณ์ด ๋ฐ์ดํฐ๋ ์ค๋๋ ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ฑฐ๋, ์ ํํ ์/๋ถ/์ด ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํด์ผํ ๋๊ฐ ์๋ค.
๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ์ฌ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์๋, ์๋ชป๋ ์ธ๋ฑ์ค๋ ์ฟผ๋ฆฌ ๋ฐฉ๋ฒ์ผ๋ก ์ธํด ์ข
์ข
ํ์ค์บ(full-scan)์ด ๋ฐ์ํ ์ ์๋ค.
ํ์ค์บ(full-scan)์ด๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๊ฐ์ฒด ์คํ ๋ฆฌ์ง, ๋๋ ๊ธฐํ ์ ์ฅ ์์คํ
์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ๋, ํํฐ๋ง ์กฐ๊ฑด์ด๋ ์ธ๋ฑ์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ์ง ๋ชปํ์ฌ ์ ์ฅ๋ ์ ์ฒด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ๊ฒ์ํ๋ ๊ณผ์ ์ ๋งํ๋ค.
์ด๋, ์์คํ
์ฑ๋ฅ ์ ํ, ๋น์ฉ ์ฆ๊ฐ, ์์ ๊ณผ์๋น๋ฅผ ์ผ๊ธฐ์ํจ๋ค.
- ํ ์ค์บ(full-scan) ๋ฐฉ์ง ๋ฐฉ๋ฒ
- ์ ์ ํ ์ธ๋ฑ์ฑ: ์๊ณ์ด ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ์๊ฐ๋๋ณ๋ก ์ธ๋ฑ์ฑํ๋๊ฒ ์ข์๊ฒ๊ฐ๋ค.
- ์ฟผ๋ฆฌ์ต์ ํ
- ๋ฐ์ดํฐ ํํฐ์ ๋
- ์บ์ฑ
์ด ์ฑ
์์๋ ์ปฌ๋ผ ๊ธฐ๋ฐ์ ์ด ์งํฅ ์คํ ๋ฆฌ์ง์ ๋ํด ์ค๋ช
ํ๋ค.
ํ์ค์บ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๊ณ์ด ๋ฐ์ดํฐ ํน์ฑ์ ์๋ง์ ์คํ ๋ฆฌ์ง๋ฅผ ์ฒ์๋ถํฐ ์ฌ์ฉํ๋๊ฒ ์ข๋ค๋ ์ด์ผ๊ธฐ ์ธ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
ํนํ ์ฅ๊ธฐ์ ์ธ ๋ถ์(๋ฐ์ดํฐ ๋ถ์ ํ๋์์๋ ์ด ์งํฅ ์คํ ๋ฆฌ์ง๋ฅผ ๋๋ฆฌ ์ฌ์ฉํ๋๊ฒ์ ๋ณด๋ฉด)์์๋ ์ง๊ณ ํจ์จ์ด ๋ ์ข์ ์ด์งํฅ ์คํ ๋ฆฌ์ง๋ฅผ ๋๋ฆฌ ์ฌ์ฉํ๋ค.
- ์ด ์งํฅ ์คํ ๋ฆฌ์ง(Column-oriented storage)
- ๋ฐ์ดํฐ๋ฅผ ์ด ๋จ์๋ก ์ ์ฅํ์ฌ, ํน์ ์ด์ ๋ํ ์ฐ์ฐ์ด๋ ์ง์(query)๋ฅผ ๋น ๋ฅด๊ฒ ์ํํ ์ ์๋ค.
ํนํ ๋ฐ์ดํฐ ๋ถ์ ์์ ๊ณผ ๊ฐ์ด ๋๋์ ๋ฐ์ดํฐ์์ ํน์ ์ด์ ๋ํ ์ฐ์ฐ ํน์ด ์ฝ๊ธฐ ์ฟผ๋ฆฌ์ ์ต์ ํ ๋์ด์๋ค. - ์ปฌ๋ผ ๋จ์์ ํต๊ณ์ ๋ณด์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ฝ๊ธฐ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ํต์ฌ์ด๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: Apache Cassandra, Apache HBase, Google Bigtable, Redshift
- ๋ฐ์ดํฐ ๊ตฌ์กฐ: Apache Parquet, Apache ORC (Optimized Row Columnar).
- ์ปฌ๋ผ๋จ์์ ํต๊ณ์ ๋ณด (์ด๊ฒ ํต์ฌ์ธ๊ฑฐ๊ฐ์)
- ์ปฌ๋ผ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ์ ํต๊ณ ์ ๋ณด(์: ์ต์๊ฐ, ์ต๋๊ฐ, ํฉ, ํ๊ท , ๋ฐ์ดํฐ ๋ถํฌ ๋ฑ)๋ฅผ ์ ์ฅํ๋ค.
- ์ด๋ฅผํตํด ์ต์ ํ๋ ๋ฐ์ดํฐ ์ก์ธ์ค๊ฐ ๊ฐ๋ฅํ๊ณ , ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ถํ ์ ์๋ค.
- ์กฐ๊ฑด์ ํธ์๋ค์ด(push-down)
- ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ๊ฐ๋ฅํ ํ ๋ฐ์ดํฐ์ ๊ฐ๊น์ด ๊ณณ์ผ๋ก "๋ด๋ ค๋ณด๋ด๋" ์ฟผ๋ฆฌ ์ต์ ํ ๊ธฐ์ ์ด๋ค.
- ์กฐ๊ฑด์ ํธ์๋ค์ด์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด, ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ CPU๋ก ๋ถ๋ฌ์ค๊ธฐ ์ ์ ์ ์ฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ด ๋จ์๋ก ์ ์ฅํ์ฌ, ํน์ ์ด์ ๋ํ ์ฐ์ฐ์ด๋ ์ง์(query)๋ฅผ ๋น ๋ฅด๊ฒ ์ํํ ์ ์๋ค.
Q. ์กฐ๊ฑด์ ํธ์๋ค์ด(push-down)์ ๋ํด ์กฐ๊ธ ๋ ์ดํดํด๋ณด์.
[์กฐ๊ฑด์ ํธ์๋ค์ด ์ดํดํ๊ธฐ]
๊ณ ๊ฐ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ customers ํ
์ด๋ธ์ด ์๊ณ , ํน์ ๋์(city)์ ์ฌ๋ ๊ณ ๊ฐ๋ค์ ์ด๋ฆ(name)์ ์กฐํํ๋ ์ฟผ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
-----------------------------------------------------------
SELECT name
FROM customers
WHERE city = 'Seoul';
-----------------------------------------------------------
์กฐ๊ฑด์ ํธ์๋ค์ด์ด ์ ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ์ ์ฟผ๋ฆฌ ๊ณผ์
- customers ํ ์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ค์บํ๋ค.
- ๊ฐ ๋ ์ฝ๋์ ๋ํด city = 'Seoul' ์กฐ๊ฑด์ ํ๊ฐํ๋ค.
- ์กฐ๊ฑด์ ๋ง๋ ๋ ์ฝ๋์์ name ํ๋๋ฅผ ์ถ์ถํ๋ค.
์กฐ๊ฑด์ ํธ์๋ค์ด์ด ์ ์ฉ ๋ ๊ฒฝ์ฐ์ ์ฟผ๋ฆฌ ๊ณผ์
- city ์ปฌ๋ผ์ ๋ํ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ city = 'Seoul' ์กฐ๊ฑด์ ํด๋นํ๋ ๋ ์ฝ๋๋ง ๋น ๋ฅด๊ฒ ์๋ณํ๋ค.
- ์ด ๋จ๊ณ์์, city ์ปฌ๋ผ์ ์ธ๋ฑ์ค๊ฐ ์๋ ๊ฒฝ์ฐ, ํด๋น ์ธ๋ฑ์ค๋ฅผ ํตํด ํ์ํ ๋ ์ฝ๋๋ง ์ ํ์ ์ผ๋ก ์ก์ธ์ค ํ๋ค.
- ์กฐ๊ฑด์ ๋ง๋ ๋ ์ฝ๋์์ name ํ๋๋ฅผ ์ถ์ถํ๋ค.
์ปฌ๋ผ๋จ์์ ํต๊ณ์ ๋ณด์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์์ด ์ฝ๊ธฐ ์ฟผ๋ฆฌ์ ํ์ฉ๋๋ค.
- ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ๊ฑด๋๋ฐ๊ธฐ: ์ฟผ๋ฆฌ๊ฐ ์์ฒญํ๋ ๊ฐ์ ๋ฒ์์ ๋งค์น๋์ง ์๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ(์: ํน์ ์ปฌ๋ผ์ ๊ฐ์ด ์ฟผ๋ฆฌ ์กฐ๊ฑด์ ๋ถํฉํ์ง ์๋ ๊ฒฝ์ฐ)๋ ์ค์บ ๋์์์ ์ ์ธ๋๋ค. ์๋ฅผ ๋ค์ด, "๋ ์ง" ์ปฌ๋ผ์ ๋ํ ์ฟผ๋ฆฌ๊ฐ ํน์ ๊ธฐ๊ฐ์ ๋ฐ์ดํฐ๋ง ์์ฒญํ๋ ๊ฒฝ์ฐ, ํด๋น ๊ธฐ๊ฐ ์ธ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ์ธ๊ทธ๋จผํธ๋ ์ฒ์๋ถํฐ ์ค์บํ์ง ์๋๋ค.
- ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋น ๋ฅธ ํํฐ๋ง: ์ปฌ๋ผ์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ ๊ฐ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์กฐ๊ฑด๊ณผ ์ผ์นํ์ง ์๋ ๋ ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ๊ฑธ๋ฌ๋ผ ์ ์์ต๋๋ค.
๋ํ ์๊ณ์ด ํ
์ด๋ธ(Time-Series Table)์ ๋ํด์๋ ์ธ๊ธํ๋ค.
์๋ง ํ๋ก๋ฉํ
์ฐ์ค๊ฐ ์์ด์ ์๊ณ์ด ํ
์ด๋ธ์ ์ธ๊ธํ๋๋ณด๋ค.
- ์๊ณ์ด ํ
์ด๋ธ(Time-Series Table)
- ์๊ฐ์ ๋ฐ๋ผ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ต์ ํ๋ ํ ์ด๋ธ ํํ๋ค.
- ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ๋ ํน์ ์๊ฐ์ ๋ฐ์ํ ์ด๋ฒคํธ๋ ์ธก์ ๊ฐ์ ๋ํ๋ด๋ฉฐ, ์๊ฐ์ ์ฃผ์ ์ฐจ์์ผ๋ก ์ฌ์ฉํ๋ค.
- ์๊ณ์ด ๋ฐ์ดํฐ๋ ์ฐ์์ ์ด๋ฉฐ, ์๊ฐ ์์๋๋ก ์ ๋ ฌ๋์ด ์๋ค.
- ์๊ณ์ด ๋ฐ์ดํฐ์ ํน์ง
- ์๊ฐ ๊ธฐ๋ฐ ์ธ๋ฑ์ฑ: ๋ฐ์ดํฐ๋ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ธ๋ฑ์ฑ๋๊ณ ์ ๋ ฌ๋๋ค. ์ด๋ ์๊ฐ ๋ฒ์ ์ฟผ๋ฆฌ์ ์์ฐจ์ ๋ฐ์ดํฐ ์ ๊ทผ์ ํจ์จ์ ์ผ๋ก ๋ง๋ ๋ค.
- ๋์ ์ฐ๊ธฐ ์ฒ๋ฆฌ๋: ๋๋ถ๋ถ์ ์๊ณ์ด ๋ฐ์ดํฐ๋ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์ง์์ ์ผ๋ก ์ถ๊ฐ๋๋ ํํ๋ก ๋ฐ์ํ๋ค. ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ด๋ฐ ํน์ฑ์ ๋ฐ์ํ์ฌ ๋์ ์ฐ๊ธฐ ์ฒ๋ฆฌ๋์ ์ง์ํ๋ค.
- ์๊ฐ ๊ธฐ๋ฐ ์ง์ ์ต์ ํ: ์๊ฐ ๋ฒ์ ์ ํ, ์๊ฐ ๋จ์๋ก ๋ฐ์ดํฐ ์ง๊ณ, ์๊ณ์ด ํจํด ํ์ ๋ฑ์ ์์ ์ด ์ต์ ํ๋์ด ์๋ค.
- ๋ฐ์ดํฐ ์์ถ๊ณผ ๋ณด์กด ์ ์ฑ
: ๋ฐฉ๋ํ ์์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ฐ์ดํฐ ์์ถ๊ณผ ์ค๋๋ ๋ฐ์ดํฐ์ ๋ํ ๋ณด์กด ์ ์ฑ
(์๋ ์ญ์ , ๋ค์ด์ํ๋ง ๋ฑ)์ ์ ๊ณตํ๋ค.
- ๋ํ์ ์ธ ์๊ณ์ด ํ
์ด๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค/์์คํ
- Prometheus
- TimescaleDB
- InfluxDB
- OpenTSDB