Skip to content

ksh24865/elastic-stack-study

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

57 Commits
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Elastic-stack-study

Table of contents

1_ ELK Stack

  • ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋ฒ„๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฐ ๋กœ๊ทธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ฒ€์ƒ‰, ๋ถ„์„ํ•˜์—ฌ ์‹œ๊ฐํ™” ์‹œํ‚ค๋Š” ์˜คํ”ˆ์†Œ์Šค ์„œ๋น„์Šค
  • Elastic Search + Logstash + Kibana + Filebeat

2. ELK Stack์˜ ๊ตฌ์„ฑ์š”์†Œ

2_1 Elastic search

  • ๊ธฐ๋Šฅ

    • ํ™•์žฅ์„ฑ์ด ๋งค์šฐ ์ข‹์€ ์˜คํ”ˆ์†Œ์Šค ๊ฒ€์ƒ‰์—”์ง„
    • Lucene ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์ด๋‹ค.
    • ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ์†ํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ €์žฅ, ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์‹ฌ๋ถ€์— ์ €์žฅํ•˜์—ฌ ์˜ˆ์ƒ๋˜๋Š” ํ•ญ๋ชฉ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ•ญ๋ชฉ์„ ๋ฐํ˜€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    • ์ •ํ˜•, ๋น„์ •ํ˜•, ์œ„์น˜์ •๋ณด, ๋ฉ”ํŠธ๋ฆญ ๋“ฑ ์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ‘œ์ค€ RESTful API์™€ JSON์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ฐœ๋…์ •๋ฆฌ

  1. full text ๊ฒ€์ƒ‰

    • ๊ด€๊ณ„ํ˜• DB์—์„œ๋Š” Text ์—ด์„ ํ•œ ์ค„์”ฉ ์ฐพ์•„ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ณ  ์—†์œผ๋ฉด ๋„˜์–ด๊ฐ.

      • row ์•ˆ์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ฝ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์†๋„๊ฐ€ ๋А๋ฆผ.
    • ์—ญ ์ธ๋ฑ์Šค(Inverted Index)๋ผ๋Š” ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. (ํ•ด๋‹น ํ‚ค์›Œ๋“œ๊ฐ€ ์–ด๋–ค doc์— ์žˆ๋‹ค๊ณ  ์ €์žฅํ•œ๋‹ค.)

      • ์ฑ…์˜ ๋งจ ๋’ค ์ฃผ์š” ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ๋ช‡ ํŽ˜์ด์ง€์— ์žˆ๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ฐพ์•„๋ณด๊ธฐ ํŽ˜์ด์ง€์™€ ์œ ์‚ฌ.
      • ์ถ”์ถœ๋œ ๊ฐ ํ‚ค์›Œ๋“œ๋ฅผ ํ…€(term) ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ์ด๋ ‡๊ฒŒ ์—ญ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด term์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋„ํ๋จผํŠธ๋“ค์˜ id๋ฅผ ๋ฐ”๋กœ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ.
      • ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์‹œ ์ฝ์–ด์•ผ ํ•  ํ–‰์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ญ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” id์˜ ๋ฐฐ์—ด๊ฐ’์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ํฐ ์†๋„์˜ ์ €ํ•˜ ์—†์ด ๋น ๋ฅธ ์†๋„๋กœ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅ
      image (7)
    • ํ…์ŠคํŠธ ๋ถ„์„(Text Analysis)

      • ๋ฌธ์ž์—ด ํ•„๋“œ๊ฐ€ ์ €์žฅ๋  ๋•Œ ๋ฐ์ดํ„ฐ์—์„œ ๊ฒ€์ƒ‰์–ด ํ† ํฐ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์ฒ˜๋ฆฌ ๊ณผ์ •
    • ์• ๋„๋ผ์ด์ €(Analyzer)
      • ํ…์ŠคํŠธ๋ถ„์„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ
      • 0-3๊ฐœ์˜ ์บ๋ฆญํ„ฐ ํ•„ํ„ฐ(Character Filter)์™€ 1๊ฐœ์˜ ํ† ํฌ๋‚˜์ด์ €(Tokenizer), ๊ทธ๋ฆฌ๊ณ  0-n๊ฐœ์˜ ํ† ํฐ ํ•„ํ„ฐ(Token Filter)๋กœ ์ด๋ฃจ์–ด์ง.
      • _analyze API
        • ๋ถ„์„๋œ ๋ฌธ์žฅ์„ _analyze API๋ฅผ ์ด์šฉํ•ด์„œ ํ™•์ธ
        • ํ† ํฌ๋‚˜์ด์ €๋Š” tokenizer, ํ† ํฐ ํ•„ํ„ฐ๋Š” filter ํ•ญ๋ชฉ์˜ ๊ฐ’์œผ๋กœ ์ž…๋ ฅ
        • ํ† ํฌ๋‚˜์ด์ €๋Š” ํ•˜๋‚˜๋งŒ ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ ์ž…๋ ฅํ•˜๊ณ , ํ† ํฐํ•„ํ„ฐ๋Š” ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— [ ] ์•ˆ์— ๋ฐฐ์—ด ํ˜•์‹์œผ๋กœ ์ž…๋ ฅ
      • Term ์ฟผ๋ฆฌ
        • match ์ฟผ๋ฆฌ์™€ ๋ฌธ๋ฒ•์€ ์œ ์‚ฌํ•˜์ง€๋งŒ term ์ฟผ๋ฆฌ๋Š” ์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด๋Š” ์• ๋„๋ผ์ด์ €๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž…๋ ฅ๋œ ๊ฒ€์ƒ‰์–ด ๊ทธ๋Œ€๋กœ ์ผ์น˜ํ•˜๋Š” ํ…€์„ ์ฐพ์Œ.
      • ์‚ฌ์šฉ์ž ์ •์˜ ์• ๋„๋ผ์ด์ € - Custom Analyzer
        • _analyze API๋กœ ์• ๋„๋ผ์ด์ €, ํ† ํฌ๋‚˜์ด์ €, ํ† ํฐํ•„ํ„ฐ๋“ค์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์ธ๋ฑ์Šค์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ์„ค์ •์€ ์• ๋„๋ผ์ด์ €๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
        • ์ธ๋ฑ์Šค ๋งคํ•‘์— ์• ๋„๋ผ์ด์ €๋ฅผ ์ ์šฉ ํ•  ๋•Œ ํ† ํฌ๋‚˜์ด์ €, ํ† ํฐํ•„ํ„ฐ ๋“ฑ์„ ์กฐํ•ฉํ•˜์—ฌ ๋งŒ๋“  ์‚ฌ์šฉ์ž ์ •์˜ ์• ๋„๋ผ์ด์ €(Custom Analyzer)๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉ
        • ์ธ๋ฑ์Šค settings ์˜ "index" : { "analysis" : ๋ถ€๋ถ„์— ์ •์˜
        • GET ๋˜๋Š” POST <์ธ๋ฑ์Šค๋ช…>/_analyze ๋ช…๋ น์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
        • PUT my_index3 { "settings": { "index": { "analysis": { "analyzer": { "my_custom_analyzer": { "type": "custom", "tokenizer": "whitespace", "filter": [ "lowercase", "stop", "snowball" ] } } } } } } ( my_index3 ์•ˆ์— whitespace ํ† ํฐํฌ๋‚˜์ด์ € ๊ทธ๋ฆฌ๊ณ  lowercase, stop, snowball ํ† ํฐํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” my_custom_analyzer ๋ผ๋Š” ์ด๋ฆ„์˜ ์• ๋„๋ผ์ด์ €๋ฅผ ์ถ”๊ฐ€ )
      • ํ…€ ๋ฒกํ„ฐ - _termvectors API
        • ์ƒ‰์ธ๋œ ๋„ํ๋จผํŠธ์˜ ์—ญ ์ธ๋ฑ์Šค์˜ ๋‚ด์šฉ์„ ํ™•์ธํ•  ๋•Œ๋Š” ๋„ํ๋จผํŠธ ๋ณ„๋กœ _termvectors API๋ฅผ์ด์šฉํ•ด์„œ ํ™•์ธ
        • GET <์ธ๋ฑ์Šค>/_termvectors/<๋„ํ๋จผํŠธid>?fields=<ํ•„๋“œ๋ช…> ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ
        • EX) GET my_index3/_termvectors/1?fields=message ( my_index3/_doc/1 ๋„ํ๋จผํŠธ์˜ message ํ•„๋“œ์˜ termvectors ํ™•์ธ )
    • ์บ๋ฆญํ„ฐ ํ•„ํ„ฐ - Character Filter
      • ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ํ•„์š”์— ๋”ฐ๋ผ ์ „์ฒด ๋ฌธ์žฅ์—์„œ ํŠน์ • ๋ฌธ์ž๋ฅผ ๋Œ€์น˜ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์„ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ
      • ์บ๋ฆญํ„ฐ ํ•„ํ„ฐ๋Š” ํ…์ŠคํŠธ ๋ถ„์„ ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ์ฒ˜๋ฆฌ๋˜๋Š” ๊ณผ์ •์œผ๋กœ ์ƒ‰์ธ๋œ ํ…์ŠคํŠธ๊ฐ€ ํ† ํฌ๋‚˜์ด์ €์— ์˜ํ•ด ํ…€์œผ๋กœ ๋ถ„๋ฆฌ๋˜๊ธฐ ์ „์— ์ „์ฒด ๋ฌธ์žฅ์— ๋Œ€ํ•ด ์ ์šฉ๋˜๋Š” ์ผ์ข…์˜ ์ „์ฒ˜๋ฆฌ ๋„๊ตฌ
      • HTML Strip
        • ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ๊ฐ€ HTML ์ธ ๊ฒฝ์šฐ HTML ํƒœ๊ทธ๋“ค์„ ์ œ๊ฑฐํ•˜์—ฌ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ๋งŒ๋“ ๋‹ค.
        • EX) POST _analyze { "tokenizer": "keyword", "char_filter": [ "html_strip" ], "text": "<p>I&apos;m so <b>happy</b>!</p>" } ( <p>I&apos;m so <b>happy</b>!</p>๋ฅผ I'm so happy!๋กœ ๋ณ€๊ฒฝ
      • Mapping
        • ์ง€์ •ํ•œ ๋‹จ์–ด๋ฅผ ๋‹ค๋ฅธ ๋‹จ์–ด๋กœ ์น˜ํ™˜
        • ํŠน์ˆ˜๋ฌธ์ž ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ์ ์šฉ
        • + ๊ธฐํ˜ธ๋Š” plus ๋กœ, - ๊ธฐํ˜ธ๋Š” minus ๋กœ ์น˜ํ™˜
        PUT coding
        {
          "settings": {
            "analysis": {
              "analyzer": {
                "coding_analyzer": {
                  "char_filter": [
                    "cpp_char_filter"
                  ],
                  "tokenizer": "whitespace",
                  "filter": [ "lowercase", "stop", "snowball" ]
                }
              },
              "char_filter": {
                "cpp_char_filter": {
                  "type": "mapping",
                  "mappings": [ "+ => _plus_", "- => _minus_" ]
                }
              }
            }
          },
          "mappings": {
            "properties": {
              "language": {
                "type": "text",
                "analyzer": "coding_analyzer"
              }
            }
          }
        }
        
      • Pattern Replace
        • ์ •๊ทœ์‹(Regular Expression)์„ ์ด์šฉํ•ด์„œ ์ข€๋” ๋ณต์žกํ•œ ํŒจํ„ด๋“ค์„ ์น˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์บ๋ฆญํ„ฐ ํ•„ํ„ฐ
        • ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ•(camelCase)์œผ๋กœ ๋œ ๋‹จ์–ด๋ฅผ ๋Œ€๋ฌธ์ž๊ฐ€ ์‹œ์ž‘ํ•˜๋Š” ๋‹จ์œ„ ๋งˆ๋‹ค ๊ณต๋ฐฑ์„ ์‚ฝ์ž…ํ•˜์—ฌ ์„ธ๋ถ€ ๋‹จ์–ด๋ณ„๋กœ ํ† ํฌ๋‚˜์ด์ง• ๋  ์ˆ˜ ์žˆ๋„๋ก camel ์ธ๋ฑ์Šค์— camel_analyzer ๋ผ๋Š” ์• ๋„๋ผ์ด์ €๋ฅผ ์ƒ์„ฑ
        PUT camel
        {
          "settings": {
            "analysis": {
              "analyzer": {
                "camel_analyzer": {
                  "char_filter": [
                    "camel_filter"
                  ],
                  "tokenizer": "standard",
                  "filter": [
                    "lowercase"
                  ]
                }
              },
              "char_filter": {
                "camel_filter": {
                  "type": "pattern_replace",
                  "pattern": "(?<=\\p{Lower})(?=\\p{Upper})",
                  "replacement": " "
                }
              }
            }
          }
        }
        
        • camel_analyzer ์• ๋„๋ผ์ด์ €๋กœ ๋ฌธ์žฅ ๋ถ„์„
        GET camel/_analyze
        {
          "analyzer": "camel_analyzer",
          "text": [
            "public void FooBazBar()"
          ]
        }
        
    • ํ† ํฌ๋‚˜์ด์ €
      • ๋ฌธ์žฅ์— ์†ํ•œ ๋‹จ์–ด๋“ค์„ ํ…€ ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ๋ถ„๋ฆฌ ํ•ด ๋‚ด๋Š” ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๊ฑฐ์น˜๋Š”๋ฐ, ์ด ๊ณผ์ •์„ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ
      • ํ† ํฌ๋‚˜์ด์ €๋Š” ๋ฐ˜๋“œ์‹œ 1๊ฐœ๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅ.
    • ํ† ํฐ ํ•„ํ„ฐ
      • ๋ถ„๋ฆฌ๋œ ํ…€ ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊ฐ€๊ณตํ•˜๋Š” ๊ณผ์ •์„ ๋‹ด๋‹น
      • ex) lowercase : ํ† ํฐ ํ•„ํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋Œ€๋ฌธ์ž๋ฅผ ๋ชจ๋‘ ์†Œ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ” ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ณ„ ์—†์ด ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅ
    • ๋ถˆ์šฉ์–ด(stopword)
      • ๊ฒ€์ƒ‰์–ด๋กœ์„œ์˜ ๊ฐ€์น˜๊ฐ€ ์—†๋Š” ๋‹จ์–ด ( a, an, are, at, i )
    • snowball ํ† ํฐ ํ•„ํ„ฐ
      • ๋ฌธ๋ฒ•์ƒ ๋ณ€ํ˜•๋œ ๋‹จ์–ด๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฒ€์ƒ‰์— ์“ฐ์ด๋Š” ๊ธฐ๋ณธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
      • ex) jumps์™€ jumping์€ ๋ชจ๋‘ jump๋กœ ๋ณ€๊ฒฝ ํ›„ ํ…€ ๋ณ‘ํ•ฉ.
    • synonym ํ† ํฐ ํ•„ํ„ฐ
      • ๋™์˜์–ด๋ฅผ ํ•˜๋‚˜์˜ ๋‹จ์–ด๋กœ ํ…€ ๋ณ‘ํ•ฉ.
      • ex) quick ํ…€์— ๋™์˜์–ด๋กœ fast๋ฅผ ์ง€์ •ํ•˜๋ฉด fast ๋กœ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ๋„ ๊ฐ™์€ ์˜๋ฏธ์ธ quick ์„ ํฌํ•จํ•˜๋Š” ๋„ํ๋จผํŠธ๊ฐ€ ๊ฒ€์ƒ‰
    • ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ๋ถ„์„๊ธฐ
      • ํ•œ๊ธ€์€ ํ˜•ํƒœ์˜ ๋ณ€ํ˜•์ด ๋งค์šฐ ๋ณต์žกํ•œ ์–ธ์–ด์ด๋‹ค. ํŠนํžˆ ๋ณตํ•ฉ์–ด, ํ•ฉ์„ฑ์–ด ๋“ฑ์ด ๋งŽ์•„ ํ•˜๋‚˜์˜ ๋‹จ์–ด๋„ ์—ฌ๋Ÿฌ ์–ด๊ฐ„์œผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ํ•œ๊ธ€์„ ํ˜•ํƒœ์†Œ ๋ถ„์„์„ ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ์‚ฌ์ „์ด ํ•„์š”ํ•˜๋‹ค.
      • ๋…ธ๋ฆฌ (nori), ์•„๋ฆฌ๋ž‘ (arirang), ์€์ „ํ•œ๋‹ข (seunjeon)๋“ฑ์ด ์žˆ๋‹ค
  2. Near Realtime

    • ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ํ”Œ๋žซํผ์ด๋ผ๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  3. Cluster

    • ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ๋ณด์œ ํ•˜๊ณ  ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ์—ฐํ•ฉ ์ธ๋ฑ์‹ฑ ๋ฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ๋ชจ์Œ
    • ์œ ์ผํ•œ ์ด๋ฆ„(unique name)์œผ๋กœ ํŒ๋ณ„(identified) (๊ธฐ๋ณธ๊ฐ’: 'elasticsearch')
    • ์‚ฌ์šฉ์ž๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ ์š”์ฒญ
    • Elasticsearch๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์˜ ์ฆ๊ฐ€์— ๋”ฐ๋ฅธ ์Šค์ผ€์ผ ์•„์›ƒ๊ณผ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ์ง€์›, ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๋™์ž‘์„ ํ•˜๋ฉฐ 1๊ฐœ์˜ ๋…ธ๋“œ๋งŒ ์žˆ์–ด๋„ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑ
    • ์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ฌถ์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ช… cluster.name ์„ค์ •์ด ๋ฌถ์—ฌ์งˆ ๋…ธ๋“œ๋“ค ๋ชจ๋‘ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค.
    • ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ
      • ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์‹คํ–‰
        • ํด๋ผ์ด์–ธํŠธ์™€์˜ ํ†ต์‹ ์„ ์œ„ํ•œ http ํฌํŠธ, ๋…ธ๋“œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ tcp ํฌํŠธ ์กด์žฌ.

        • ์ผ๋ฐ˜์ ์œผ๋กœ 1๊ฐœ์˜ ๋ฌผ๋ฆฌ ์„œ๋ฒ„๋งˆ๋‹ค ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰.

        • ex) 3๊ฐœ์˜ ์„œ๋ฒ„์—์„œ ๊ฐ 1๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‹คํ–‰

          image (1)
        • ex) ํ•œ ์„œ๋ฒ„์—์„œ ๋‘๊ฐœ์˜ ๋…ธ๋“œ ์‹คํ–‰, ๋˜ ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ํ•œ๊ฐœ ๋…ธ๋“œ ์‹คํ–‰

          image (2)
      • ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ ์‹คํ–‰
        • ex) ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ ์„œ๋ฒ„์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ๊ฐœ์˜ ํด๋Ÿฌ์Šคํ„ฐ ์‹คํ–‰

          image (3)
          • node-1๊ณผ node-2๋Š” ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ฌถ์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ๊ฐ€๋Šฅ. node-3 ์€ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ๋…ธ๋“œ๋“ค๊ณผ ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ๋ถˆ๊ฐ€.
          • node-2 ๋Š” node-1์ด ๋งˆ์Šคํ„ฐ๋กœ ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ es-cluster-2์— ๋ฌถ์ธ ๊ฒƒ
          • node-3 ์Šค์Šค๋กœ es-cluster-2 ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ
      • ๋””์Šค์ปค๋ฒ„๋ฆฌ (Discovery)
        • ๋…ธ๋“œ๊ฐ€ ์ฒ˜์Œ ์‹คํ–‰ ๋  ๋•Œ ๊ฐ™์€ ์„œ๋ฒ„, ๋˜๋Š” discovery.seed_hosts: [ ] ์— ์„ค์ •๋œ ๋„คํŠธ์›Œํฌ ์ƒ์˜ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์„ ์ฐพ์•„ ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ฐ”์ธ๋”ฉ ํ•˜๋Š” ๊ณผ์ •

        • discovery.seed_hosts ์„ค์ •์— ์žˆ๋Š” ์ฃผ์†Œ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ

          • ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ > cluster.name ํ™•์ธ
            • ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ > ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ฐ”์ธ๋”ฉ > ์ข…๋ฃŒ
            • ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ > 1๋กœ ๋Œ์•„๊ฐ€์„œ ๋‹ค์Œ ์ฃผ์†Œ ํ™•์ธ ๋ฐ˜๋ณต
        • ์ฃผ์†Œ๊ฐ€ ๋๋‚  ๋•Œ ๊นŒ์ง€ ๋…ธ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ - ์Šค์Šค๋กœ ์ƒˆ๋กœ์šด ํด๋Ÿฌ์Šคํ„ฐ ์‹œ์ž‘

        • ๋””์Šค์ปค๋ฒ„๋ฆฌ ๊ณผ์ •

          image (4)
  4. Node

    • ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ผ๋ถ€์ด๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ธ๋ฑ์‹ฑ ๋ฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์— ์ฐธ์—ฌํ•˜๋Š” ๋‹จ์ผ ์„œ๋ฒ„

    • ๋…ธ๋“œ์— ํ• ๋‹น๋˜๋Š” ์ž„์˜ UUID์ธ ์ด๋ฆ„์œผ๋กœ ์‹๋ณ„

    • ํŠน์ • ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋„๋ก ๋…ธ๋“œ๋ฅผ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์—ญํ• ์— ๋”ฐ๋ผ ๋งˆ์Šคํ„ฐ๋…ธ๋“œ์™€ ๋ฐ์ดํ„ฐ, ingest, client ๋…ธ๋“œ๋กœ ์‚ฌ์šฉ

    • ๋…ธ๋“œ ๊ด€๋ จ ์†์„ฑ

      • node.master : ๋งˆ์Šคํ„ฐ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” ์—ฌ๋ถ€
      • node.data : ๋ฐ์ดํ„ฐ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” ์—ฌ๋ถ€
      • node.ingest : Ingest ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” ์—ฌ๋ถ€
      • search.remote.connect : ์™ธ๋ถ€ ํด๋Ÿฌ์Šคํ„ฐ ์ ‘์† ๊ฐ€๋Šฅ ์—ฌ๋ถ€
    • ๋…ธ๋“œ ๋ชจ๋“œ

      • ์œ„์˜ ์†์„ฑ๋“ค์„ ์ ์ ˆํžˆ ์กฐํ•ฉํ•ด์„œ ํŠน์ • ๋…ธ๋“œ ๋ชจ๋“œ๋กœ ์šด์˜๊ฐ€๋Šฅ
        • elasticsearch.yml ํŒŒ์ผ์— ๋…ธ๋“œ ๊ด€๋ จ ์†์„ฑ์ด ์ œ๊ณต
      • Single Node mode
        • node.master: true / node.data: true / node.ingest: true / search.remote.connect: true
        • ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“œ. ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ ์ง€์ •๋ผ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— elasticsearch.yml ํŒŒ์ผ์— ์•„๋ฌด๋Ÿฐ ์„ค์ •์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€๋ชจ๋“œ๋กœ ๋™์ž‘
      • Master Node mode
        • node.master: true / node.data: true / node.ingest: true / search.remote.connect: true
        • ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ œ์–ด๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“œ. ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด๋ฅผ ๊ด€์žฅํ•˜๋Š” ๋งˆ์Šคํ„ฐ ์—ญํ• ์„ ์ˆ˜ํ–‰
          • ์ธ๋ฑ์Šค ์ƒ์„ฑ/๋ณ€๊ฒฝ/์‚ญ์ œ ๋“ฑ์˜ ์—ญํ• ์„ ๋‹ด๋‹น
          • ๋ถ„์‚ฐ์ฝ”๋””๋„ค์ดํ„ฐ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋…ธ๋“œ์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ ๊ฒ€ํ•˜์—ฌ ์žฅ์• ๋ฅผ ๋Œ€๋น„
          • ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์ˆ˜(ํ™€์ˆ˜๊ฐœ) ์กด์žฌ
          • ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ์—๋„ ํ›„๋ณด ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์—ญํ• ์„ ์œ„์ž„๋ฐ›์•„ ์•ˆ์ •์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜ ์œ ์ง€
      • Data Node mode
        • node.master: false / node.data: true / node.ingest: false / search.remote.connect: false
        • ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ CRUD, ๊ฒ€์ƒ‰, ์ง‘๊ณ„ ๋“ฑ ๋ฐ์ดํ„ฐ ๊ด€๋ จ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“œ *CRUD = Create(์ƒ์„ฑ), Read(์ฝ๊ธฐ), Update(๊ฐฑ์‹ ), Delete(์‚ญ์ œ)
        • ๋…ธ๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•˜๋ฉด ๋‚ด๋ถ€์— ์ƒ‰์ธ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ. ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์™€๋Š” ๋‹ฌ๋ฆฌ ๋Œ€์šฉ๋Ÿ‰์˜ ์ €์žฅ์†Œ๋ฅผ ํ•„์ˆ˜์ ์œผ๋กœ ๊ฐ–์ถฐ์•ผํ•œ๋‹ค.
        • CRUD ์ž‘์—…๊ณผ ๊ฒ€์ƒ‰, ์ง‘๊ณ„์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๋ฒ• ์žก์•„๋จน๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋””์Šคํฌ๋งŒ์ด ์•„๋‹Œ ์ „์ฒด์ ์ธ ์ŠคํŽ™์„ ๊ฐ–์ถ˜ ์„œ๋ฒ„๋กœ ์šด์˜
        • ๋Œ€์šฉ๋Ÿ‰ ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์—์„œ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์™€ ๋ฐ์ดํ„ฐ ๋…ธ๋“œ์˜ ๋ถ„๋ฆฌ๋Š” ํ•„์ˆ˜.
      • Ingest Node mode
        • node.master: false / node.data: false / node.ingest: true / search.remote.connect: false
        • ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ‰์ธํ•  ๋•Œ ๋ฐ์ดํ„ฐ์˜ ์ „์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ชจ๋“œ
        • ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ‰์ธํ•˜๋ ค๋ฉด ์ธ๋ฑ์Šค๋ผ๋Š”(RDB Schema) ํ‹€์„ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค. ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ์ €์žฅ์†Œ๋กœ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ์ •ํ•œ ํ˜•ํƒœ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
        • ์ธ๋ฑ์Šค์—๋Š” ์—ฌ๋Ÿฌ ํฌ๋งท์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… ํ•„๋“œ๊ฐ€ ์กด์žฌ
        • ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ‰์ธํ• ๋•Œ ๊ฐ„๋‹จํ•œ ํฌ๋งท ๋ณ€๊ฒฝ์ด๋‚˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ ๊ฐ™์€ ์ „์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ํ•ด๋‹น ๋ชจ๋“œ๋ฅผ ์ด์šฉ
      • Coordination Node mode
        • node.master: false / node.data: false / node.ingest: false / search.remote.connect: false
        • ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋””๋„ค์ดํ„ฐ ๋ชจ๋“œ
        • ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜์˜ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฝ”๋””๋„ค์ด์…˜ ๋ชจ๋“œ ๋…ธ๋“œ์ด๋‹ค. ์ฆ‰, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป.
        • ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์—๊ฒŒ ์š”์ฒญ์„ ๋ถ„์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ์ทจํ•ฉํ•˜๋Š” ์ฝ”๋””๋„ค์ด์…˜ ๋…ธ๋“œ๋ฅผ ๋ณ„๋„๋กœ ๊ตฌ์ถ•ํ•œ๋‹ค๋ฉด ์•ˆ์ •์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜์ด ๊ฐ€๋Šฅ
      image (3)
    • Split Brain

      • ๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ๋กœ ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜๋ฉด ๊ฐ์ž๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๊ณ„์† ๋™์ž‘, ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ณต๊ตฌ ๋˜๊ณ  ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋‹ค์‹œ ํ•ฉ์ณ์กŒ์„ ๋•Œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ณ  ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์†์‹ค๋˜๋Š” ํ˜„์ƒ.
      • ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ๋†“๊ฒŒ ๋˜๋ฉด ๊ทธ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์œ ์‹ค๋˜์—ˆ์„ ๋•Œ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด๊ฐ€ ์ž‘๋™์„ ์ •์ง€ ํ•  ์œ„ํ—˜
      • ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ๋“ค์€ 3๊ฐœ ์ด์ƒ์˜ ํ™€์ˆ˜ ๊ฐœ๋ฅผ ๋†“๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
      image (3)
  5. Index

    • ๋‹ค์†Œ ์œ ์‚ฌํ•œ ํŠน์„ฑ์„ ๊ฐ–๋Š” Document๋“ค์˜ ์ง‘ํ•ฉ
    • ๋‹จ์ผ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์›ํ•˜๋Š”๋งŒํผ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • RDB์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋น„์Šทํ•œ ๊ฐœ๋…
    • Index ๋‚ด ๋‹ค์ˆ˜์˜ Document์ €์žฅ
    • Indexing
      • ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์›๋ณธ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰์–ด ํ† ํฐ๋“ค์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •
    • Search
      • ์ธ๋ฑ์Šค์— ๋“ค์–ด์žˆ๋Š” ๊ฒ€์ƒ‰์–ด ํ† ํฐ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ฌธ์„œ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •
    • Query
      • ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ์ง‘๊ณ„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฒ€์ƒ‰ ์‹œ ์ž…๋ ฅํ•˜๋Š” ๊ฒ€์ƒ‰์–ด ๋˜๋Š” ๊ฒ€์ƒ‰ ์กฐ๊ฑด
    image (4)
  6. Type

    • Index ๋‚ด์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ Type์„ ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ElasticSearch 7.x ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” _ doc๋กœ ๊ณ ์ •
  7. Document

    • JSON(Java Script Object Notatoin) ํ˜•ํƒœ์˜ ์‹ค์ œ ์˜๋ฏธ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง„ Elasticsearch ๊ธฐ๋ณธ์ €์žฅ๋‹จ์œ„
    • Index๋ฅผ ์ƒ์„ฑ
    • ๊ณ ์œ ํ•œ ๋ฌธ์„œ ID ๋ณด์œ  (๋ฌธ์„œ ID๋Š” ๋žœ๋ค&์ˆ˜๋™ ํ• ๋‹น๋˜๋ฉฐ ๋ฌธ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๊ฐˆ ๋•Œ ์‚ฌ์šฉ)
  8. Shards

    • Index๋Š” ์ž ์žฌ์ ์œผ๋กœ ๋‹จ์ผ ๋…ธ๋“œ์˜ ํ•˜๋“œ์›จ์–ด ์ œํ•œ์„ ์ดˆ๊ณผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹จ์ผ ๋…ธ๋“œ์˜ ๋””์Šคํฌ๊ฐ€ ๋งž์ง€ ์•Š๊ฑฐ๋‚˜ ๋‹จ์ผ ๋…ธ๋“œ์˜ ๊ฒ€์ƒ‰ ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋А๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— shards๋ฅผ ์ด์šฉํ•˜์—ฌ Index๋ฅผ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.
    • ๋…ธ๋“œ์— ๋ถ„์‚ฐ๋˜์–ด ์ €์žฅ
    • ์ˆ˜ํ‰์ ์œผ๋กœ ์ฝ˜ํ…์ธ  ๋ณผ๋ฅจ์„ split/scale ๊ฐ€๋Šฅ
    • ์—ฌ๋Ÿฌ ๋…ธ๋“œ์—์„œ ์ž ์žฌ์ ์œผ๋กœ ๋ถ„์‚ฐ์„ ํ†ตํ•ด ์ž‘์—…์„ ๋ถ„์‚ฐ ๋ฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ/์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ–ฅ์ƒ
    • ์›๋ณธ์ƒค๋“œ(Primary Shard)์™€ ๋ณต์ œ๋ณธ์ƒค๋“œ(Replica Shard)๋กœ๋‚˜๋‰จ
    image (3)
    • ๋‹จ์ผ ๋…ธ๋“œ์˜ ๊ฒฝ์šฐ ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ๋งŒ ์กด์žฌ. Elasticsearch ๋Š” ์•„๋ฌด๋ฆฌ ์ž‘์€ ํด๋Ÿฌ์Šคํ„ฐ๋ผ๋„ ๋ฐ์ดํ„ฐ ๊ฐ€์šฉ์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด ์ตœ์†Œ 3๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ ํ•  ๊ฒƒ์„ ๊ถŒ์žฅ.
    • ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ Node์— ์žˆ๋˜ ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ๋“ค์„ ์œ ์‹คํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค์— ๋ ˆํ”Œ๋ฆฌ์นด ์ƒค๋“œ๊ฐ€ ๋‚จ์•„์žˆ์œผ๋ฉด ์ „์ฒด ๋ฐ์ดํ„ฐ๋Š” ์œ ์‹ค์ด ์—†์ด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ.
    • ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋จผ์ € ์œ ์‹ค๋œ ๋…ธ๋“œ์˜ ๋ณต๊ตฌ ๋Œ€๊ธฐ. ํƒ€์ž„์•„์›ƒ์ด ์ง€๋‚˜ ์œ ์‹ค๋œ ๋…ธ๋“œ๊ฐ€ ๋ณต๊ตฌ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ๋ ˆํ”Œ๋ฆฌ์นด ์ƒค๋“œ๋“ค์˜ ๋ณต์ œ๋ฅผ ์‹œ์ž‘.
      • ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ, ๋ ˆํ”Œ๋ฆฌ์นด ์ƒค๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์œ ์ง€๋จ.
    • ์ƒค๋“œ์˜ ๊ฐœ์ˆ˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑ์‹œ ์ง€์ •๊ฐ€๋Šฅ. ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ ์ˆ˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ฒ˜์Œ ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •, ์ธ๋ฑ์Šค๋ฅผ ์žฌ์ƒ‰์ธ ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๋ณ€๊ฒฝ๋ถˆ๊ฐ€. ๋ณต์ œ๋ณธ์˜ ๊ฐœ์ˆ˜๋Š” ์ถ”ํ›„ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅ.
  9. Replication

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

