๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Apache Spark

[Infra] ๋ฐ์ดํ„ฐ ์ธํ”„๋ผ - Ingestion&Transformation(Event Streaming)

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ YouTube GeekNews ์ฑ„๋„์˜ ๋ฐ์ดํ„ฐ ์ธํ”„๋ผ ๊ฐ•์˜ ๋‚ด์šฉ์— ๊ธฐ๋ฐ˜ํ•ด ์ œ๊ฐ€ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ์ž‘์„ฑํ•จ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ฐ์ดํ„ฐ ์ธํ”„๋ผ ๊ตฌ์กฐ์—์„œ ์ฃผ๋กœ ETL ๋„๊ตฌ๋ฅผ ๋‹ค๋ฃจ๋Š” Ingestion & Transformation์— ํ•ด๋‹นํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ธ Event Streaming์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค ํ•œ๋‹ค.

 

ETL ๋„๊ตฌ ๋˜ ๋‹ค๋ฅธ ์š”์†Œ์ธ Event Streaming์„ ์•Œ์•„๋ณด์ž.

 

์šฐ์„  Event Streaming ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ? ์œ„ํ‚ค๋ฐฑ๊ณผ์— ๋”ฐ๋ฅด๋ฉด ์ •ํ™•ํžˆ Event Stream Processing์ด๋ž€, ์ด๋ฒคํŠธ ์ค‘์‹ฌ ์ •๋ณด์‹œ์Šคํ…œ์˜ ๊ตฌ์ถ•์„ ์ง€์›ํ•˜๋„๋ก ์„ค๊ณ„๋œ ์ผ๋ จ์˜ ๊ธฐ์ˆ ์ด๋ผ๊ณ  ์ •์˜ํ•œ๋‹ค. ๊ฒฐ๊ตญ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์˜๋ฏธํ•œ๋‹ค. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ธˆ์œต๊ธฐ๊ด€์ด ์ฃผ์‹์˜ ์‹œ์žฅ ๋ณ€ํ™”๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•œ๋‹ค๊ฑฐ๋‚˜ ์šด์†ก์ฐจ๋Ÿ‰, ๋†๊ธฐ๊ณ„์— ๋ถ™์–ด์žˆ๋Š” ์„ผ์„œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ๊ณ ์žฅ ์—ฌ๋ถ€๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํŠน์ • ์ƒํ™ฉ์— ์ด๋ ‡๊ฒŒ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ๋ถ„๋ช… ์กด์žฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์†Œ๊ฐœํ•  Event Streaming๋“ค์˜ ๋„๊ตฌ๋“ค์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์ด ์กด์žฌํ•˜๋Š” ๋„๊ตฌ๋“ค์ด๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ์ค‘์š”ํ• ๊นŒ? ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ(Availability) ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ์–ธ์ œ, ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋˜ ๋ˆ„๊ฐ€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ผ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ŠคํŠธ๋ฆฌ๋ฐ์€ '๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ์‹œ์ '๋ถ€ํ„ฐ ์‹œ๊ฐ„๊ณผ ์ฃผ์ฒด์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์šด Apache Spark์—๋„ Spark Streaming ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์กด์žฌํ•œ๋‹ค. ์ด๊ฒƒ๋„ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€? ์• ์„ํ•˜๊ฒŒ๋„ ์•„๋‹ˆ๋‹ค. ์ŠคํŒŒํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” Spark Streaming ์€ ์ •ํ™•ํ•˜๊ฒŒ Batch ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆฌ๋ฐ์ด๋‹ค. Batch ์ŠคํŠธ๋ฆฌ๋ฐ์ด๋ž€, ์ผ์ • ์‹œ๊ฐ„ ๋ฒ”์œ„ ๋‚ด์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋“ค๋งŒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.(๋งˆ์น˜ ๋จธ์‹ ๋Ÿฌ๋‹์„ ํ•™์Šต์‹œํ‚ฌ ๋•Œ Mini-batch๋กœ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค!) ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ํ•œ๊ณ„์ (?)์œผ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ํ•˜๋‚˜ ๋‹น ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

