Kubernetes์˜ Kafka๊ฐ€ ์ข‹์€๊ฐ€์š”?

์•ˆ๋…•ํ•˜์„ธ์š”, ํ•˜๋ธŒ๋ฅด!

ํ•œ๋•Œ ์šฐ๋ฆฌ๋Š” ์ด ์ฃผ์ œ๋ฅผ ๋Ÿฌ์‹œ์•„ ์‹œ์žฅ์— ์ฒ˜์Œ์œผ๋กœ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์นดํ”„์นด ๊ทธ๋ฆฌ๊ณ  ๊ณ„์† ๋”ฐ๋ฅด๋‹ค ๊ฐœ๋ฐœ์„ ์œ„ํ•ด. ํŠนํžˆ Kafka์™€ Kubernetes. ๊ด€์ฐฐ ๊ฐ€๋Šฅ(๊ทธ๋ฆฌ๊ณ  ๋งค์šฐ ์ฃผ์˜๊นŠ์Œ) ๊ธฐ์‚ฌ ์ด ์ฃผ์ œ๋Š” ์ž‘๋…„ XNUMX์›” Gwen Shapira์˜ ์ €์ž‘์œผ๋กœ Confluent ๋ธ”๋กœ๊ทธ์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์šฐ๋ฆฌ๋Š” ์š”ํ•œ ๊ฐ€์ด๊ฑฐ(Johann Gyger)๊ฐ€ ์“ด XNUMX์›”์˜ ์ตœ์‹  ๊ธฐ์‚ฌ์— ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ์„ ๋Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” ์ œ๋ชฉ์— ๋ฌผ์Œํ‘œ๊ฐ€ ์—†์ง€๋Š” ์•Š์ง€๋งŒ ํฅ๋ฏธ๋กœ์šด ๋งํฌ์™€ ํ•จ๊ป˜ ํ…์ŠคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•˜์—ฌ ๋ณด๋‹ค ์‹ค์งˆ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ฃผ์ œ๋ฅผ ์กฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด โ€œchaos Monkeyโ€์˜ ๋ฌด๋ฃŒ ๋ฒˆ์—ญ์„ ์šฉ์„œํ•ด์ฃผ์„ธ์š”!

Kubernetes์˜ Kafka๊ฐ€ ์ข‹์€๊ฐ€์š”?

์†Œ๊ฐœ

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

๋ฐ˜๋ฉด Kafka๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ„์‚ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์—…ํ•  ๋•Œ ์ƒํƒœ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ ์ด๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ณด๋‹ค ํ›จ์”ฌ ๋ฌด๊ฒ์Šต๋‹ˆ๋‹ค. Kubernetes๋Š” ์ƒํƒœ ์ €์žฅ ๋กœ๋“œ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ Kelsey Hightower๊ฐ€ ๋‘ ๊ฐœ์˜ ํŠธ์œ—์—์„œ ์ง€์ ํ–ˆ๋“ฏ์ด ์ฃผ์˜ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์‚ฌ๋žŒ๋“ค์€ Kubernetes๋ฅผ ์ƒํƒœ ์ €์žฅ ์›Œํฌ๋กœ๋“œ์— ์ถ”๊ฐ€ํ•˜๋ฉด RDS์— ํ•„์ ํ•˜๋Š” ์™„์ „ ๊ด€๋ฆฌํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ถฉ๋ถ„ํžˆ ์—ด์‹ฌํžˆ ์ผํ•˜๊ณ  ์ถ”๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  SRE ์—”์ง€๋‹ˆ์–ด ํŒ€์„ ์œ ์น˜ํ•œ๋‹ค๋ฉด Kubernetes ์œ„์— RDS๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋ ‡๋‹ค๋ฉด Kubernetes์—์„œ Kafka๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ• ๊นŒ์š”? ๋ฐ˜๋Œ€ ์งˆ๋ฌธ: Kafka๋Š” Kubernetes ์—†์ด ๋” ์ž˜ ์ž‘๋™ํ• ๊นŒ์š”? ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด ๊ธฐ์‚ฌ์—์„œ Kafka์™€ Kubernetes๊ฐ€ ์„œ๋กœ ์–ด๋–ป๊ฒŒ ๋ณด์™„ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋‘˜์„ ๊ฒฐํ•ฉํ•  ๋•Œ ์–ด๋–ค ์œ„ํ—˜์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ์ด์œ ์ž…๋‹ˆ๋‹ค.