RDB ES
Database Index
Table Type
Row Document
Column Field
index Analyze
Primary ket _id
Schema Mapping
Physical partition Shard
Logical partition Route
Relational Parent/Child,Nested
SQL Query DSL
  1. RESTFul API
    • Elasticsearch๋Š” Rest API๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์กฐํšŒ, ์ž…๋ ฅ, ์‚ญ์ œ๋ฅผ http ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด Rest API๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    • Elasticsearch์—์„œ๋Š” ๋‹จ์ผ ๋„ํ๋จผํŠธ๋ณ„๋กœ ๊ณ ์œ ํ•œ URL์„ ๊ฐ–๋Š”๋‹ค.

      • http://<ํ˜ธ์ŠคํŠธ>:<ํฌํŠธ>/<์ธ๋ฑ์Šค>/_doc/<๋„ํ๋จผํŠธ id>
    • CRUD API

      • ์ž…๋ ฅ (PUT)
        • EX) PUT my_index/_doc/1 {"name":"Seongho Kim", "message":"Hi Elasticsearch"}
        • ์ฒ˜์Œ ๋„ํ๋จผํŠธ๋ฅผ ์ž…๋ ฅ์‹œ "result" : "created" ๋กœ ํ‘œ์‹œ, ๋™์ผํ•œ URL์— ๋‹ค๋ฅธ ๋‚ด์šฉ์˜ ๋„ํ๋จผํŠธ๋ฅผ ๋‹ค์‹œ ์ž…๋ ฅ์‹œ ๋ฎ์–ด์”Œ์šด ํ›„ "result" : "updated" ํ‘œ์‹œ
        • ์‹ค์ˆ˜๋กœ ๋„ํ๋จผํŠธ๊ฐ€ ๋ฎ์–ด์”Œ์›Œ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด _doc ๋Œ€์‹  _create ๋ฅผ ์‚ฌ์šฉ
      • ์กฐํšŒ (GET)
        • EX) GET my_index/_doc/1
        • ํ•ด๋‹น URL์˜ ๋„ํ๋จผํŠธ์˜ ๋‚ด์šฉ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
        • ๋ฌธ์„œ์˜ ๋‚ด์šฉ์€ _source ํ•ญ๋ชฉ์— ๋‚˜ํƒ€๋‚จ
      • ์‚ญ์ œ (DELETE)
        • EX) DELETE my_index/_doc/1
      • ์ˆ˜์ • (POST)
        • ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋ฐ ์ˆ˜์ • ์‹œ ์‚ฌ์šฉ
        • EX) POST my_index/_doc {"name":"Seongho Kim", "message":"Hi Elasticsearch"}
        • POST <์ธ๋ฑ์Šค>/_doc ๊นŒ์ง€๋งŒ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋™์œผ๋กœ ์ž„์˜์˜ ๋„ํ๋จผํŠธid ๊ฐ€ ์ƒ์„ฑ, PUT์œผ๋กœ๋Š” ์ž๋™์ƒ์„ฑ ๋ถˆ๊ฐ€๋Šฅ
        • POST <์ธ๋ฑ์Šค>/_update/<๋„ํ๋จผํŠธ id> ๋ช…๋ น์„ ์ด์šฉํ•ด ์›ํ•˜๋Š” ํ•„๋“œ์˜ ๋‚ด์šฉ๋งŒ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
          • EX) POST my_index/_update/1 {"doc": { "message":"Bye Elasticsearch" } }
          • ์ˆ˜์ • ํ›„ ํ•ด๋‹น ๋„ํ๋จผํŠธ๋ฅผ GET ํ•ด๋ณด๋ฉด "_version" : 2๋กœ ๋ณ€๊ฒฝ
    • ๋ฒŒํฌ API

      • ์—ฌ๋Ÿฌ ๋ช…๋ น์„ ๋ฐฐ์น˜๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ _bulk API์˜ ์‚ฌ์šฉ
      • index, create, update, delete์˜ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ delete๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ช…๋ น๋ฌธ๊ณผ ๋ฐ์ดํ„ฐ๋ฌธ์„ ํ•œ ์ค„์”ฉ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅ
      • EX)
      image (9)
      • ๋ชจ๋“  ๋ช…๋ น์ด ๋™์ผํ•œ ์ธ๋ฑ์Šค์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด <์ธ๋ฑ์Šค๋ช…>/_bulk ํ˜•์‹์œผ๋กœ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
      • ๋”ฐ๋กœ๋”ฐ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ์†๋„๊ฐ€ ํ›จ์”ฌ ๋น ๋ฆ„. ํŠนํžˆ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ ํ•  ๋•Œ๋Š” ๋ฐ˜๋“œ์‹œ _bulk API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์Œ.
      • ๋ฒŒํฌ ๋ช…๋ น์„ json ํŒŒ์ผ๋กœ ์ €์žฅ ํ›„ curl๋ช…๋ น์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ
        • _bulk API๋ฅผ bulk.jsonํŒŒ์ผ๋กœ ์ €์žฅ ํ›„ curl -XPOST "http://localhost:9200/_bulk" -H 'Content-Type: application/json' --data-binary @bulk.json๋ฅผ ํ†ตํ•ด ์‹คํ–‰
    • ๊ฒ€์ƒ‰ API ( _search API )

      • ๊ฒ€์ƒ‰์€ ์ธ๋ฑ์Šค ๋‹จ์œ„๋กœ ์ด๋ฃจ์–ด์ง.
      • URI ๊ฒ€์ƒ‰
        • ์š”์ฒญ ์ฃผ์†Œ์— _search ๋’ค์— q ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅ
          • EX) GET test/_search?q=value ( URI ๊ฒ€์ƒ‰์œผ๋กœ ๊ฒ€์ƒ‰์–ด "value" ๊ฒ€์ƒ‰ )
        • URI ์ฟผ๋ฆฌ์—์„œ๋Š” AND, OR, NOT ์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋ฐ˜๋“œ์‹œ ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์ž…๋ ฅ
          • EX) GET test/_search?q=value AND three ( URI ๊ฒ€์ƒ‰์œผ๋กœ ๊ฒ€์ƒ‰์–ด "value AND three" ๊ฒ€์ƒ‰ )
        • ๊ฒ€์ƒ‰์–ด๋ฅผ ํ•„๋“œ์—์„œ ์ฐพ๊ณ  ์‹ถ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด <ํ•„๋“œ๋ช…>:<๊ฒ€์ƒ‰์–ด> ํ˜•ํƒœ๋กœ ์ž…๋ ฅ
          • EX) GET test/_search?q=field:value ( URI ๊ฒ€์ƒ‰์œผ๋กœ "field" ํ•„๋“œ์—์„œ ๊ฒ€์ƒ‰์–ด "value" ๊ฒ€์ƒ‰ )
      • ๋ฐ์ดํ„ฐ ๋ณธ๋ฌธ (Data Body) ๊ฒ€์ƒ‰
        • ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ ๋ณธ๋ฌธ์œผ๋กœ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ์‹
        • ์ฟผ๋ฆฌ ์ž…๋ ฅ์€ ํ•ญ์ƒ query ์ง€์ •์ž๋กœ ์‹œ์ž‘, ๊ทธ ๋‹ค์Œ ๋ ˆ๋ฒจ์—์„œ ์ฟผ๋ฆฌ์˜ ์ข…๋ฅ˜๋ฅผ ์ง€์ •
        • match ์ฟผ๋ฆฌ
          • EX) GET test/_search {"query": { "match": {"field": "value" }} }
        • ์ฟผ๋ฆฌ ๋ณ„๋กœ ๋ฌธ๋ฒ•์ด ์ƒ์ดํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ match ์ฟผ๋ฆฌ๋Š” <ํ•„๋“œ๋ช…>:<๊ฒ€์ƒ‰์–ด> ๋ฐฉ์‹์œผ๋กœ ์ž…๋ ฅ
      • ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ (Multitenancy)
        • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ๋ฑ์Šค๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ฌถ์–ด์„œ ๊ฒ€์ƒ‰
        • ogs-2018-01, logs-2018-02 โ€ฆ ์™€ ๊ฐ™์ด ๋‚ ์งœ๋ณ„๋กœ ์ €์žฅ๋œ ์ธ๋ฑ์Šค๋“ค์ด ์žˆ๋‹ค๋ฉด ์ด ์ธ๋ฑ์Šค๋“ค์„ ๋ชจ๋‘ logs-*/_search ๋ช…๋ น์œผ๋กœ ํ•œ๊บผ๋ฒˆ์— ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅ
        • ์‹œ๊ฐ„์ˆœ์œผ๋กœ ๋”ฐ๋ผ ์Œ“์ด๋Š” ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ผ๋‹จ์œ„ ๋“ฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š”๊ฒƒ์ด ์šฉ์ด
          • GET logs-2018-*/_search ( ์™€์ผ๋“œ์นด๋“œ * ๋ฅผ ์ด์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ์ธ๋ฑ์Šค ๊ฒ€์ƒ‰ )
      • ์ธ๋ฑ์Šค๋ช… ๋Œ€์‹  _all ์ง€์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GET _all/_search ์™€ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ๋ชจ๋“  ์ธ๋ฑ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅ.
        • _all์€ ์‹œ์Šคํ…œ ์‚ฌ์šฉ์„ ์œ„ํ•œ ์ธ๋ฑ์Šค ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ ‘๊ทผ, ๋ถˆํ•„์š”ํ•œ ์ž‘์—… ๋ถ€ํ•˜๋ฅผ ์ดˆ๋ž˜, _all ์€ ๋˜๋„๋ก ์ง€์–‘
    • ๊ฒ€์ƒ‰๊ณผ ์ฟผ๋ฆฌ ( Query DSL )

      • ๊ฒ€์ƒ‰ (Search)
        • ์ˆ˜๋งŽ์€ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ฒ”์œ„๋ฅผ ์ถ•์†Œํ•˜๋Š” ํ–‰์œ„
      • ํ’€ ํ…์ŠคํŠธ ์ฟผ๋ฆฌ - Full Text Query
        • match_all
          • ๋ณ„๋‹ค๋ฅธ ์กฐ๊ฑด ์—†์ด ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๋ชจ๋“  ๋„ํ๋จผํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฟผ๋ฆฌ
          • ๊ฒ€์ƒ‰ ์‹œ ์ฟผ๋ฆฌ๋ฅผ ๋„ฃ์ง€ ์•Š์œผ๋ฉด elasticsearch๋Š” ์ž๋™์œผ๋กœ match_all์„ ์ ์šฉํ•ด์„œ ํ•ด๋‹น ์ธ๋ฑ์Šค์˜ ๋ชจ๋“  ๋„ํ๋จผํŠธ๋ฅผ ๊ฒ€์ƒ‰
        • match
          • ํ’€ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ์ฟผ๋ฆฌ
          • ํŠน์ • ์ธ๋ฑ์Šค์˜ ํŠน์ • ํ•„๋“œ์— ํŠน์ • ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰
            • EX) GET my_index/_search {"query": {"match": {"message": "dog"}}} ( match ์ฟผ๋ฆฌ๋กœ message ํ•„๋“œ์—์„œ dog ๊ฒ€์ƒ‰ )
          • match ๊ฒ€์ƒ‰์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ง‘์–ด๋„ฃ๊ฒŒ ๋˜๋ฉด ๋””ํดํŠธ๋กœ OR ์กฐ๊ฑด์œผ๋กœ ๊ฒ€์ƒ‰์ด ๋˜์–ด ์ž…๋ ฅ๋œ ๊ฒ€์ƒ‰์–ด ๋ณ„๋กœ ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋œ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๋ชจ๋‘ ๊ฒ€์ƒ‰
            • EX) GET my_index/_search { "query": { "match": { "message": "quick dog" } } } ( match ์ฟผ๋ฆฌ๋กœ message ํ•„๋“œ์—์„œ quick OR dog ๊ฒ€์ƒ‰ )
          • ๊ฒ€์ƒ‰์–ด๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ OR ๊ฐ€ ์•„๋‹Œ AND ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด operator ์˜ต์…˜์„ ์‚ฌ์šฉ
            • EX) GET my_index/_search { "query": { "match": { "message": { "query": "quick dog", "operator": "and" } } } } ( match ์ฟผ๋ฆฌ quick AND dog ๊ฒ€์ƒ‰ )
        • match_phrase
          • ๊ณต๋ฐฑ์„ ํฌํ•จํ•ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰
            • EX) GET my_index/_search { "query": { "match_phrase": { "message": "lazy dog" } } } ( match_phrase ์ฟผ๋ฆฌ๋กœ "lazy dog" ๊ตฌ๋ฌธ ๊ฒ€์ƒ‰ )
          • slop ์ด๋ผ๋Š” ์˜ต์…˜์„ ์ด์šฉํ•˜์—ฌ slop์— ์ง€์ •๋œ ๊ฐ’ ๋งŒํผ ๋‹จ์–ด ์‚ฌ์ด์— ๋‹ค๋ฅธ ๊ฒ€์ƒ‰์–ด๊ฐ€ ๋ผ์–ด๋“œ๋Š” ๊ฒƒ์„ ํ—ˆ์šฉ
            • EX) GET my_index/_search { "query": { "match_phrase": { "message": { "query": "lazy dog", "slop": 1 } } } } ( match_phrase ์ฟผ๋ฆฌ์— slop:1 ๋กœ "lazy dog" ๊ตฌ๋ฌธ ๊ฒ€์ƒ‰)
            • "Lazy jumping dog"์ฒ˜๋Ÿผ ์‚ฌ์ด์— ํ•œ ๋‹จ์–ด๊ฐ€ ์ž…๋ ฅ๋œ ๊ฐ’๋„ ๊ฒ€์ƒ‰๋จ.
        • query_string
          • URL๊ฒ€์ƒ‰์— ์‚ฌ์šฉํ•˜๋Š” ๋ฃจ์”ฌ์˜ ๊ฒ€์ƒ‰ ๋ฌธ๋ฒ•์„ ๋ณธ๋ฌธ ๊ฒ€์ƒ‰์— ์ด์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ query_string ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉ
            • GET my_index/_search { "query": { "query_string": { "default_field": "message", "query": "(jumping AND lazy) OR "quick dog"" } } }` ( message ํ•„๋“œ์—์„œ lazy์™€ jumping์„ ๋ชจ๋‘ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” "quick dog" ๊ตฌ๋ฌธ์„ ํฌํ•จํ•˜๋Š” ๋„ํ๋จผํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฟผ๋ฆฌ, match_phrase ์ฒ˜๋Ÿผ ๊ตฌ๋ฌธ ๊ฒ€์ƒ‰์„ ํ•  ๋•Œ๋Š” ๊ฒ€์ƒ‰ํ•  ๊ตฌ๋ฌธ์„ ์Œ๋”ฐ์˜ดํ‘œ " ์•ˆ์— ๋„ฃ์Œ )
    • Bool ๋ณตํ•ฉ ์ฟผ๋ฆฌ - Bool Query

      • ๋ณธ๋ฌธ ๊ฒ€์ƒ‰์—์„œ ์—ฌ๋Ÿฌ ์ฟผ๋ฆฌ๋ฅผ ์กฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์œ„์— bool ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ ์•ˆ์— ๋‹ค๋ฅธ ์ฟผ๋ฆฌ๋“ค์„ ๋„ฃ๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
      • Bool ์ฟผ๋ฆฌ ์ธ์ž
        • must : ์ฟผ๋ฆฌ๊ฐ€ ์ฐธ์ธ ๋„ํ๋จผํŠธ๋“ค์„ ๊ฒ€์ƒ‰
        • must_not : ์ฟผ๋ฆฌ๊ฐ€ ๊ฑฐ์ง“์ธ ๋„ํ๋จผํŠธ๋“ค์„ ๊ฒ€์ƒ‰
        • should : ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ค‘ ์ด ์ฟผ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” ๋„ํ๋จผํŠธ์˜ ์ ์ˆ˜ ์ฆ๊ฐ€
        • filter : ์ฟผ๋ฆฌ๊ฐ€ ์ฐธ์ธ ๋„ํ๋จผํŠธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์ง€๋งŒ ์Šค์ฝ”์–ด๋ฅผ ๊ณ„์‚ฐ์•ˆํ•จ. must ๋ณด๋‹ค ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ์บ์‹ฑ์ด ๊ฐ€๋Šฅ.
      • ์‚ฌ์šฉ๋ฐฉ๋ฒ•
        • GET <์ธ๋ฑ์Šค๋ช…>/_search { "query": { "bool": { "must": [ { <์ฟผ๋ฆฌ> }, โ€ฆ ], "must_not": [ { <์ฟผ๋ฆฌ> }, โ€ฆ ], "should": [ { <์ฟผ๋ฆฌ> }, โ€ฆ ], "filter": [ { <์ฟผ๋ฆฌ> }, โ€ฆ ] } } }
        • EX) GET my_index/_search { "query": { "bool": { "must": [ { "match": { "message": "quick" } }, { "match_phrase": { "message": "lazy dog" } } ] } } } ( "quick"๊ณผ ๊ตฌ๋ฌธ "lazy dog"๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ฟผ๋ฆฌ )
      • must๋Š” SQL์˜ AND ์—ฐ์‚ฐ์ž์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ bool ์ฟผ๋ฆฌ์—๋Š” ํ‘œ์ค€ SQL์˜ OR ์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์ž๋Š” ์—†์Œ
      • ํ‘œ์ค€ SQL ๊ณผ Elasticsearch Bool ์ฟผ๋ฆฌ ๋น„๊ต
      image (10) image (11)
    • ์ •ํ™•๋„ - Relevancy

      • Elasticsearch ์™€ ๊ฐ™์€ ํ’€ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์—”์ง„์€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด๊ณผ ์–ผ๋งˆ๋‚˜ ์ •ํ™•ํ•˜๊ฒŒ ์ผ์น˜ํ•˜๋Š” ์ง€๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ด ์ •ํ™•๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์žฅ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ € ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.
      • ์Šค์ฝ”์–ด (score) ์ ์ˆ˜
        • Elasticsearch์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—๋Š” ์Šค์ฝ”์–ด ์ ์ˆ˜๊ฐ€ ํ‘œ์‹œ๊ฐ€ ๋จ. ์ด ์ ์ˆ˜๋Š” ๊ฒ€์ƒ‰๋œ ๊ฒฐ๊ณผ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ฒ€์ƒ‰ ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ ์ˆ˜๊ฐ€ ๋†’์€ ์ˆœ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ.
        • GET my_index/_search { "query": { "match": { "message": "quick dog" } } } ๊ฒ€์ƒ‰ ์‹œ ๊ฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ _score ํ•ญ๋ชฉ์— ์Šค์ฝ”์–ด ์ ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ์ด ์ ์ˆ˜๊ฐ€ ๋†’์€ ๊ฒฐ๊ณผ๋ถ€ํ„ฐ ๋‚˜ํƒ€๋‚จ. ์ƒ๋‹จ์˜ max_score์—๋Š” ์ „์ฒด ๊ฒฐ๊ณผ ์ค‘์—์„œ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๊ฐ€ ํ‘œ์‹œ.
        • Elasticsearch ๋Š” ์ด ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด BM25 ๋ผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉ
          • ๋„ํ๋จผํŠธ ๋‚ด์— ๊ฒ€์ƒ‰๋œ ํ…€(term)์ด ๋” ๋งŽ์„์ˆ˜๋ก ์ ์ˆ˜๊ฐ€ ๋†’์•„์ง.
          • ํ”ํ•œ ๋‹จ์–ด ๋ณด๋‹ค๋Š” ํฌ์†Œํ•œ ๋‹จ์–ด๊ฐ€ ๊ฒ€์ƒ‰์— ๋” ์ค‘์š”ํ•œ ํ…€์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ. ๊ฒ€์ƒ‰๋œ ํ…€์ด ํ”ํ•  ์ˆ˜๋ก ์ ์ˆ˜๊ฐ€ ๊ฐ์†Œ.
          • ๊ธด ํ…์ŠคํŠธ ๋ณด๋‹ค๋Š” ๊ธธ์ด๊ฐ€ ์งง์€ ํ…์ŠคํŠธ์— ๊ฒ€์ƒ‰์–ด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํ…์ŠคํŠธ๊ฐ€ ๋” ์ ์ˆ˜๊ฐ€ ๋†’์Œ.
      • Bool : Should
        • ๊ฒ€์ƒ‰ ์ ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
          • EX) GET my_index/_search { "query": { "bool": { "must": [ { "match": { "message": "fox" } } ], "should": [ { "match": { "message": "lazy" } } ] } } } ( fox ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ค‘ lazy ๋ฅผ ํฌํ•จํ•œ ๊ฒฐ๊ณผ์— ๊ฐ€์ค‘์น˜ ๋ถ€์—ฌ)
          • EX) GET my_index/_search { "query": { "bool": { "must": [ { "match": { "message": { "query": "lazy dog" } } } ], "should": [ { "match_phrase": { "message": "lazy dog" } } ] } } } ( lazy ๋˜๋Š” dog ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด์„œ "lazy dog" ๊ตฌ๋ฌธ์„ ํฌํ•จํ•œ ๊ฒฐ๊ณผ์— ๊ฐ€์ค‘์น˜ ๋ถ€์—ฌ )
    • ์ •ํ™•๊ฐ’ ์ฟผ๋ฆฌ - Exact Value Query

      • Elasticsearch๋Š” ์ •ํ™•๋„๋ฅผ ๊ณ ๋ คํ•˜๋Š” ํ’€ ํ…์ŠคํŠธ ์™ธ์—๋„ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์˜ ์ฐธ / ๊ฑฐ์ง“ ์—ฌ๋ถ€๋งŒ ํŒ๋ณ„ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ
      • bool : filter
        • bool์ฟผ๋ฆฌ์˜ filter ์•ˆ์— ํ•˜์œ„ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šค์ฝ”์–ด์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ
          • EX) must ๋กœ fox ๋ฐ filter ์œผ๋กœ quick ๊ฒ€์ƒ‰ ์‹œ match ์ฟผ๋ฆฌ๋กœ fox ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ์™€ ๊ฐ™์€ ์ ์ˆ˜
          • GET my_index/_search { "query": { "bool": { "must": [ { "match": { "message": "fox" } } ], "filter": [ { "match": { "message": "quick" } } ] } } }
      • keyword
        • ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋Š” keyword ํ˜•์‹์œผ๋กœ ์ €์žฅํ•˜์—ฌ ์ •ํ™•๊ฐ’ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅ
          • EX) GET my_index/_search { "query": { "bool": { "filter": [ { "match": { "message.keyword": "Brown fox brown dog" } } ] } } }
            • keyword ํƒ€์ž…์œผ๋กœ ์ €์žฅ๋œ ํ•„๋“œ๋Š” ์Šค์ฝ”์–ด๋ฅผ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์ •ํ™•๊ฐ’์˜ ์ผ์น˜ ์—ฌ๋ถ€๋งŒ์„ ๋”ฐ์ง
    • ๋ฒ”์œ„ ์ฟผ๋ฆฌ - Range Query

      • ์ˆซ์ž, ๋‚ ์งœ ํ˜•์‹์€ range ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฒ€์ƒ‰
      • range ์ฟผ๋ฆฌ๋Š” range : { <ํ•„๋“œ๋ช…>: { <ํŒŒ๋ผ๋ฉ”ํ„ฐ>:<๊ฐ’> } } ์œผ๋กœ ์ž…๋ ฅ
      • range ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ
        • gte (Greater-than or equal to) - ์ด์ƒ (๊ฐ™๊ฑฐ๋‚˜ ํผ)
        • gt (Greater-than) โ€“ ์ดˆ๊ณผ (ํผ)
        • lte (Less-than or equal to) - ์ดํ•˜ (๊ฐ™๊ฑฐ๋‚˜ ์ž‘์Œ)
        • lt (Less-than) - ๋ฏธ๋งŒ (์ž‘์Œ)
        • EX) GET phones/_search { "query": { "range": { "price": { "gte": 700, "lt": 900 } } } } ( price ๊ฐ’์ด 700 ์ด์ƒ 900 ๋ฏธ๋งŒ์ธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ )
      • ๋‚ ์งœ๊ฒ€์ƒ‰
        • ๋‚ ์งœ ๊ฐ’์€ 2016-01-01 ๋˜๋Š” 2016-01-01T10:15:30 ๊ณผ ๊ฐ™์ด JSON ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ISO8601 ํ˜•์‹์„ ์‚ฌ์šฉ
          • EX) GET phones/_search { "query": { "range": { "date": { "gt": "2016-01-01" } } } } ( date ๊ฐ’์ด 2016-01-01 ์ดํ›„์ธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ )
        • ์ฟผ๋ฆฌ์˜ ๋‚ ์งœ ํฌ๋งท์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด format ์˜ต์…˜์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ, || ์„ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐ’์˜ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅ
          • EX) GET phones/_search { "query": { "range": { "date": { "gt": "31/12/2015", "lt": "2018", "format": "dd/MM/yyyy||yyyy" } } } } ( date ๊ฐ’์ด 2016-01-01 ~ 2018-01-01 ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ )
        • ๋‚ ์งœ๋ฅผ ๊ฒ€์ƒ‰ ํ•  ๋•Œ ์˜ˆ์•ฝ์–ด ์‚ฌ์šฉ๊ฐ€๋Šฅ
          • now(ํ˜„์žฌ์‹œ๊ฐ„), y(๋…„), M(์›”), d(์ผ), h(์‹œ), m(๋ถ„), s(์ดˆ), w(์ฃผ)
        • range๋Š” true / false ์—ฌ๋ถ€๋งŒ์„ ํŒ๋‹จํ•˜์—ฌ ์ฟผ๋ฆฌ์˜ ์Šค์ฝ”์–ด๋Š” ๋ชจ๋‘ "_score" : 1.0๋กœ ๋™์ผ
  2. ์ธ๋ฑ์Šค ์„ค์ •๊ณผ ๋งคํ•‘
    • GET <์ธ๋ฑ์Šค๋ช…>/_settings,GET <์ธ๋ฑ์Šค๋ช…>/_mappings๋กœ ์กฐํšŒํ•˜๋ฉด ์„ค์ •(settings) ๊ทธ๋ฆฌ๊ณ  ๋งคํ•‘(mappings) ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์„ค์ • - Settings
      • number_of_shards, number_of_replicas
        • ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ ์ˆ˜์™€ ๋ ˆํ”Œ๋ฆฌ์นด ์ˆ˜ ์„ค์ •
        PUT my_index
        {
          "settings": {
            "index": {
              "number_of_shards": 3,
              "number_of_replicas": 1
            }
          }
        }
        
      • refresh_interval
        • ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํƒ€์ž„์„ ์„ค์ •ํ•˜๋Š” ๊ฐ’, ๊ธฐ๋ณธ์€ 1์ดˆ
        • refresh_interval ์„ 30์ดˆ๋กœ my_index ์ƒ์„ฑ
        PUT my_index
        {
          "settings": {
            "refresh_interval": "30s"
          }
        }
        
      • analyzer, tokenizer, filter
        • ์• ๋„๋ผ์ด์ €, ํ† ํฌ๋‚˜์ด์ €, ํ† ํฐ ํ•„ํ„ฐ ์—ญ์‹œ setting ๋‚ด๋ถ€์— ์ •์˜
        PUT my_index
        {
          "settings": {
            "analysis": {
              "analyzer": {
                "my_analyzer": {
                  "type": "custom",
                  "char_flter": [ "...", "..." ... ]
                  "tokenizer": "...",
                  "filter": [ "...", "..." ... ]
                }
              },
              "char_filter":{
                "my_char_filter":{
                  "type": "โ€ฆ"
                  ... 
                }
              }
              "tokenizer": {
                "my_tokenizer":{
                  "type": "โ€ฆ"
                  ...
                }
              },
              "filter": {
                "my_token_filter": {
                  "type": "โ€ฆ"
                  ...
                }
              }
            }
          }
        }
        
    • ๋งคํ•‘ - Mappings
      • ๋งคํ•‘

        • ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋˜์–ด ์ž๋™์œผ๋กœ ๋งคํ•‘์ด ์ƒ์„ฑ๋˜๊ธฐ ์ „์— ๋ฏธ๋ฆฌ ๋จผ์ € ์ธ๋ฑ์Šค์˜ ๋งคํ•‘์„ ์ •์˜ ํ•ด ๋†“์œผ๋ฉด ์ •์˜ ํ•ด ๋†“์€ ๋งคํ•‘์— ๋งž์ถ”์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ž…๋ ฅ๋จ
        • ์ธ๋ฑ์Šค์˜ ๋งคํ•‘ ์ •์˜
        PUT <์ธ๋ฑ์Šค๋ช…>
        {
          "mappings": {
            "properties": {
              "<ํ•„๋“œ๋ช…>":{
                "type": "<ํ•„๋“œ ํƒ€์ž…>"
                โ€ฆ <ํ•„๋“œ ์„ค์ •>
              }
              โ€ฆ
            }
          }
        }
        
        • ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋งคํ•‘์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ•„๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ํ•„๋“œ์˜ ํƒ€์ž… ๋ฐ ์„ค์ •๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
        • ๊ธฐ์กด ๋งคํ•‘์— ํ•„๋“œ ์ถ”๊ฐ€
        PUT <์ธ๋ฑ์Šค๋ช…>/_mapping
        {
          "properties": {
            "<์ถ”๊ฐ€ํ•  ํ•„๋“œ๋ช…>": { 
              "type": "<ํ•„๋“œ ํƒ€์ž…>"
              โ€ฆ <ํ•„๋“œ ์„ค์ •>
            }
          }
        }
        
        • ํ•„๋“œ์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋ฅผ ์ƒˆ๋กœ ์ •์˜ํ•˜๊ณ  ๊ธฐ์กด ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์ƒˆ ์ธ๋ฑ์Šค์— ๋ชจ๋‘ ์žฌ์ƒ‰์ธํ•œ๋‹ค.
      • ๋™์ (Dynamic) ๋งคํ•‘

        • ๋ฏธ๋ฆฌ ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ์ธ๋ฑ์Šค์— ๋„ํ๋จผํŠธ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋งคํ•‘์ด ์ƒ์„ฑ
      • ๋ฌธ์ž์—ด - text, keyword

        • text
          • ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด์„ ํ…€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด ์—ญ ์ƒ‰์ธ (inverted index) ๊ตฌ์กฐ
          • ์„ค์ • ๊ฐ€๋Šฅํ•œ ์˜ต์…˜
            • "analyzer" : "<์• ๋„๋ผ์ด์ €๋ช…>" ์ƒ‰์ธ์— ์‚ฌ์šฉํ•  ์• ๋„๋ผ์ด์ €๋ฅผ ์ž…๋ ฅ
            • "search_analyzer" : "<์• ๋„๋ผ์ด์ €๋ช…>" ์ƒ‰์ธ์— ์‚ฌ์šฉํ•œ ์• ๋„๋ผ์ด์ €๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์• ๋„๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉ
            • "index" : <true | false> ๋””ํดํŠธ๋Š” true. false๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ํ•„๋“œ๋Š” ์—ญ ์ƒ‰์ธ์„ ๋งŒ๋“ค์ง€ ์•Š์•„ ๊ฒ€์ƒ‰์ด ๋ถˆ๊ฐ€๋Šฅ
            • "boost" : <์ˆซ์ž ๊ฐ’> ๋””ํดํŠธ๋Š” 1. 1 ๋ณด๋‹ค ๋†’์œผ๋ฉด ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ์‹œ ํ•ด๋‹น ํ•„๋“œ ์Šค์ฝ”์–ด ์ ์ˆ˜์— ๊ฐ€์ค‘์น˜ ์ฆ๊ฐ€. 1๋ณด๋‹ค ๋‚ฎ์€ ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๊ฐ€์ค‘์น˜ ํ•˜๋ฝ.
            • "fielddata" : <true | false> ๋””ํดํŠธ๋Š” false. true๋กœ ์„ค์ •ํ•˜๋ฉด ํ•ด๋‹น ํ•„๋“œ์˜ ์ƒ‰์ธ๋œ ํ…€ ๋“ค์„ ๊ฐ€์ง€๊ณ  ์ง‘๊ณ„(aggregation) ๋˜๋Š” ์ •๋ ฌ(sorting)์ด ๊ฐ€๋Šฅ
        • keyword
          • ์ž…๋ ฅ๋œ ๋ฌธ์ž์—ด์„ ํ•˜๋‚˜์˜ ํ† ํฐ์œผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. text ํƒ€์ž…์— keyword ์• ๋„๋ผ์ด์ €๋ฅผ ์ ์šฉ ํ•œ ๊ฒƒ๊ณผ ๋™์ผ
      • ์ˆซ์ž

        • long : 64๋น„ํŠธ ์ •์ˆ˜ (-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
        • integer : 32๋น„ํŠธ ์ •์ˆ˜ (-2147483648 ~ 2147483647)
        • short : 16๋น„ํŠธ ์ •์ˆ˜ (-32768 ~ 32767)
        • byte : 8๋น„ํŠธ ์ •์ˆ˜ (-128 ~ 127)
        • double : 64๋น„ํŠธ ์‹ค์ˆ˜
        • float : 32๋น„ํŠธ ์‹ค์ˆ˜
        • half_float : 16๋น„ํŠธ ์‹ค์ˆ˜
        • scaled_float : ์‹ค์ˆ˜ํ˜•์ด์ง€๋งŒ ๋ถ€๋™์†Œ์ˆ˜์ ์ด ์•„๋‹ˆ๋ผ long ํ˜•ํƒœ๋กœ ์ €์žฅํ•˜๊ณ  ์˜ต์…˜์œผ๋กœ ์†Œ์ˆ˜์  ์œ„์น˜๋ฅผ ์ง€์ •
      • ๋‚ ์งœ - date

        • ๋‚ ์งœ ๊ฐ’์€ 2016-01-01 ๋˜๋Š” 2016-01-01T10:15:30 ๊ณผ ๊ฐ™์ด JSON ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ISO8601 ํ˜•์‹์„ ์‚ฌ์šฉ
          • EX) GET phones/_search { "query": { "range": { "date": { "gt": "2016-01-01" } } } } ( date ๊ฐ’์ด 2016-01-01 ์ดํ›„์ธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ )
        • ์ฟผ๋ฆฌ์˜ ๋‚ ์งœ ํฌ๋งท์„ ๋‹ค๋ฅด๊ฒŒ ํ•˜๊ณ  ์‹ถ์œผ๋ฉด format ์˜ต์…˜์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ, || ์„ ์‚ฌ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐ’์˜ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅ
          • EX) GET phones/_search { "query": { "range": { "date": { "gt": "31/12/2015", "lt": "2018", "format": "dd/MM/yyyy||yyyy" } } } } ( date ๊ฐ’์ด 2016-01-01 ~ 2018-01-01 ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ )
        • ๋‚ ์งœ๋ฅผ ๊ฒ€์ƒ‰ ํ•  ๋•Œ ์˜ˆ์•ฝ์–ด ์‚ฌ์šฉ๊ฐ€๋Šฅ
          • now(ํ˜„์žฌ์‹œ๊ฐ„), y(๋…„), M(์›”), d(์ผ), h(์‹œ), m(๋ถ„), s(์ดˆ), w(์ฃผ)
          ์‹ฌ๋ณผ ์˜๋ฏธ ์˜ˆ) 2019-09-12T17:13:07.428+09:00RDB
          yyyy ๋…„๋„ 2019
          MM ์›” - ์ˆซ์ž 09
          MMM ์›” - ๋ฌธ์ž (3์ž๋ฆฌ) Sep
          MMMM ์›” - ๋ฌธ์ž (์ „์ฒด) September
          dd ์ผ 12
          a ์˜ค์ „ / ์˜คํ›„ PM
          HH ์‹œ๊ฐ (0~23) 17
          kk ์‹œ๊ฐ (01~24) 17
          hh ์‹œ๊ฐ (01~12) 05
          h ์‹œ๊ฐ (1~12) 5
          mm ๋ถ„ (00~59) 13
          m ๋ถ„ (0~59) 13
          ss ์ดˆ (00~59) 07
          s ์ดˆ (0~59) 7
          SSS ๋ฐ€๋ฆฌ์ดˆ 428
          Z ํƒ€์ž„์กด +0900 / +09:00
          e ์š”์ผ (์ˆซ์ž 1:์›” ~ 7:์ผ) 4
          E ์š”์ผ (ํ…์ŠคํŠธ) Thu
      • ๋ถˆ๋ฆฌ์–ธ - boolean

        • true ์™€ false ๋‘๊ฐ€์ง€ ๊ฐ’์„ ๊ฐ–๋Š” ํ•„๋“œ ํƒ€์ž….
        • ์„ ์–ธ์€ "type": "boolean"
        • "true" ์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด๋กœ ์ž…๋ ฅ์ด ๋˜์–ด๋„ true ๋กœ ํ•ด์„์ด ๋˜์–ด ์ €์žฅ.
      • Object

        • ํ•œ ํ•„๋“œ ์•ˆ์— ํ•˜์œ„ ํ•„๋“œ๋ฅผ ๋„ฃ๋Š” object, ์ฆ‰ ๊ฐ์ฒด ํƒ€์ž…์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

        • "name", "age", "side" ๋ฅผ ๊ฐ€์ง„ object ํƒ€์ž… "characters" ํ•„๋“œ

          • ์„ ์–ธ
          PUT movie
          {
            "mappings": {
              "properties": {
                "characters": {
                  "properties": {
                    "name": {
                      "type": "text"
                    },
                    "age": {
                      "type": "byte"
                    },
                    "side": {
                      "type": "keyword"
                    }
                  }
                }
              }
            }
          }
          
          • ๋„ํ๋จผํŠธ ์ž…๋ ฅ
          PUT movie/_doc/1
          {
            "characters": {
              "name": "Iron Man",
              "age": 46,
              "side": "superhero"
            }
          }
          
          • object ํ•„๋“œ๋ฅผ ์ฟผ๋ฆฌ๋กœ ๊ฒ€์ƒ‰ ํ•˜๊ฑฐ๋‚˜ ์ง‘๊ณ„๋ฅผ ํ•  ๋•Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด . ๋ฅผ ์ด์šฉํ•ด์„œ ํ•˜์œ„ ํ•„๋“œ์— ์ ‘๊ทผ
          GET movie/_search
          {
            "query": {
              "match": {
                "characters.name": "Iron Man"
              }
            }
          }
          
          • ์—ญ ์ƒ‰์ธ์€ ํ•„๋“œ ๋ณ„๋กœ ์ƒ์„ฑ
          PUT movie/_doc/2
          {
            "title": "The Avengers",
            "characters": [
              {
                "name": "Iron Man",
                "side": "superhero"
              },
              {
                "name": "Loki",
                "side": "villain"
              }
            ]
          }
          
          PUT movie/_doc/3
          {
            "title": "Avengers: Infinity War",
            "characters": [
              {
                "name": "Loki",
                "side": "superhero"
              },
              {
                "name": "Thanos",
                "side": "villain"
              }
            ]
          }
          

          ์œ„์™€ ๊ฐ™์ด ์ƒ์„ฑ ์‹œ ์—ญ ์ƒ‰์ธ ๊ตฌ์กฐ

          image (12)
      • Nested

        • ์—ฌ๋Ÿฌ ๊ฐœ์˜ object ๊ฐ’๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ์—ญ ์ƒ‰์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๋„๋ก ํ•˜๋ ค๋ฉด nested ํƒ€์ž…์œผ๋กœ ์ง€์ •
        • nested ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•˜๋ ค๋ฉด ๋งคํ•‘์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด "type": "nested" ๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ object ์™€ ๋™์ผ
        • object ๋„ํ๋จผํŠธ์™€ nested ๋„ํ๋จผํŠธ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๋น„๊ต
        image (13)
      • ์œ„์น˜ ์ •๋ณด - Geo

        • Geo Point

          • ์œ„๋„(latitude)์™€ ๊ฒฝ๋„(longitude) ๋‘ ๊ฐœ์˜ ์‹ค์ˆ˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์ง€๋„ ์œ„์˜ ํ•œ ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’
          • geo_point ์ž…๋ ฅ ์˜ˆ์‹œ
          object ํ˜•์‹
          PUT my_locations/_doc/1
          {
            "location": {
              "lat": 41.12,
              "lon": -71.34
            }
          }
          text ํ˜•์‹
          PUT my_index/_doc/2
          {
            "location": "41.12,-71.34"
          }
          
          • Geo Point ํ•„๋“œ ๋งคํ•‘์„ ์–ธ
          PUT my_geo
          {
            "mappings": {
              "properties": {
                "location": {
                  "type": "geo_point"
                }
              }
            }
          }
          
          • geo_bounding_box ์ฟผ๋ฆฌ
          ๋ฐ์ดํ„ฐ ์ž…๋ ฅ
          PUT my_geo/_bulk
          {"index":{"_id":"1"}}
          {"station":"๊ฐ•๋‚จ","location":{"lon":127.027926,"lat":37.497175},"line":"2ํ˜ธ์„ "}
          {"index":{"_id":"2"}}
          {"station":"์ข…๋กœ3๊ฐ€","location":{"lon":126.991806,"lat":37.571607},"line":"3ํ˜ธ์„ "}
          {"index":{"_id":"3"}}
          {"station":"์—ฌ์˜๋„","location":{"lon":126.924191,"lat":37.521624},"line":"5ํ˜ธ์„ "}
          {"index":{"_id":"4"}}
          {"station":"์„œ์šธ์—ญ","location":{"lon":126.972559,"lat":37.554648},"line":"1ํ˜ธ์„ "}
          
          ๋‘ ์ ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ๋„ค๋ชจ ์˜์—ญ ์•ˆ์— ์žˆ๋Š” ๋„ํ๋จผํŠธ GET
          GET my_geo/_search
          {
            "query": {
              "geo_bounding_box": {
                "location": {
                  "bottom_right": {
                    "lat": 37.4899,
                    "lon": 127.0388
                  },
                  "top_left": {
                    "lat": 37.5779,
                    "lon": 126.9617
                  }
                }
              }
            }
          }
          
          image (14)
          ํ•œ ์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ž…๋ ฅํ•œ ๋ฐ˜๊ฒฝ์˜ ์› ์•ˆ์— ์žˆ๋Š” ๋„ํ๋จผํŠธ GET
          GET my_geo/_search
          {
            "query": {
              "geo_distance": {
                "distance": "5km",
                "location": {
                  "lat": 37.5358,
                  "lon": 126.9559
                }
              }
            }
          }
          
          image (15)
        • Geo Shape

          • ์„ , ๋ฉด ๋“ฑ์˜ 2์ฐจ์› ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌ๊ฐ€๋Šฅ
          • geo_shape ํ•„๋“œ ์„ ์–ธ
          PUT my_shape
          {
            "mappings": {
              "properties": {
                "location": {
                  "type": "geo_shape"
                }
              }
            }
          }
          
          • ๋‹จ์ผ ์  ๊ฐ’ ์ž…๋ ฅ
          "type": "point" ํ˜•ํƒœ์˜ geo_shape ๊ฐ’ ์ž…๋ ฅ
          PUT my_shape/_doc/1
          {
            "location": {
              "type": "point",
              "coordinates": [
                127.027926,
                37.497175
              ]
            }
          }
          
          image (16)
          • ์—ฌ๋Ÿฌ ์  ๊ฐ’ ์ž…๋ ฅ
          "type": "multipoint" ํ˜•ํƒœ์˜ geo_shape ๊ฐ’ ์ž…๋ ฅ
          PUT my_shape/_doc/2
          {
            "location": {
              "type": "multipoint",
              "coordinates": [
                [ 127.027926, 37.497175 ],
                [ 126.991806, 37.571607 ],
                [ 126.924191, 37.521624 ],
                [ 126.972559, 37.554648 ]
              ]
            }
          }
          
          image (17)
          • ์ง์„  ๊ฐ’ ์ž…๋ ฅ
          "type": "linestring" ํ˜•ํƒœ์˜ geo_shape ๊ฐ’ ์ž…๋ ฅ
          PUT my_shape/_doc/3
          {
            "location": {
              "type": "linestring",
              "coordinates": [
                [ 127.027926, 37.497175 ],
                [ 126.991806, 37.571607 ]
              ]
            }
          }
          
          image (18)
          • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ง์„  ๊ฐ’ ์ž…๋ ฅ
          "type": "multilinestring" ํ˜•ํƒœ์˜ geo_shape ๊ฐ’ ์ž…๋ ฅ
          PUT my_shape/_doc/4
          {
            "location": {
              "type": "multilinestring",
              "coordinates": [
                [
                  [ 127.027926, 37.497175 ],
                  [ 126.991806, 37.571607 ]
                ],
                [
                  [ 126.924191, 37.521624 ],
                  [ 126.972559, 37.554648 ]
                ]
              ]
            }
          }
          
          image (19)
          • ๋‹ค๊ฐํ˜• ๊ฐ’ ์ž…๋ ฅ - ๋ฐฐ์—ด ๋งˆ์ง€๋ง‰์—๋Š” ๋ฐ˜๋“œ์‹œ ์ฒ˜์Œ๊ณผ ๊ฐ™์€ ์ ์ด ์ž…๋ ฅ
          "type": "polygon" ํ˜•ํƒœ์˜ geo_shape ๊ฐ’ ์ž…๋ ฅ
          PUT my_shape/_doc/5
          {
            "location": {
              "type": "polygon",
              "coordinates": [
                [
                  [ 127.027926, 37.497175 ],
                  [ 126.991806, 37.571607 ],
                  [ 126.924191, 37.521624 ],
                  [ 126.972559, 37.554648 ],
                  [ 127.027926, 37.497175 ]
                ]
              ]
            }
          }
          
          image (20)
          • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๊ฐํ˜• ๊ฐ’ ์ž…๋ ฅ
          "type": "multipolygon" ํ˜•ํƒœ์˜ geo_shape ๊ฐ’ ์ž…๋ ฅ
          PUT my_shape/_doc/6
          {
            "location": {
              "type": "multipolygon",
              "coordinates": [
                [
                  [
                    [ 127.027926, 37.497175 ],
                    [ 126.991806, 37.571607 ],
                    [ 126.924191, 37.521624 ],
                    [ 127.004943, 37.504810 ],
                    [ 127.027926, 37.497175 ]
                  ]
                ],
                [
                  [
                    [ 126.936893, 37.555134 ],
                    [ 126.967894, 37.529170 ],
                    [ 126.924191, 37.521624 ],
                    [ 126.936893, 37.555134 ]
                  ]
                ]
              ]
            }
          }
          
          image (21)
          • ์ง์‚ฌ๊ฐํ˜• ์˜์—ญ ๊ฐ’ ์ž…๋ ฅ
          "type": "envelope" ํ˜•ํƒœ์˜ geo_shape ๊ฐ’ ์ž…๋ ฅ
          PUT my_shape/_doc/7
          {
            "location": {
              "type": "envelope",
              "coordinates": [
                [ 126.936893, 37.555134 ],
                [ 127.004943, 37.50481 ]
              ]
            }
          }
          
          image (22)
      • IP

        • IP ์ฃผ์†Œ ํ˜•์‹์„ ์ €์žฅ
        • ๋งคํ•‘์€ "type": "ip" ์œผ๋กœ ์„ ์–ธ
        • "192.168.1.1" ๊ฐ™์€ IPv4 ํ˜•์‹๊ณผ "0:0:0:0:0:ffff:c0a8:105" ๊ฐ™์€ IPv6 ํ˜•์‹์„ ๋ฌธ์ž์—ด ์ฒ˜๋Ÿผ ์ž…๋ ฅ
      • ๋ฒ”์œ„(Range)

        • ์ˆซ์ž๋‚˜ ๋‚ ์งœ, IP ๋“ฑ์„ ์‹œ์ž‘๊ณผ ๋์ด ์žˆ๋Š” 2์ฐจ์›์˜ ๋ฒ”์œ„ ํ˜•ํƒœ๋กœ ์ €์žฅ
        • ๋งคํ•‘์˜ "type" ์—integer_range, float_range, long_range, double_range, date_range, ip_range ๋“ฑ์œผ๋กœ ์„ ์–ธ
        integer_range ์™€ date_range ํƒ€์ž…์˜ ํ•„๋“œ ์„ ์–ธ
        PUT my_range
        {
          "mappings": {
            "properties": {
              "amount": {
                "type": "integer_range"
              },
              "days": {
                "type": "date_range"
              }
            }
          }
        }
        
        • ๋ฐ์ดํ„ฐ์˜ ๋ฒ”์œ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด gt, gte, lt, lte ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ง€์ •
        integer_range, date_range ํƒ€์ž…์˜ ๊ฐ’์„ ๊ฐ€์ง„ ๋„ํ๋จผํŠธ ์ž…๋ ฅ
        PUT my_range/_doc/1
        {
          "amount": {
            "gte": 19,
            "lt": 28
          },
          "days": {
            "gt": "2019-06-01T09:00:00",
            "lt": "2019-06-20"
          }
        }
        
        • ๋ฒ”์œ„ ๋ฐ์ดํ„ฐ๋ฅผ range ์ฟผ๋ฆฌ๋กœ ๊ฒ€์ƒ‰ ํ•  ๋•Œ๋Š” ์ถ”๊ฐ€๋กœ relation ์˜ต์…˜์˜ ๊ฐ’์„ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋ฉฐ ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜
          • within : ๋„ํ๋จผํŠธ ๋ฒ”์œ„ ๊ฐ’์ด ์ฟผ๋ฆฌํ•œ ๋ฒ”์œ„ ์•ˆ์— ์™„์ „ํžˆ ํฌํ•จ๋˜๋Š” ๋„ํ๋จผํŠธ๋“ค์„ ๊ฐ€์ ธ์˜ด.
          • contains : within๊ณผ ๋ฐ˜๋Œ€๋กœ ์ฟผ๋ฆฌ ๋ฒ”์œ„๊ฐ€ ๋„ํ๋จผํŠธ ๋ฒ”์œ„ ๊ฐ’ ์•ˆ์— ์™„์ „ํžˆ ํฌํ•จ๋˜๋Š” ๋„ํ๋จผํŠธ๋“ค์„ ๊ฐ€์ ธ์˜ด.
          • Intersects : ๋„ํ๋จผํŠธ ๋ฒ”์œ„ ๊ฐ’๊ณผ ์ฟผ๋ฆฌ ๋ฒ”์œ„์— ๊ณตํ†ต์ ์ธ ๋ถ€๋ถ„์ด ์žˆ๋Š” ๋„ํ๋จผํŠธ๋“ค์„ ๊ฐ€์ ธ์˜ด.
      • Binary

        • "type": "binary" ๋กœ ์ง€์ •ํ•ด์„œ ์‹œ์Šคํ…œ ํŒŒ์ผ์ด๋‚˜ ์ด๋ฏธ์ง€ ์ •๋ณด ๊ฐ™์€ ๋ฐ”์ด๋„ˆ๋ฆฌ ๊ฐ’์„ ์ €์žฅ
    • ๋ฉ€ํ‹ฐ (๋‹ค์ค‘) ํ•„๋“œ - Multi Field
      • ๋„ํ๋จผํŠธ์—๋Š” ํ•˜๋‚˜์˜ ํ•„๋“œ๊ฐ’๋งŒ ์žˆ์ง€๋งŒ ์ด ํ•„๋“œ์˜ ๊ฐ’์„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์—ญ ์ƒ‰์ธ ๋ฐ doc_values ๋“ค๋กœ ์ €์žฅ
      • "fields" : { } ํ•ญ๋ชฉ์—์„œ ๋‹ค์‹œ ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์„ค์ •
      • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์• ๋„๋ผ์ด์ €๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
       my_index ์ธ๋ฑ์Šค์˜ message ํ•„๋“œ์— ์„œ๋กœ ๋‹ค๋ฅธ ์• ๋„๋ผ์ด์ €๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” english, nori ๋ฉ€ํ‹ฐ ํ•„๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ์˜ˆ์ œ
       PUT my_index
      {
        "settings": {
          "analysis": {
            "analyzer": {
              "nori_analyzer": {
                "tokenizer": "nori_tokenizer"
              }
            }
          }
        },
        "mappings": {
          "properties": {
            "message": {
              "type": "text",
              "fields": {
                "english": {
                  "type": "text",
                  "analyzer": "english"
                },
                "nori": {
                  "type": "text",
                  "analyzer": "nori_analyzer"
                }
              }
            }
          }
        }
      }
      
      { "message": "My favorite ์Šˆํผ์˜์›… is Iron Man" } ์ด๋ผ๋Š” ๊ฐ’์„ ์ž…๋ ฅํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด 3๊ฐœ์˜ ์—ญ ์ƒ‰์ธ์ด ์ƒ์„ฑ image (23)
  • RDB๊ฐ€ ์ฝ๊ธฐ์„ฑ๋Šฅ์ด ๋‚ฎ์€ ์ด์œ 

    • ๊ด€๊ณ„ํ˜• DB์—์„œ๋Š” Text ์—ด์„ ํ•œ ์ค„์”ฉ ์ฐพ์•„ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ€์ ธ์˜ค๊ณ  ์—†์œผ๋ฉด ๋„˜์–ด๊ฐ.
    • row ์•ˆ์˜ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์ฝ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์†๋„๊ฐ€ ๋А๋ฆผ.
  • Active-Standby

    • ํ‰์ƒ ์‹œ์—๋Š” ํ•˜๋‚˜์˜ ์„œ๋ฒ„๋กœ ์šด์˜์„ ํ•˜๊ณ , ๊ทธ์™€ ์ŠคํŽ™์ด ๋น„์Šทํ•œ ์„œ๋ฒ„๋ฅผ ์˜ˆ๋น„๋กœ ์ค€๋น„. ์˜ˆ๋น„์„œ๋ฒ„๋Š” ์–ธ์ œ๋ผ๋„ ๋ถ€ํŒ…ํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋กœ ์ค€๋น„ ํ•ฉ๋‹ˆ๋‹ค. ์žฅ์• ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด ๊ด€๋ฆฌ์ž๊ฐ€ ํŒ๋‹จํ•˜์—ฌ ์˜ˆ๋น„์„œ๋ฒ„๋กœ ์„œ๋น„์Šค ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํŒ๋‹จ์ด ๋˜๋ฉด Data์˜์—ญ์˜ ๋””์Šคํฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์˜ˆ๋น„์„œ๋ฒ„๋กœ ์ด์ „ํ•œ ํ›„ ์˜ˆ๋น„์„œ๋ฒ„๋กœ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    • ์ด ํ˜•ํƒœ๋Š” ์ €๋ ดํ•œ ๋น„์šฉ์œผ๋กœ ์ด์ค‘ํ™”๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹œ์Šคํ…œ ์žฅ์•  ์‹œ๊ฐ„์ด ๊ธธ๊ณ  ์•ˆ์ •์„ฑ์ด ์ ์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • Active-Active

    • ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ ์„œ๋ฒ„๋ณ„๋กœ ๊ณ ๋ฃจ ๋ถ„์‚ฐ๋˜๋„๋ก ๊ตฌ์„ฑ์ด ๋˜๊ณ , ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์ด ์†ํ•œ ์„œ๋ฒ„์—์„œ๋งŒ ์„œ๋น„์Šค๋ฅผ ์ด์šฉ
      • ํ•œ์ชฝ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฐ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ์ž ์ƒ์„ฑ ์‹œ ๊ณ ๋ฃจ ๋ถ„ํฌ๋˜๋„๋ก ์œ ์˜
    • ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๋ง(Clustering) SW์— ์˜ํ•ด ๊ฐ์ง€๊ฐ€ ๋˜๊ณ  ์ž๋™์œผ๋กœ ์„œ๋น„์Šค ์ ˆ์ฒด ๋ฐ ์ด์ „
      • ์„œ๋ฒ„#1์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์„œ๋ฒ„#1์˜ ์ •๋ณด๊ฐ€ ์„œ๋ฒ„#2๋กœ ์ด์ „๋˜์–ด ์„œ๋ฒ„#2์—์„œ ์„œ๋ฒ„#1์˜ ์„œ๋น„์Šค๋ฅผ ๋Œ€์‹  ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ์„œ ์‹œ์Šคํ…œ ์žฅ์•  ์‹œ๊ฐ„์„ ์ตœ์†Œ
  • split brain elasticsearch

    • Split Brain
      • ๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ๋กœ ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜๋ฉด ๊ฐ์ž๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด ๊ณ„์† ๋™์ž‘, ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ณต๊ตฌ ๋˜๊ณ  ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋‹ค์‹œ ํ•ฉ์ณ์กŒ์„ ๋•Œ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ณ  ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ์†์‹ค๋˜๋Š” ํ˜„์ƒ.
      • ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜๋งŒ ๋†“๊ฒŒ ๋˜๋ฉด ๊ทธ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์œ ์‹ค๋˜์—ˆ์„ ๋•Œ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด๊ฐ€ ์ž‘๋™์„ ์ •์ง€ ํ•  ์œ„ํ—˜
      • ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ๋“ค์€ 3๊ฐœ ์ด์ƒ์˜ ํ™€์ˆ˜ ๊ฐœ๋ฅผ ๋†“๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ
      image (3)
  • elasticsearch shard performance

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

GET smart_park/_mapping
{
  "query": {
    "match_all": {}
  }
}
GET smart_park2/_search
{
  "query": {
    "match_all": {}
  }
}
GET smart_park/_search
{
  "script_fields": {
    "hour_of_day": {
      "script":{
        "lang": "painless",
        "source":"doc['time'].value.getHour()"
      }
    }
  }
}
GET smart_park/_search
{
  "script_fields": {
    "hour_of_day": {
      "script":{
        "lang": "painless",
        "source":"""
def ts=doc['time'];
def cal=Calendar.getInstance();
cal.setTime(ts);
def dowNum=cal.get(Calendar.DAY_OF_WEEK);
return dowNum
"""
      }
    }
  }
}

PUT _ingest/pipeline/hour
{
  "description": "add hour_of_day and day_of_week field from @timestamp",
  "processors": [
    {
      "script":{
        "lang": "painless",
        "source":"""
def ts=ctx['time'];
def sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
def date=sdf.parse(ts);
def cal=Calendar.getInstance();
cal.setTime(date);

ctx.hour_of_day = cal.get(Calendar.HOUR_OF_DAY);

def dowNum=cal.get(Calendar.DAY_OF_WEEK);
def dowEn=['t','SUN','MON','TUE','Wed','Thu','Fri','Sat'][dowNum];
def dowKr=['t','์ผ','์›”','ํ™”','์ˆ˜','๋ชฉ','๊ธˆ','ํ† '][dowNum];

ctx.day_of_week = ["num":dowNum, "en":"downEn","kr":dowKr]
"""
      }
    }
  ]
}

POST _reindex
{
  "source": {
    "index": "smart_park"
  },
  "dest": {
    "index": "smart_park2",
    "pipeline": "hour"
  }
}
PUT /smart_park2
{
  "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
      "properties" : {
        "dust" : {
          "type" : "float"
        },
        "humid" : {
          "type" : "float"
        },
        "lux" : {
          "type" : "float"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "shumid" : {
          "type" : "float"
        },
        "temper" : {
          "type" : "float"
        },
        "time" : {
          "type" : "date"
        },
        "trash" : {
          "type" : "float"
        },
        "udust" : {
          "type" : "float"
        },
        "visitor" : {
          "type" : "integer"
        }
      }
    }
}

2_2 Logstash

  • ๊ธฐ๋Šฅ

    • ์˜คํ”ˆ์†Œ์Šค ์„œ๋ฒ„์ธก ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ & ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ๋„๊ตฌ
    • ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ, ๋กœ์šฐ ๋ฐ์ดํ„ฐ, ์œˆ๋„์šฐ ์ด๋ฒคํŠธ ๋“ฑ์œผ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘
    • ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘๊ณ„ ๋ฐ ๋ณด๊ด€, ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘
    • ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜ ํ›„ ElasticSearch๋กœ ์ „์†ก
    • Pipeline ๊ตฌ์กฐ(Input -> Filter -> Output)
  • ๊ฐœ๋…์ •๋ฆฌ

  1. input

    • ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•˜์—ฌ Logstash์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„๋“ค์ž„
    • ๋ฐ์ดํ„ฐ ํƒ€์ž… - file, syslog(RFC3164 ํ˜•์‹), beats(Filebeat)
  2. filter

    • Logstash ํŒŒ์ดํ”„ ๋ผ์ธ์˜ ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ์žฅ์น˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณต
      • grok : ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ์ž„์˜์˜ ํ…์ŠคํŠธ๋กœ ๊ตฌ์„ฑ
      • mutate : ์ด๋ฒคํŠธ ํ•„๋“œ์—์„œ ์ผ๋ฐ˜์ ์ธ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰
      • drop : ์ด๋ฒคํŠธ๋ฅผ ์‚ญ์ œ
      • clone : ์ด๋ฒคํŠธ์˜ ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ
      • geoip : ip ์ฃผ์†Œ์˜ ์ง€๋ฆฌ์  ์œ„์น˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€
  3. output

    • Logstash ํŒŒ์ดํ”„ ๋ผ์ธ์˜ ์ตœ์ข… ๋‹จ๊ณ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅ
      • elasticsearch : ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ elasticsearch์— ์ „์†ก
      • file : ๋””์Šคํฌ ํŒŒ์ผ์— ์ž‘์„ฑ
      • graphite : graphite์— ์ „์†ก (graphite : ๋ฉ”ํŠธ๋ฆญ์„ ์ €์žฅํ•˜๊ณ  ๊ทธ๋ž˜ํ”„๋กœ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ)
      • statsd : ์นด์šดํ„ฐ ๋ฐ ํƒ€์ด๋จธ์™€ ๊ฐ™์€ ํ†ต๊ณ„๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  UDP๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋ฉฐ, ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”Œ๋Ÿฌ๊ทธ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ์ง‘๊ณ„๋ฅผ ๋ณด๋‚ด๋Š” ์„œ๋น„์Šค
  4. codec

    • ์ž…๋ ฅ ๋˜๋Š” ์ถœ๋ ฅ์˜ ์ผ๋ถ€๋กœ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๋Š” ์ŠคํŠธ๋ฆผ ํ•„ํ„ฐ
    • ๋Œ€ํ‘œ์ ์ธ ์ฝ”๋ฑ์—๋Š” json, msgpack, plain์ด ์žˆ๋‹ค.
      • json : JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๊ฑฐ๋‚˜ ๋””์ฝ”๋”ฉ
      • multiline : ์ž๋ฐ” ์˜ˆ์™ธ ๋ฐ ์Šคํƒ ์ถ”์ฒ™ ๋ฉ”์‹œ์ง€์™€ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์ค„ ํ…์ŠคํŠธ ์ด๋ฒคํŠธ๋ฅผ ๋‹จ์ผ ์ด๋ฒคํŠธ๋กœ ๋ณ‘ํ•ฉ

2_3 Kibana

  • ๊ธฐ๋Šฅ
    • ์‚ฌ์šฉ์ž Application์œผ๋กœ Elastic Search์— ์ €์žฅ๋œ ์ •๋ณด๋“ค์„ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ํ•˜๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ

2_4 Filterbeats

  • ๊ธฐ๋Šฅ
    • ์„œ๋ฒ„์— ๊ฒฝ๋Ÿ‰ ์—์ด์ „ํŠธ๋กœ ์„ค์น˜๋˜์–ด ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ Logstash ๋˜๋Š” ElasticSearch๋กœ ์ „์†ก(์ŠคํŠธ๋ฆฌ๋ฐ)ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋ฐ์ดํ„ฐ ๋ฐœ์†ก์ž
    • Filebeat, Metricbeat, Packetbeat, Winlogbeat, Heartbeat ๋“ฑ์ด ์žˆ์œผ๋ฉฐ Libbeat์„ ์ด์šฉํ•˜์—ฌ ์ง์ ‘ ๊ตฌ์ถ•๋„ ๊ฐ€๋Šฅ
    • ๊ฐœ๋…์ •๋ฆฌ
  1. FileBeat
    • ์„œ๋ฒ„์—์„œ ๋กœ๊ทธํŒŒ์ผ์„ ์ œ๊ณต
  2. PacketBeat
    • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์„œ๋ฒ„๊ฐ„์— ๊ตํ™˜๋˜๋Š” ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ๋ถ„์„๊ธฐ
  3. MetricBeat
    • ์„œ๋ฒ„์—์„œ ์‹คํ–‰์ค‘์ธ ์šด์˜ ์ฒด์ œ ๋ฐ ์„œ๋น„์Šค์—์„œ Metrics๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ˆ˜์ง‘ํ•˜๋Š” ์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง ์—์ด์ „ํŠธ
  4. WinlogBeat
    • Windows ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ฅผ ์ œ๊ณต

3_ Kafka

  1. ๋“ฑ์žฅ๋ฐฐ๊ฒฝ
  • ์ดˆ๊ธฐ - ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ 

image (3)

  • ํ›„๊ธฐ - ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํ†ต์‹ 

image (3)

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” line์ด ๋ณต์žกํ•ด์ง
    • ๋ฐฐํฌ์™€ ์žฅ์• ์— ๋Œ€์‘ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง.
    • ์ถ”ํ›„ ๋ฐ์ดํ„ฐ ํฌ๋งท์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง.
    • Protocol ํฌ๋งท์˜ ํŒŒํŽธํ™”๊ฐ€ ์‹ฌํ•ด์ง.
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋งํฌ๋“œ์ธ์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ์˜คํ”ˆ์†Œ์Šค

image (3)

  1. Apache Kafka
  • ์นดํ”„์นด๋Š” ์†Œ์Šค์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํƒ€๊ฒŸ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ปคํ”Œ๋ง์„ ์ถ•์†Œํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅ.
  • source์—์„œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํฌ๋งท์—๋Š” ๊ฑฐ์˜ ์ œํ•œ์ด ์—†๋‹ค.

image (3)

  • ์นดํ”„์นด๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š” ํ† ํ”ฝ์˜ ํ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • Producer - ํ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์Œ.
    • Consumer - ํ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐ.
  • Fault tolerant (๊ณ ๊ฐ€์šฉ์„ฑ)
    • ์„œ๋ฒ„์— ์ด์Šˆ๊ฐ€ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ๊ฐ‘์ž๊ธฐ ๋ž™์ด ๋‚ด๋ ค๊ฐ€๋Š” ๋“ฑ์˜ ์ƒํ™ฉ์—์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์†์‹ค์—†์ด ๋ณต๊ตฌ ๊ฐ€๋Šฅ
    • ๋‚ฎ์€ ์ง€์—ฐ(latency), ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰(throuhput)์œผ๋กœ ํšจ๊ณผ์ ์œผ๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • Topic

image (3)

  • Kafka์—์„œ ๊ด€๋ฆฌํ•˜๋Š” data๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„
  • topic์˜ ์ด๋ฆ„์€ ๋ชฉ์ ์— ๋”ฐ๋ผ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋Š”์ง€ ๋ช…์‹œ -> ์œ ์ง€๋ณด์ˆ˜ ์‹œ ํŽธ๋ฆฌ.
  • Topic๋‚ด๋ถ€
    • ํ•˜๋‚˜์˜ ํ† ํ”ฝ์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๊ตฌ์„ฑ๋จ.
    • ํ•˜๋‚˜์˜ ํŒŒํ‹ฐ์…˜์€ ํ์™€ ๊ฐ™์ด ๋์—์„œ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์žฌ.
    • Consumer๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ž˜๋œ ์ˆœ(0,1,...)์œผ๋กœ ๊ฐ€์ ธ๊ฐ.

image (3)

  • ๋”์ด์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์˜ค์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๋“ค์–ด์˜ฌ ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐ.
  • consumer๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋„ ๋ฐ์ดํ„ฐ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์•„ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‘ ๋ฒˆ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

image (3)

  • ๋‘๊ฐœ ์ด์ƒ์˜ partition

image (3)

  • Producer๊ฐ€ data๋ฅผ ๋ณด๋‚ผ ๋•Œ key๋ฅผ ์ง€์ • ๊ฐ€๋Šฅ (key๋ฅผ ํ•ด์‹ฑํ•˜์—ฌ ํŠน์ • ํŒŒํ‹ฐ์…˜์— ์ €์žฅ)

  • ํŒŒํ‹ฐ์…˜์„ ๋Š˜๋ฆฌ๋ฉด consumer์˜ ์ˆ˜๋ฅผ ๋Š˜๋ ค ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

  • ํŒŒํ‹ฐ์…˜์„ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜๋‚˜, ์ค„์ด๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ

  • ํŒŒํ‹ฐ์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ˆœ๊ฐ„ ํ‚ค - ํŒŒํ‹ฐ์…˜ ๊ฐ„์˜ ์ผ๊ด€์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

  • ํŒŒํ‹ฐ์…˜์˜ data ์‚ญ์ œ

    • ์ตœ๋Œ€ ์ €์žฅ ์šฉ๋Ÿ‰, ์ตœ๋Œ€ ์ €์žฅ ์‹œ๊ฐ„ ์˜ต์…˜์„ ์„ค์ •ํ•˜์—ฌ ์ด์— ๋”ฐ๋ผ ์ ์ ˆํžˆ ์‚ญ์ œ๋จ.
  • Producer

    • ๋ฐ์ดํ„ฐ๋ฅผ kafka์— ๋ณด๋‚ด๋Š” ๊ฐ์ฒด
    • ๋Œ€๋Ÿ‰์˜ ๋กœ๊ทธ๋“ค์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ kafka์— ์ ์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    image (3)
  • ์—ญํ• 

    • Topic์— ํ•ด๋‹นํ•˜๋Š” ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ
    • ํŠน์ • topic์œผ๋กœ data๋ฅผ publish
    • ์ „์†ก ์„ฑ๊ณต์—ฌ๋ถ€ ํ™•์ธํ›„, ์‹คํŒจ์‹œ ์žฌ์‹œ๋„
  • Consumer

    • Data๋ฅผ Kafka๋กœ ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜จ๋‹ค(polling)

      • ์ฝํžŒ data๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.
    • data pipeline์˜ ํŠน์„ฑ์„ ๊ฐ–๋Š”๋‹ค.

    • ์—ญํ• 

      • Topic์˜ partiton์œผ๋กœ๋ถ€ํ„ฐ data polling
      • Partition offset ์œ„์น˜ ๊ธฐ๋ก (commit)
      • Consumer group์„ ํ†ตํ•ด ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ
    • offset

      • Topic๊ณผ partition๋ณ„๋กœ ์ง€์ •.
      • Consumer๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋А ์ง€์ ๊นŒ์ง€ ์ฝ์—ˆ๋Š”์ง€ ๋‚˜ํƒ€๋ƒ„.
      • Consumer๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์€ offset ์ •๋ณด๋Š” kafka ๋‚ด๋ถ€์— ์ €์žฅ - consumer์— ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ณต๊ตฌ ๊ฐ€๋Šฅ
      image (3)
    • multiple consumer

      • #partition > #consumer
        • consumer๊ฐ€ ๊ฐ๊ฐ 1~n๊ฐœ์˜ partition์„ ๋งก์•„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
      • #partition = #consumer
        • consumer๊ฐ€ ๊ฐ๊ฐ 1๊ฐœ์”ฉ partition์„ ๋งก์•„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
      • #partition < #consumer
        • ์ผ๋ถ€ consumer๋Š” partition์„ ํ• ๋‹น๋ฐ›์ง€ ์•Š์•„ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค.
      image (3)
    • Different groups

      • Consumer group๊ณผ topic ๋ณ„๋กœ kafka์— consumer offset์„ ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜์—ฌ ๊ฐ consumer group์ด ํƒ€ consumer group์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๊ณ  ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
      image (3)
    • kafka์˜ ํ•ต์‹ฌ์š”์†Œ

      • kafka์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์œ ์ง€ํ•˜๋Š”๋ฐ์— ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

      • Broker

        • Kafka๊ฐ€ ์„ค์น˜๋˜์–ด์žˆ๋Š” ์„œ๋ฒ„ ๋‹จ์œ„
        • ๋ณดํ†ต 3๊ฐœ ์ด์ƒ ์‚ฌ์šฉ ๊ถŒ์žฅ
        • ๋ธŒ๋กœ์ปค๊ฐ€ 3๋Œ€๋ผ๋ฉด 3๋Œ€ ์ค‘ 1๋Œ€์— ํ•ด๋‹น ํ† ํ”ฝ์˜ data๊ฐ€ ์ €์žฅ
      • Replication

        • ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ์ƒ๊ธธ ๋•Œ, ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
        • Partition์˜ ๋ณต์ œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
        • Broker์— ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•ด ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•ด์งˆ ๊ฒฝ์šฐ, ๋ณต์ œ๋ณธ์„ ํ†ตํ•ด ๋ณต๊ตฌ๊ฐ€๋Šฅ
        image (3)
      • ISR (In Sync Replica)

        • Leader partition(์›๋ณธ) + follower partition(๋ณต์ œ๋ณธ)
    • Lag

      • Producer์˜ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ์†๋„๊ฐ€ Consumer๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋Š” ์†๋„๋ณด๋‹ค ๋น ๋ฅธ ๊ฒฝ์šฐ ๋ฐœ์ƒ
      • Producer์˜ ๋งˆ์ง€๋ง‰ ์‚ฝ์ž… offset๊ณผ Consumer์˜ ๋งˆ์ง€๋ง‰ read offset๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์˜๋ฏธํ•จ.
      image (3)
      • Partition์˜ ๊ฐœ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ด๋ฉด lag๋„ ์—ฌ๋Ÿฌ๊ฐœ ์กด์žฌ ๊ฐ€๋Šฅ
      • ๊ฐ€์žฅ ํฐ lag์„ records-lag-max๋ผ ํ•จ.
      image (3)
    • Burrow

      • Consumer lag ๋ชจ๋‹ˆํ„ฐ๋ง์„ ๋„์™€์ฃผ๋Š” ๋…๋ฆฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
      • ๋ฉ€ํ‹ฐ ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ง€์›
      • sliding window - consumer์˜ status ์ฒดํฌ
      • HTTP API๋ฅผ ํ†ตํ•ด ์œ„์˜ ์ •๋ณด๋ฅผ ์ œ๊ณต
    • CMAK

      • Kafka ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ tool
      • ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ  partition์„ ์žฌํ• ๋‹นํ•˜๋ฉฐ, topic์„ ์ƒ์„ฑ, ํ‘œ์‹œํ•˜๋Š” ๋“ฑ management๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋‹ค.
    • Coordination service

      • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์„ค๊ณ„์‹œ, ๋ถ„์‚ฐ๋œ ์‹œ์Šคํ…œ๊ฐ„์˜ ์ •๋ณด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ณต์œ ํ•  ๊ฒƒ์ด๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ์„œ๋ฒ„๋“ค์˜ ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๊ณ , ๋ถ„์‚ฐ ์„œ๋น„์Šค๋“ค๊ฐ„์˜ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•œ ๋ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์ด ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.
      • ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Coordination service system์ด ์กด์žฌํ•˜๋ฉฐ, ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด zookeeper์ด๋‹ค.
    • zookeeper

      • ๋””๋ ‰ํ† ๋ฆฌ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ
      • ๋ถ„์‚ฐ๋˜์–ด ์žˆ๋Š” ๊ฐ application์˜ ์ •๋ณด๋ฅผ ์ค‘์•™์— ์ง‘์ค‘ํ•˜๊ณ  ๊ตฌ์„ฑ๊ด€๋ฆฌ, ๊ทธ๋ฃน ๊ด€๋ฆฌ ๋„ค์ด๋ฐ, ๋™๊ธฐํ™” ๋“ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
      • ์ƒํƒœ์ •๋ณด๋ฅผ znode๋ผ๋Š” ๊ณณ์— key-value ํ˜•ํƒœ๋กœ ์ €์žฅํ•œ๋‹ค.
      • Znode์— ์ €์žฅ๋œ key-value๋ฅผ ์ด์šฉํ•ด ๋ถ„์‚ฐ application๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.
      image (3)
    • Znode

      • ์ž์‹๋…ธ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ
      image (3)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors