๊ธฐ์ˆ  ์กฐ์‚ฌ - ELK

๊ฐœ์š”

  • JSON ๊ธฐ๋ฐ˜์˜ ๋ถ„์‚ฐํ˜• ๊ฒ€์ƒ‰ ์—”์ง„

Apache Lucene๋ผ๋Š” Java ๊ฒ€์ƒ‰ ์—”์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

ํ•˜์ง€๋งŒ Apache Lucene๋Š” ๋„ˆ๋ฌด ์ €์ˆ˜์ค€ ๋„๊ตฌ๋“ค์ด๋ผ ์ง์ ‘ ํ™œ์šฉํ•˜๊ธฐ ํž˜๋“ฆ.

๋”ฐ๋ผ์„œ Lucene์„ ๋‚ด๋ถ€ ์—”์ง„์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด์„œ REST API, ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ, ํด๋Ÿฌ์Šคํ„ฐ๋ง, JSON๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๋Œ€์‹œ๋ณด๋“œ ์—ฐ๋™ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ณ ์ˆ˜์ค€ ํ”Œ๋žซํผ

์ž‘๋™ ์›๋ฆฌ(๊ฐ„๋‹จํžˆ)

  1. ๋ฐ์ดํ„ฐ ์ €์žฅ
    1. Jsonํ˜•์‹์˜ ๋ฌธ์„œ๋ฅผ elasticsearch์— ์ „์†ก
    2. ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹จ์–ด(ํ† ํฐ)๋กœ ์ชผ๊ฐฌ โ†’ ์—ญ์ƒ‰์ธ ๊ตฌ์กฐ๋กœ ์ €์žฅ
  2. ๊ฒ€์ƒ‰ํ•  ๋•Œ
    1. ์‚ฌ์šฉ์ž์˜ ๊ฒ€์ƒ‰ ํ‚ค์›Œ๋“œ ๋˜ํ•œ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ชผ๊ฐฌ
    2. ์—ญ์ƒ‰์ธ์„ ์กฐํšŒํ•ด ํ•ด๋‹น ํ‚ค์›Œ๋“œ๋ฅผ ํฌํ•จํ•œ ๋ฌธ์„œ ID๋ฅผ ์ฐพ์•„๋ƒ„

์—ญ์ƒ‰์ธ ๊ตฌ์กฐ

๋‹จ์–ด โ†’ ๋ฌธ์„œ๋ฅผ ์—ฐ๊ฒฐํ•ด ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ

ex)

๋ฌธ์„œ 1 : ์‚ผ์„ฑ์ „์ž ์ฃผ๊ฐ€ ์ƒ์Šน

๋ฌธ์„œ 2 : ์• ํ”Œ ์ฃผ๊ฐ€ ํ•˜๋ฝ

"์‚ผ์„ฑ์ „์ž" -> [๋ฌธ์„œ 1]
"์ฃผ๊ฐ€" -> [๋ฌธ์„œ 1, ๋ฌธ์„œ 2]
"์ƒ์Šน" -> [๋ฌธ์„œ 1]
"ํ•˜๋ฝ" -> [๋ฌธ์„œ 2]
  • (๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ์˜€์ง€๋งŒ, ๋‹น์—ฐํžˆ ์ œ๋ชฉ๋งŒ์„ ์—ญ์ƒ‰์ธํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.)
  • ํ•œ๊ธ€์€ ์˜์–ด๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋„์›Œ์“ฐ๊ธฐ ๋‹จ์œ„๋กœ ์ž๋ฅด๋Š” ๊ฒƒ ๋ณด๋‹ค ํ›จ์”ฌ ๊ณ ์ˆ˜์ค€์˜ โ€œํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐโ€๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์šฉ์–ด

๊ฐœ๋…์„ค๋ช…
๋ฌธ์„œ
document
๊ฒ€์ƒ‰ํ•  ๋ฐ์ดํ„ฐ ํ•œ ๊ฑด
์ธ๋ฑ์Šค
index
๋ฌธ์„œ๋“ค์ด ๋ชจ์ธ ๊ณต๊ฐ„
DB์˜ ํ…Œ์ด๋ธ” ๋А๋‚Œ
ํ•„๋“œ
field
๋ฌธ์„œ ๋‚ด ๋ฐ์ดํ„ฐ ์†์„ฑ
title, content, โ€ฆ
๋งคํ•‘๊ฐ ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ •์˜
text, keyword, data
์—ญ์ƒ‰์ธ
inverted index
ํ…์ŠคํŠธ โ†’ ๋‹จ์–ด โ†’ ๋ฌธ์„œ ID ์—ฐ๊ฒฐ, ๋น ๋ฅธ ๊ฒ€์ƒ‰์˜ ํ•ต์‹ฌ

2. Kibana