์™„๋ฃŒ ์‹œ๊ฐ„

๊ธฐ๋ณธ์ ์ธ ๊ฒƒ, ์ฆ‰ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ ์ž์ฒด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ด…์‹œ๋‹ค.

ะŸั€ะพั†ะตัั

Kafka ๋ธŒ๋กœ์ปค๋Š” CPU ์นœํ™”์ ์ž…๋‹ˆ๋‹ค. TLS๋Š” ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Kafka ํด๋ผ์ด์–ธํŠธ๋Š” ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ CPU๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋ธŒ๋กœ์ปค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ์–ต

Kafka ๋ธŒ๋กœ์ปค๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์†Œ๋ชจํ•ฉ๋‹ˆ๋‹ค. JVM ํž™ ํฌ๊ธฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 4-5GB๋กœ ์ œํ•œ๋˜์ง€๋งŒ Kafka๋Š” ํŽ˜์ด์ง€ ์บ์‹œ๋ฅผ ๋งค์šฐ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋งŽ์€ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Kubernetes์—์„œ๋Š” ์ด์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค์™€ ์š”์ฒญ ์ œํ•œ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

์ปจํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์€ ์ผ์‹œ์ ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. Kafka ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค emptyDir, ํšจ๊ณผ๋Š” ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ ํ›„ ๋ธŒ๋กœ์ปค ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๋ฉ”์‹œ์ง€๋Š” ์—ฌ์ „ํžˆ ๋‹ค๋ฅธ ๋ธŒ๋กœ์ปค์— ๋ณต์ œ๋ณธ์œผ๋กœ ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ์‹œ์ž‘ ํ›„ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ธŒ๋กœ์ปค๋Š” ๋จผ์ € ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•ด์•ผ ํ•˜๋ฉฐ ์ด ๊ณผ์ •์—๋Š” ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ์žฅ๊ธฐ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. XFS ํŒŒ์ผ ์‹œ์Šคํ…œ ๋˜๋Š” ๋” ์ •ํ™•ํ•˜๊ฒŒ๋Š” ext4๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋กœ์ปฌ ์žฅ๊ธฐ ์ €์žฅ์†Œ๋กœ ๋‘์‹ญ์‹œ์˜ค. NFS๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๋‹น์‹ ์—๊ฒŒ ๊ฒฝ๊ณ ํ–ˆ๋‹ค. NFS ๋ฒ„์ „ v3 ๋˜๋Š” v4๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, NFS์˜ "์–ด๋ฆฌ์„์€ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ" ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†์œผ๋ฉด Kafka ๋ธŒ๋กœ์ปค๊ฐ€ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค. ์•„์ง ์„ค๋“ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ์•„์ฃผ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ด ๊ธฐ์‚ฌ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”. Kubernetes๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘ ๋˜๋Š” ์žฌ๋ฐฐ์น˜ ํ›„ ์ƒˆ ๋…ธ๋“œ๋ฅผ ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋Š” ๋กœ์ปฌ์ด ์•„๋‹ˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ

๋Œ€๋ถ€๋ถ„์˜ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Kafka์˜ ์„ฑ๋Šฅ์€ ๋„คํŠธ์›Œํฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ตœ์†Œ๋กœ ์œ ์ง€ํ•˜๊ณ  ๋Œ€์—ญํญ์„ ์ตœ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํฌ๊ฒŒ ์ขŒ์šฐ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ๋ชจ๋“  ๋ธŒ๋กœ์ปค๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ€์šฉ์„ฑ์ด ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค. Kubernetes ๋…ธ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ „์ฒด Kafka ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Kafka ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ „์ฒด ๋ฐ์ดํ„ฐ ์„ผํ„ฐ์— ๋ถ„์‚ฐ์‹œํ‚ค์ง€ ๋งˆ์‹ญ์‹œ์˜ค. Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ข‹์€ ์ ˆ์ถฉ์•ˆ์€ ๋‹ค๋ฅธ ๊ฐ€์šฉ์„ฑ ์˜์—ญ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ตฌ์„ฑ

์ •๊ธฐ ์„ ์–ธ๋ฌธ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์›น์‚ฌ์ดํŠธ์—๋Š” ์•„์ฃผ ์ข‹์€ ๊ฐ€์ด๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ZooKeeper๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”. ZooKeeper๋Š” Kafka์˜ ์ผ๋ถ€์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์ ์šฉ๋˜๋Š” Kubernetes ๊ฐœ๋…์„ ์ตํžˆ๊ธฐ์— ์ข‹์€ ๊ณณ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์ดํ•ดํ•˜๋ฉด Kafka ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋„ ๋™์ผํ•œ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์— ์šœ๋ฆฐ Kubernetes์—์„œ Kafka๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ํฌ๊ด„์ ์ธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์„ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํˆฌ๊ตฌ ์ฐจํŠธ

Helm์€ yum, apt, Homebrew ๋˜๋Š” Chocolatey์™€ ๊ฐ™์€ OS ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์™€ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” Kubernetes์šฉ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๋‹ค. Helm ์ฐจํŠธ์— ์„ค๋ช…๋œ ์‚ฌ์ „ ์ •์˜๋œ ์†Œํ”„ํŠธ์›จ์–ด ํŒจํ‚ค์ง€๋ฅผ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ์„ ํƒ๋œ Helm ์ฐจํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Kubernetes์—์„œ Kafka๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์–ด๋ ค์šด ์ž‘์—…์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ Kafka ๋‹ค์ด์–ด๊ทธ๋žจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ธํ๋ฒ ์ดํ„ฐ ์ƒํƒœ์—์„œ, ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ง€๋ฅ˜, ํ•˜๋‚˜ ๋” - ์—์„œ Bitnami.

์—ฐ์‚ฐ์ž

Helm์—๋Š” ํŠน์ • ๋‹จ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋˜ ๋‹ค๋ฅธ ๋„๊ตฌ์ธ Kubernetes Operator๊ฐ€ ์ƒ๋‹นํ•œ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šด์˜์ž๋Š” Kubernetes์šฉ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํŒจํ‚ค์ง•ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋Ÿฌํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชฉ๋ก ๋†€๋ผ์šด ์šด์˜์ž Kafka์˜ ๋‘ ์—ฐ์‚ฐ์ž๊ฐ€ ์–ธ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค ์ค‘ ํ•˜๋‚˜ - ์ŠคํŠธ๋ฆผ์ง€. Strimzi๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Kafka ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ช‡ ๋ถ„ ๋งŒ์— ์‰ฝ๊ฒŒ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์šด์˜์ž ์ž์ฒด๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์ง€์  ๊ฐ„ TLS ์•”ํ˜ธํ™”์™€ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Confluent๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ž์ฒด ์šด์˜์ž.

ะŸั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ

Kafka ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฒค์น˜๋งˆํ‚นํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์ž ์žฌ์ ์ธ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ์ฐพ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ Kafka๋Š” ์ด๋ฏธ ๋‘ ๊ฐ€์ง€ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. kafka-producer-perf-test.sh ะธ kafka-consumer-perf-test.sh. ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์„ธ์š”. ์ฐธ๊ณ ๋กœ ์— ์„ค๋ช…๋œ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒŒ์‹œ๋ฌผ Jay Kreps ๋˜๋Š” ์ง‘์ค‘ ์ด ๋ฆฌ๋ทฐ Stรฉphane Maarek์˜ Amazon MSK.

์šด์˜

๋ชจ๋‹ˆํ„ฐ๋ง

์‹œ์Šคํ…œ์˜ ํˆฌ๋ช…์„ฑ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹œ์Šคํ…œ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ ์Šคํƒ€์ผ๋กœ ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ œ๊ณตํ•˜๋Š” ๊ฒฌ๊ณ ํ•œ ํˆดํ‚ท์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชฉ์ ์„ ์œ„ํ•ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๋„๊ตฌ๋Š” Prometheus์™€ Grafana์ž…๋‹ˆ๋‹ค. Prometheus๋Š” JMX ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ชจ๋“  Java ํ”„๋กœ์„ธ์Šค(Kafka, Zookeeper, Kafka Connect)์—์„œ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. cAdvisor ๋ฉ”ํŠธ๋ฆญ์„ ์ถ”๊ฐ€ํ•˜๋ฉด Kubernetes์—์„œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋” ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Strimzi์—๋Š” Kafka์šฉ Grafana ๋Œ€์‹œ๋ณด๋“œ์˜ ๋งค์šฐ ํŽธ๋ฆฌํ•œ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ณต์ œ๋˜์ง€ ์•Š์€ ์„นํ„ฐ ๋˜๋Š” ์˜คํ”„๋ผ์ธ์ธ ์„นํ„ฐ์— ๋Œ€ํ•œ ์ฃผ์š” ์ง€ํ‘œ๋ฅผ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๋งค์šฐ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ง€ํ‘œ๋Š” ๋ฆฌ์†Œ์Šค ํ™œ์šฉ๋„, ์„ฑ๋Šฅ ์ •๋ณด, ์•ˆ์ •์„ฑ ์ง€ํ‘œ๋กœ ๋ณด์™„๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ Kafka ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๋ฌด๋ฃŒ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

Kubernetes์˜ Kafka๊ฐ€ ์ข‹์€๊ฐ€์š”?

์ถœ์ฒ˜ : streamzi.io/docs/master/#kafka_dashboard

ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‹ˆํ„ฐ๋ง(์†Œ๋น„์ž ๋ฐ ์ƒ์‚ฐ์ž์— ๋Œ€ํ•œ ์ธก์ •ํ•ญ๋ชฉ)๊ณผ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง(์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค)์œผ๋กœ ์ด ๋ชจ๋“  ๊ฒƒ์„ ๋ณด์™„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตด) ๋ฐ ์—”๋“œํˆฌ์—”๋“œ ๋ชจ๋‹ˆํ„ฐ๋ง - ์ด ์šฉ๋„๋กœ ์‚ฌ์šฉ ์นดํ”„์นด ๋ชจ๋‹ˆํ„ฐ.

๋ฒŒ์ฑ„ ๋ฐ˜์ถœ

๋กœ๊น…์€ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. Kafka ์„ค์น˜์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์Œ์— ๊ธฐ๋ก๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. stdout ะธ stderr, ๋˜ํ•œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋ชจ๋“  ๋กœ๊ทธ๋ฅผ ์ค‘์•™ ๋กœ๊น… ์ธํ”„๋ผ์— ์ง‘๊ณ„ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํƒ„์„ฑ ๊ฒ€์ƒ‰.

๊ธฐ๋Šฅ ์ ๊ฒ€

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

์—…๋ฐ์ดํŠธ ์ถœ์‹œ

StatefulSet๋Š” ์ž๋™ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. RollingUpdate ์ „๋žต์„ ์„ ํƒํ•˜๋ฉด Kafka ์•„๋ž˜์˜ ๊ฐ ์ „๋žต์ด ์ฐจ๋ก€๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋™ ์ค‘์ง€ ์‹œ๊ฐ„์„ XNUMX์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์ผ€์ผ๋ง

Kafka ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Pod๋ฅผ ํŠน์ • ์ˆ˜์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ์‰ฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์›ํ•˜๋Š” ๋งŒํผ Kafka ๋ธŒ๋กœ์ปค๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ฐ€์žฅ ์–ด๋ ค์šด ์ ์€ ํ™•์žฅ ํ›„ ๋˜๋Š” ์ถ•์†Œํ•˜๊ธฐ ์ „์— ์„นํ„ฐ๋ฅผ ๋‹ค์‹œ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋„ Kubernetes๊ฐ€ ์ด ์ž‘์—…์— ๋„์›€์„ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ด€๋ฆฌ

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

๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ

์ด์ œ Kafka์˜ ๊ฐ€์šฉ์„ฑ์€ Kubernetes์˜ ๊ฐ€์šฉ์„ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์ตœ์•…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” Kafka ํด๋Ÿฌ์Šคํ„ฐ๋„ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋จธํ”ผ์˜ ๋ฒ•์น™์— ๋”ฐ๋ฅด๋ฉด ์ด๋Ÿฐ ์ผ์ด ๋ฐ˜๋“œ์‹œ ๋ฐœ์ƒํ•˜๊ณ  ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์œ„ํ—˜์„ ์ค„์ด๋ ค๋ฉด ์ข‹์€ ๋ฐฑ์—… ๊ฐœ๋…์„ ๊ฐ–์ถ”์‹ญ์‹œ์˜ค. MirrorMaker๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๋Œ€๋กœ S3๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐํŽธ ์ž˜๋ž€๋„ ์ถœ์‹ .

๊ฒฐ๋ก 

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

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€