Apache Spark์—๋„ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ธฐ๋Šฅ์ด ์ œ๊ณต์€ ๋œ๋‹ค! ํ•˜์ง€๋งŒ...

 

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” Spark๊ฐ€ ํ•˜์ง€ ๋ชปํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์ฆ‰, Event Streaming์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ๋“ค์„ ์†Œ๊ฐœํ•˜๋ ค ํ•œ๋‹ค. ํ•˜๋‹จ์˜ ์ž๋ฃŒ๋Š” ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค Batch ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆฌ๋ฐ, ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ๋น„๊ตํ•˜๋Š” ๊ทธ๋ž˜ํ”„์ด๋‹ค.

 

์ถœ์ฒ˜: ๊ธฑ๋‰ด์Šค ์œ ํˆฌ๋ธŒ ๊ฐ•์˜์ž๋ฃŒ


Kafka์˜ ์ปจ์…‰์€? Pub / Sub Messaging !

์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ์— ๋งค์šฐ ์ ํ•ฉํ•œ Apache Kafka

 

ํ•„์ž๋„ ์˜ˆ์ „์— ์œ ํˆฌ๋ธŒ์˜ Dev์›์˜๋‹˜๊ป˜์„œ ์†Œ๊ฐœํ•˜์‹œ๋Š” Kafka ์˜์ƒ์„ ํ•œ๋ฒˆ ๋ณธ์ ์ด ์žˆ๋‹ค. ๋‹น์‹œ์—๋Š” "์ด๊ฒŒ ๋Œ€์ฒด ๋ฌด์Šจ ๋ง์ด์•ผ..?" ์‹ถ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์— ์•ฝ๊ฐ„์˜ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณด๊ณ  Kafka๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ์„ํ•˜๊ณ  ์–ด๋–ค ์žฅ์ ์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์กฐ๊ธˆ์€ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ตœ๊ทผ์— ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๋งŽ์€ ๊ธฐ์—…๋“ค์—์„œ ๊ฑฐ์˜ ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ฒฐ๊ตญ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ์ด ๋˜๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•ฑ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด์ž ํ”„๋ ˆ์ž„์›Œํฌ(๋˜๋Š” ํ”Œ๋žซํผ)์—ญํ• ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ฐธ๊ณ ๋กœ Kafka๋Š” Writing์— ์ตœ์ ํ™”๋œ ์‹œ์Šคํ…œ์ด๋ผ ๋ถˆ๋ฆฐ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง•์œผ๋กœ ๋ถˆ๋ฆฌ๊ฒŒ ๋œ ๊ณ„๊ธฐ์— ๋Œ€ํ•ด์„œ๋Š” Kafka๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์ด Kafka๋กœ ์ด๋ฆ„์„ ์ง€์€ ์ด์œ ์™€ ๊ด€๋ จ๋˜์–ด ์žˆ๋Š”๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ๊ฐ•์˜๋ฅผ ๋“ค์–ด๋ณด์ž! Kafka๊ฐ€ ๊ธฐ์ˆ ์ ์œผ๋กœ Writing ์ด๋ผ๋Š” ํŠน์ง•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ํ•˜๋‹จ์—์„œ ์•Œ์•„๋ณธ๋‹ค.

 

Kafka๋Š” Pub/Sub์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” Publishing/Subscribing Messaging ์ปจ์…‰์„ ๊ฐ–๊ณ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Kafka๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ Pub/Sub Messaging ๊ฐœ๋…์„ ์ดํ•ดํ•ด๋ณด์ž. 

 

์ถœ์ฒ˜: ๊ธฑ๋‰ด์Šค ์œ ํˆฌ๋ธŒ ๊ฐ•์˜์ž๋ฃŒ

 

์šฐ์„  ์œ„์™€ ๊ฐ™์ด ๋‘ ๊ฐœ์˜ ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž๋“ค์˜ ์ง€ํ‘œ(๋ฉ”ํŠธ๋ฆญ)์„ ์ˆ˜์ง‘ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋Ÿฐ๋ฐ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ ์ธํ”„๋ผ ๊ตฌ์กฐ์˜ ์ฒซ ๋ฒˆ์งธ ๊ตฌ์„ฑ์š”์†Œ์ธ Sources๋ฅผ ์•Œ์•„๋ณผ ๋•Œ ์‚ดํŽด๋ณด์•˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” Sources๋“ค์€ ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ 2๊ฐœ๋งŒ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ •๋ง ๋‹ค์–‘ํ•œ ์†Œ์Šค๋“ค๋กœ๋ถ€ํ„ฐ ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค.

 

์ถœ์ฒ˜: ๊ธฑ๋‰ด์Šค ์œ ํˆฌ๋ธŒ ๊ฐ•์˜์ž๋ฃŒ

 

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•œ ์†Œ์Šค๋“ค๋กœ๋ถ€ํ„ฐ ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ๊ฐ ์ง€ํ‘œ์— ๋งž๊ฒŒ ์ง€ํ‘œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” UI ๋‚˜ ์ง€ํ‘œ๋“ค์„ ๋ถ„์„ํ•˜๋Š” GA์™€ ๊ฐ™์€ ์„œ๋ฒ„ ๋“ฑ์œผ๋กœ ์ง€ํ‘œ ๋ฐ์ดํ„ฐ์˜ ์„ฑ๊ฒฉ์— ๋งž๊ฒŒ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฐœ์ƒํ•˜๋Š” ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ๋ณด๋‚ผ ๊ณณ์„ ๋ฐ”๋กœ 1:1 ๋งคํ•‘ํ•˜๊ฒŒ ๋˜๋ฉด ๋„ˆ๋ฌด ๋งŽ์•„์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ถœ์ฒ˜: ๊ธฑ๋‰ด์Šค ์œ ํˆฌ๋ธŒ ๊ฐ•์˜์ž๋ฃŒ

 

๋ฐฉ๊ธ‰ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์ ์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด Pub/Sub Messaging ์ปจ์…‰์ด ๋„์ž…๋œ๋‹ค. ์œ„ ๊ทธ๋ฆผ์„ ์˜ˆ์‹œ๋กœ ์‚ดํŽด๋ณด์ž. ๋‹ค์–‘ํ•œ ์„œ๋ฒ„์—์„œ ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๋“ค์ด ๋ฐœ์ƒํ•˜๊ณ  ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๋“ค์˜ ์„ฑ๊ฒฉ์— ๋งž๊ฒŒ ํ•˜๋‚˜์˜ Pub/Sub ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์„ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ   ๋ฐœ์ƒํ•˜๋Š” ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๋“ค ์ฆ‰, ๋ฉ”์‹œ์ง•๋“ค์„ Pub/Sub ์‹œ์Šคํ…œ์— ์ „๋‹ฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด Pub/Sub ์‹œ์Šคํ…œ์„ ๊ตฌ๋…(Subscribe) ํ•˜๋Š” ์ง€ํ‘œ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” UI, ์ง€ํ‘œ๋ฅผ ๋ถ„์„ํ•˜๋Š” GA์™€ ๊ฐ™์€ ์„œ๋ฒ„๋“ค์ด ์ง€ํ‘œ ๋ฐ์ดํ„ฐ๋“ค(๋ฉ”์‹œ์ง•)์„ ๋ฐ›์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

 

๊ฒฐ๊ตญ Pub/Sub ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์˜ 'Pub'์€ ๋‹ค์–‘ํ•œ ์„œ๋ฒ„๋“ค๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง•(์ง€ํ‘œ ๋ฐ์ดํ„ฐ)์„ ์ค‘์•™ ์‹œ์Šคํ…œ์œผ๋กœ 'Publishing' ํ•˜๊ณ  ํ•ด๋‹น ์ค‘์•™ ์‹œ์Šคํ…œ์„ 'Subscribing' ํ•˜๋Š” ์—ฌ๋Ÿฌ ์„œ๋ฒ„๋“ค(UI ์„œ๋ฒ„, ๋ถ„์„ ์„œ๋ฒ„ ๋“ฑ๋“ฑ)์ด ๋ฉ”์‹œ์ง•(์ง€ํ‘œ ๋ฐ์ดํ„ฐ)์„ ๋ฐ›์•„๊ฐ€๋Š” ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, ์นดํ”„์นด(Kafka)๋Š” ์œ„์™€ ๊ฐ™์ด ์ง€ํ‘œ ๋ฐ์ดํ„ฐ ์„ฑ๊ฒฉ์— ๋งž๊ฒŒ Pub/Sub ์‹œ์Šคํ…œ์„ ์—ฌ๋Ÿฌ๊ฐœ ๋‘๋Š” ๊ฒƒ๋„ ์‹ซ์–ด(?)ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ Pub/Sub ์‹œ์Šคํ…œ๋„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜๊ธฐ๋กœ ํ•œ๋‹ค. ์ด๊ฒƒ์ด Kafka ๊ธฐ๋Šฅ์˜ ์ถœ๋ฐœ์ ์ด๋‹ค.

 

์ถœ์ฒ˜ : Kafka์„ ์‰ฝ๊ฒŒ ๋‹ค๋ฃจ๋„๋ก ๋„์™€์ฃผ๋Š” Confluent


Kafka = 2๊ฐ€์ง€ ๋ชจ๋ธ

Kafka๋Š” 2๊ฐ€์ง€ ๋ชจ๋ธ์„ ํ•ฉ์ณค๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด 2๊ฐ€์ง€ ๋ชจ๋ธ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

1. Queuing

์ถœ์ฒ˜: ๊ธฑ๋‰ด์Šค ์œ ํˆฌ๋ธŒ ๊ฐ•์˜์ž๋ฃŒ

 

๋จผ์ € ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Source๋“ค์ธ Producer๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์„œ Queue ๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์— ๋จผ์ € ๋„ฃ๋Š”๋‹ค.(์ฐธ๊ณ ๋กœ Queue๋Š” ๋จผ์ € ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜๊ฐ€๋Š” FIFO(First-In-First-Out) ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅด๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค) ๊ทธ๋ฆฌ๊ณ  ํ์— ๋„ฃ์€ ๋ฐ์ดํ„ฐ๋“ค์„ Consumer(์ปจ์Šˆ๋จธ)๋“ค์ด ๋‹จ 'ํ•œ ๋ฒˆ์”ฉ'๋งŒ ํ๋ฅผ ์ฝ์–ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

2.Pub/Sub

์ถœ์ฒ˜: ๊ธฑ๋‰ด์Šค ์œ ํˆฌ๋ธŒ ๊ฐ•์˜์ž๋ฃŒ

 

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

 

์ด๋ ‡๊ฒŒ 2๊ฐ€์ง€ ๋ชจ๋ธ๋กœ ๊ตฌ์„ฑ๋œ ์นดํ”„์นด๋Š” ์ •๋ง ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ฌดํ•œ๋Œ€๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ์ „๋‹ฌ๋˜๋Š” ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ถ„์‚ฐ์ฒ˜๋ฆฌํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ์˜ ํŠน์ง•๋„ ์กด์žฌํ•œ๋‹ค.

 

์นดํ”„์นด๋Š” ์ฃผ๋กœ ์‹ค์‹œ๊ฐ„, ์›น, ๋กœ๊ทธ ๋ถ„์„, ๋ฉ”์‹œ์ง•, ํŠธ๋žœ์ ์…˜ ๊ทธ๋ฆฌ๊ณ  ์‹ฌ์ง€์–ด OLTP์˜ CDC๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ๋ฐ›๊ธฐ๋„ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์•ž์„œ ์ด์•ผ๊ธฐํ•œ ETL ๋„๊ตฌ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Sources ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ• ๊นŒ์ง€๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.


Kafka์˜ ๋‚ด๋ถ€ ์•„ํ‚คํ…์ฒ˜

์ด๋ฒˆ์—” Kafka์˜ ๋‚ด๋ถ€์ ์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ดํŽด๋ณด์ž. 

 

Kafka์˜ ๋‚ด๋ถ€ ์•„ํ‚คํ…์ฒ˜

 

  • Producer : ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ(์ง€ํ‘œ ๋ฐ์ดํ„ฐ)๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” Sources
  • Kafka broker : ์ผ์ข…์˜ ์„œ๋ฒ„๋ฅผ ์˜๋ฏธ
  • Topic : Kafka broker๋ผ๋Š” ์„œ๋ฒ„ ๋‚ด์— ์กด์žฌํ•˜๋Š” ํ…Œ์ด๋ธ”(๋ฐ์ดํ„ฐ)
  • push : Producer๊ฐ€ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Kafka broker ์„œ๋ฒ„์— ์ „์†ก ์ฆ‰, ๋ฉ”์‹œ์ง•์„ Publishing
  • pull : Kafka broker ์„œ๋ฒ„์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋“ค์„ Consumer๊ฐ€ ๊ฐ€์ ธ์˜ค๋Š” ์ฆ‰, ๋ฉ”์‹œ์ง•์„ Subscribing 

 

์œ„ ๊ทธ๋ฆผ์—์„œ ๋˜ ํ•˜๋‚˜ ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์€ Zookeeper Cluster์ด๋‹ค. ๊ทธ๋ฆผ์„ ์ž˜ ๋ณด๋ฉด ์ปจ์Šˆ๋จธ์™€ Kafka broker๋กœ๋ถ€ํ„ฐ Zookeeper Cluster๋กœ ํ–ฅํ•˜๋Š” ํ™”์‚ดํ‘œ๋“ค์ด ์žˆ๋‹ค. Zookeeper Cluster๋Š” ์šฐ์„  ์—ฌ๋Ÿฌ๊ฐœ์˜ Kafka broker๋ผ๋Š” ์„œ๋ฒ„๋“ค ์ค‘ ์–ด๋–ค ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜์–ด ์žˆ๊ณ  ์–ด๋–ค ์„œ๋ฒ„๊ฐ€ ๋“ฑ๋ก๋˜์–ด ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋˜ํ•œ ์ปจ์Šˆ๋จธ๋“ค์ด ์–ด๋–ค Topic์„ ๊ฐ€์ ธ๊ฐˆ์ง€ ๋“ฑ๋ก์„ ํ•˜๊ธฐ ์œ„ํ•œ ์—ญํ• ๋„ ํ•œ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ์— Zookeeper Cluster๊ฐ€ Kafka broker๋“ค์„ ๋‹ด๋Š” Kafka Cluster๋“ค๊ณผ ๋”ฐ๋กœ ์กด์žฌํ•˜๋‹ค๋ณด๋‹ˆ ์ค‘๋ณต, ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ Zookeeper Cluster ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์นดํ”„์นด ๋‚ด๋ถ€์—์„œ Zookeeper Cluster๋ฅผ ์œ„ํ•œ ์นดํ”„์นด๋ฅผ ๋˜ ํ˜•์„ฑํ•˜๋Š” ์ด๋ฅธ๋ฐ” "Kafka On Kafka"๋กœ ๊ฐœ์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

Zookeeper Cluster ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด Kafka On Kafka

 

๋‹ค์Œ์€ Producer๋“ค์ด ๋ฉ”์‹œ์ง•(๋ฐ์ดํ„ฐ)์„ Kafka broker๋กœ ์ „์†กํ•ด ์ด ๋ฉ”์‹œ์ง•๋“ค์ด Partition(ํŒŒํ‹ฐ์…˜)์œผ๋กœ ์ €์žฅ์ด ๋œ๋‹ค. ์ด ๋•Œ ํŒŒํ‹ฐ์…˜์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž.

 

Kafka ํŒŒํ‹ฐ์…˜์—์„œ ๋ฐ์ดํ„ฐ๋“ค์ด ์ €์žฅ๋œ๋‹ค.

 

(์œ„ ๊ทธ๋ฆผ์—์„œ TOPIC CLICK์€ 'ํด๋ฆญ' ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ํ…Œ์ด๋ธ”, TOPIC UPLOAD๋Š” '์—…๋กœ๋“œ' ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•œ๋‹ค.)

ํŒŒํ‹ฐ์…˜์„ ํ•œ ๊ฐœ๋กœ๋งŒ ์„ค์ •ํ•œ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์— ๊ณ„์†์ ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ์ง€์†๋˜๋ฉด ์†๋„๊ฐ€ ๋งค์šฐ ๋Š๋ ค์ง„๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒํ‹ฐ์…˜์„ ์—ฌ๋Ÿฌ๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ฐ ํŒŒํ‹ฐ์…˜์— ๋ฐ์ดํ„ฐ(๋ฉ”์„ธ์ง•)๋ฅผ Writeํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„ ์ €ํ•˜๊ฐ€ ์—†์–ด์ง„๋‹ค. ์ด ๋•Œ ์•„๊นŒ ๋ฌธ๋‘์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ Kafka์˜ "Writing ํŠน์„ฑ"์ด ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค.

 

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


Kafka APIs ์™€ Kafka๋ฅผ ์†”๋ฃจ์…˜์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋„๊ตฌ๋“ค

๋‹ค์Œ์€ Kafka๊ฐ€ ์ œ๊ณตํ•˜๋Š” API๋“ค์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ณ  ๋„˜์–ด๊ฐ€์ž

 

  • Admin API : Topic, Kafka broker, ์„œ๋ฒ„ ๋“ฑ์„ ๊ด€๋ฆฌ
  • Producer API : ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์—ญํ• 
  • Consumer API : ์ปจ์Šˆ๋จธ๋“ค์ด ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด๊ฐ€๋„๋ก ํ•˜๋Š” ์—ญํ• 
  • Kafka Streams API : Producer๊ฐ€ ๋งŒ๋“ค์–ด๋‚ธ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ŠคํŠธ๋ฆผ ํ”„๋กœ์„ธ์‹ฑ์„ ์ฒ˜๋ฆฌ
  • Kafka Connect API : ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ์—๋‹ค๊ฐ€ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ์™ธ๋ถ€ DB๋‚˜ ๋‹ค์–‘ํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์—ญํ• . ์ฆ‰, ์ด API ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด ETL ๋„๊ตฌ์˜ ์žฅ์ ์ด์—ˆ๋˜ ์†Œ์Šค๋ฅผ ๋Š˜๋ฆฌ๋Š” ๋ฐ ๊ธฐ์—ฌ

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

 

  • Confluent : ์นดํ”„์นด๋ฅผ ๋งŒ๋“  ๋ถ„๋“ค์ด ์ฐฝ์—…ํ•œ ํšŒ์‚ฌ์ด๋‹ค. ์ง์ ‘ ์นดํ”„์นด๋ฅผ ์ฐฝ์‹œํ•˜์‹  ๋ถ„๋“ค์ด๋ผ์„œ ๊ทธ๋Ÿฐ์ง€ ์นดํ”„์นด๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ค€ ์†”๋ฃจ์…˜ ๋„๊ตฌ์ด๋‹ค.
  • Apache Pulsar : ์•ผํ›„์—์„œ ๋งŒ๋“  ๋„๊ตฌ๋กœ, ๊ตฌ์„ฑ์ด ๊ฑฐ์˜ Confluent์™€ ๋น„์Šทํ•˜๋‹ค.
  • AWS Kinesis : ์•„๋งˆ์กด์ด ๋งŒ๋“  ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์ด๋‹ค. ์นดํ”„์นด๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋‹จ์ ์ธ ํŒŒํ‹ฐ์…˜์„ ์ค„์ผ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ๊ทน๋ณตํ•ด ์ƒค๋“œ(Kinesis์—์„œ๋Š” ์นดํ”„์นด์˜ ํŒŒํ‹ฐ์…˜์„ '์ƒค๋“œ'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค)๋ฅผ ๋Š˜์ด๊ณ  ์ค„์ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์†๋„์ ์ธ ์ธก๋ฉด์—์„œ ๋ณด์•˜์„ ๋•Œ ์นดํ”„์นด๊ฐ€ Kinesis ๋ณด๋‹ค ํ›จ์”ฌ ์„ฑ๋Šฅ์ด ๋น ๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค.
  • AWS MSK(Managed Streaming for Kafka): ์•„๋งˆ์กด์ด Kinesis๋ฅผ ๋งŒ๋“ค์—ˆ์ง€๋งŒ ์„ฑ๋Šฅ ์†๋„๊ฐ€ ์นดํ”„์นด์— ๋น„ํ•ด ๋งค์šฐ ๋Š๋ฆฌ๋‹ค๋Š” ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ˆ๋งŒ ์ง€๋ถˆํ•˜๋ฉด ํŽธํ•˜๊ฒŒ ์นดํ”„์นด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค.
๋ฐ˜์‘ํ˜•