๊ฐœ์š”

  • Elasticsearch ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋Œ€์‹œ๋ณด๋“œ ๋„๊ตฌ.
  • ์‚ฌ์šฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ Kibana๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ , ๊ฒ€์ƒ‰ํ•˜๊ณ , ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ญํ• 

  • ๐Ÿ“Š ๋Œ€์‹œ๋ณด๋“œ ์ƒ์„ฑ
  • ๐Ÿ” ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰/ํ•„ํ„ฐ๋ง
  • ๐Ÿงพ ๋กœ๊ทธ ํƒ์ƒ‰
  • โš™๏ธ ์ธ๋ฑ์Šค ๊ด€๋ฆฌ (ํŒจํ„ด์œผ๋กœ ์„ค์ • ๊ฐ€๋Šฅ)

3. Logstash

๊ฐœ์š”

  • ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ๊ฐ€๊ณต ๋„๊ตฌ
  • ๋กœ๊ทธ, ์ด๋ฒคํŠธ, ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์œผ๋กœ ์ „์†ก

์—ญํ• 

  1. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ (Input) ๋‹ค์–‘ํ•œ ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ (ํŒŒ์ผ, HTTP, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋ฉ”์‹œ์ง€ ํ ๋“ฑ)

  2. ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ (Filter)
    ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋งํ•˜๊ณ , ํ˜•์‹์„ ๋ฐ”๊พธ๊ฑฐ๋‚˜, ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋“ฑ ๊ฐ€๊ณต์„ ํ•จ.

  3. ๋ฐ์ดํ„ฐ ์ „์†ก (Output) ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ Elasticsearch๋‚˜ ๋‹ค๋ฅธ ์ €์žฅ์†Œ๋กœ ์ „์†กํ•จ.

4. ๊ธฐํƒ€ ๊ธฐ์ˆ 

4-1. Fluentd

  • Fluentd๋Š” ๋‹ค์–‘ํ•œ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์›ํ•˜๋Š” ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ชฉ์ ์ง€๋กœ ์ „๋‹ฌํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ธฐ
  • Logstash์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
[๋‰ด์Šค API] โ†’ [Fluentd] โ†’ [Elasticsearch]
                           โ†˜ [ํŒŒ์ผ ์ €์žฅ]
                           โ†˜ [MongoDB]

๊ตฌ์„ฑ ์š”์†Œ

๊ตฌ์„ฑ ์š”์†Œ์„ค๋ช…
Input๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์„œ ์ˆ˜์ง‘ํ• ์ง€ (์˜ˆ: HTTP, ํŒŒ์ผ, Kafka ๋“ฑ)
Filter๋ฐ์ดํ„ฐ ๊ฐ€๊ณต/์ •์ œ (ํ•„๋“œ ์ œ๊ฑฐ, ํ˜•์‹ ๋ณ€๊ฒฝ ๋“ฑ)
Output๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””๋กœ ๋ณด๋‚ผ์ง€ (์˜ˆ: Elasticsearch, DB, ํŒŒ์ผ ๋“ฑ)

vs. Logstash

ํ•ญ๋ชฉLogstashFluentd
์†Œ์†Elastic StackCNCF (Cloud Native Computing Foundation)
๋ชฉ์ Elasticsearch์™€ ์—ฐ๋™ ์ตœ์ ํ™”๋‹ค์–‘ํ•œ ๋ชฉ์ (ES, DB, Kafka ๋“ฑ) ์ง€์›
์„ฑ๋Šฅ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ๋ฌด๊ฒ๊ณ  ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ํผ๊ฐ€๋ณ๊ณ  ํšจ์œจ์  (ํŠนํžˆ Fluent Bit)
ํ™•์žฅ์„ฑ๊ณ ๊ธ‰ ํŒŒ์‹ฑ/ํ•„ํ„ฐ๋ง(grok ๋“ฑ) ๊ฐ•์ ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ƒํƒœ๊ณ„
์„ค์ • ๋ฐฉ์‹.confย (์ค‘์ฒฉ X, ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ).confย ๋˜๋Š”ย .yamlย (์ค‘์ฒฉ ๊ตฌ์กฐ ์ง€์›)
UIKibana ๋“ฑ์œผ๋กœ ์—ฐ๋™ ๊ฐ€๋ŠฅUI ์—†์Œ (์™ธ๋ถ€ ํˆด ํ•„์š”)
ํ•™์Šต ๋‚œ์ด๋„๋น„๊ต์  ์‰ฌ์›€๊ตฌ์กฐ ์ดํ•ด ํ•„์š”, ์กฐ๊ธˆ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ
์šฉ๋„ ์ถ”์ฒœElastic Stack ์ค‘์‹ฌย ์‹œ์Šคํ…œํด๋ผ์šฐ๋“œ/๋ฉ€ํ‹ฐ ๋กœ๊ทธ ์†Œ์Šคย ํ†ตํ•ฉ ๊ด€๋ฆฌ