- ์ฌ์ฉ์๊ฐ ์๋ฒ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก๋ถํฐ ์ํ๋ ๋ฐ์ดํฐ ๋ฐ ๋ก๊ทธ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์งํ๊ณ ๊ฒ์, ๋ถ์ํ์ฌ ์๊ฐํ ์ํค๋ ์คํ์์ค ์๋น์ค
- Elastic Search + Logstash + Kibana + Filebeat
-
๊ธฐ๋ฅ
- ํ์ฅ์ฑ์ด ๋งค์ฐ ์ข์ ์คํ์์ค ๊ฒ์์์ง
- Lucene ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ๊ฒ์ ๋ฐ ๋ถ์ ์์ง์ด๋ค.
- ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ ์ค์๊ฐ์ผ๋ก ์ ์ฅ, ๊ฒ์ ๋ฐ ๋ถ์ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฅผ ์ค์ฌ๋ถ์ ์ ์ฅํ์ฌ ์์๋๋ ํญ๋ชฉ์ ๊ฒ์ํ๊ณ ์์์น ๋ชปํ ํญ๋ชฉ์ ๋ฐํ๋ผ ์ ์๋ค.
- ์ ํ, ๋น์ ํ, ์์น์ ๋ณด, ๋ฉํธ๋ฆญ ๋ฑ ์ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์ํ ์ ํ์ ๊ฒ์์ ์ํํ๊ณ ๊ฒฐํฉํ ์ ์๋ค.
- ํ์ค RESTful API์ JSON์ ์ฌ์ฉํ๋ค.
-
๊ฐ๋ ์ ๋ฆฌ
-
full text ๊ฒ์
-
๊ด๊ณํ DB์์๋ Text ์ด์ ํ ์ค์ฉ ์ฐพ์ ๋ด๋ ค๊ฐ๋ฉด์ ํค์๋๊ฐ ์์ผ๋ฉด ๊ฐ์ ธ์ค๊ณ ์์ผ๋ฉด ๋์ด๊ฐ.
- row ์์ ๋ด์ฉ์ ๋ชจ๋ ์ฝ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋๊ฐ ๋๋ฆผ.
-
์ญ ์ธ๋ฑ์ค(Inverted Index)๋ผ๋ ๊ตฌ์กฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค. (ํด๋น ํค์๋๊ฐ ์ด๋ค doc์ ์๋ค๊ณ ์ ์ฅํ๋ค.)
- ์ฑ ์ ๋งจ ๋ค ์ฃผ์ ํค์๋์ ๋ํ ๋ด์ฉ์ด ๋ช ํ์ด์ง์ ์๋์ง ๋ณผ ์ ์๋ ์ฐพ์๋ณด๊ธฐ ํ์ด์ง์ ์ ์ฌ.
- ์ถ์ถ๋ ๊ฐ ํค์๋๋ฅผ ํ (term) ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์ด๋ ๊ฒ ์ญ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด term์ ํฌํจํ๊ณ ์๋ ๋ํ๋จผํธ๋ค์ id๋ฅผ ๋ฐ๋ก ์ป์ด์ฌ ์ ์์.
- ๋ฐ์ดํฐ ์ถ๊ฐ ์ ์ฝ์ด์ผ ํ ํ์ด ๋์ด๋๋ ๊ฒ์ด ์๋๋ผ ์ญ ์ธ๋ฑ์ค๊ฐ ๊ฐ๋ฆฌํค๋ id์ ๋ฐฐ์ด๊ฐ์ด ์ถ๊ฐ๋๋ ๊ฒ ๋ฟ์ด๊ธฐ ๋๋ฌธ์ ํฐ ์๋์ ์ ํ ์์ด ๋น ๋ฅธ ์๋๋ก ๊ฒ์์ด ๊ฐ๋ฅ
-
ํ ์คํธ ๋ถ์(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'm so <b>happy</b>!</p>" }(<p>I'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)๋ฑ์ด ์๋ค
-
-
Near Realtime
- ๊ฑฐ์ ์ค์๊ฐ ๊ฒ์ ํ๋ซํผ์ด๋ผ๋ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
-
Cluster
- ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๋ณด์ ํ๊ณ ๋ชจ๋ ๋ ธ๋์์ ์ฐํฉ ์ธ๋ฑ์ฑ ๋ฐ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ ์ด์์ ๋ ธ๋๋ชจ์
- ์ ์ผํ ์ด๋ฆ(unique name)์ผ๋ก ํ๋ณ(identified) (๊ธฐ๋ณธ๊ฐ: 'elasticsearch')
- ์ฌ์ฉ์๋ ํด๋ฌ์คํฐ๋ฅผ ๋์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๊ฒ์ ์์ฒญ
- Elasticsearch๋ ๋์ฉ๋ ๋ฐ์ดํฐ์ ์ฆ๊ฐ์ ๋ฐ๋ฅธ ์ค์ผ์ผ ์์๊ณผ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ํ ํด๋ฌ์คํฐ๋ง์ ์ง์, ํด๋ฌ์คํฐ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ๋์์ ํ๋ฉฐ 1๊ฐ์ ๋ ธ๋๋ง ์์ด๋ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑ
- ์ฌ๋ฌ ๋ ธ๋๊ฐ ํ๋์ ํด๋ฌ์คํฐ๋ก ๋ฌถ์ด๊ธฐ ์ํด์๋ ํด๋ฌ์คํฐ๋ช cluster.name ์ค์ ์ด ๋ฌถ์ฌ์ง ๋ ธ๋๋ค ๋ชจ๋ ๋์ผํด์ผ ํ๋ค.
- ํด๋ฌ์คํฐ ๊ตฌ์ฑ
- ์ฌ๋ฌ ์๋ฒ์ ํ๋์ ํด๋ฌ์คํฐ๋ก ์คํ
-
ํด๋ผ์ด์ธํธ์์ ํต์ ์ ์ํ http ํฌํธ, ๋ ธ๋ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ์ํ tcp ํฌํธ ์กด์ฌ.
-
์ผ๋ฐ์ ์ผ๋ก 1๊ฐ์ ๋ฌผ๋ฆฌ ์๋ฒ๋ง๋ค ํ๋์ ๋ ธ๋๋ฅผ ์คํ.
-
ex) 3๊ฐ์ ์๋ฒ์์ ๊ฐ 1๊ฐ์ ๋ ธ๋๋ฅผ ์คํ
-
ex) ํ ์๋ฒ์์ ๋๊ฐ์ ๋ ธ๋ ์คํ, ๋ ๋ค๋ฅธ ์๋ฒ์์ ํ๊ฐ ๋ ธ๋ ์คํ
-
- ํ๋์ ์๋ฒ์์ ์ฌ๋ฌ ํด๋ฌ์คํฐ ์คํ
-
ex) ํ๋์ ๋ฌผ๋ฆฌ ์๋ฒ์์ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํด๋ฌ์คํฐ ์คํ
- 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๋ก ๋์๊ฐ์ ๋ค์ ์ฃผ์ ํ์ธ ๋ฐ๋ณต
- ๋
ธ๋๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ > cluster.name ํ์ธ
-
์ฃผ์๊ฐ ๋๋ ๋ ๊น์ง ๋ ธ๋๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ - ์ค์ค๋ก ์๋ก์ด ํด๋ฌ์คํฐ ์์
-
๋์ค์ปค๋ฒ๋ฆฌ ๊ณผ์
-
- ์ฌ๋ฌ ์๋ฒ์ ํ๋์ ํด๋ฌ์คํฐ๋ก ์คํ
-
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
- ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ค์ดํฐ ๋ชจ๋
- ์๋ผ์คํฑ์์น์ ๋ชจ๋ ๋ ธ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๋๋ค์ด์ ๋ชจ๋ ๋ ธ๋์ด๋ค. ์ฆ, ๋ชจ๋ ๋ ธ๋๊ฐ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋ป.
- ๋ค๋ฅธ ๋ ธ๋๋ค์๊ฒ ์์ฒญ์ ๋ถ์ฐํ๊ณ ๊ฒฐ๊ณผ๊ฐ์ ์ทจํฉํ๋ ์ฝ๋๋ค์ด์ ๋ ธ๋๋ฅผ ๋ณ๋๋ก ๊ตฌ์ถํ๋ค๋ฉด ์์ ์ ์ธ ํด๋ฌ์คํฐ ์ด์์ด ๊ฐ๋ฅ
- ์์ ์์ฑ๋ค์ ์ ์ ํ ์กฐํฉํด์ ํน์ ๋
ธ๋ ๋ชจ๋๋ก ์ด์๊ฐ๋ฅ
-
Split Brain
- ๋คํธ์ํฌ ๋จ์ ๋ก ๋ง์คํฐ ํ๋ณด ๋ ธ๋๊ฐ ๋ถ๋ฆฌ๋๋ฉด ๊ฐ์๊ฐ ์๋ก ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑ๋์ด ๊ณ์ ๋์, ๋คํธ์ํฌ๊ฐ ๋ณต๊ตฌ ๋๊ณ ํ๋์ ํด๋ฌ์คํฐ๋ก ๋ค์ ํฉ์ณ์ก์ ๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์์ค๋๋ ํ์.
- ๋ง์คํฐ ํ๋ณด ๋ ธ๋๋ฅผ ํ๋๋ง ๋๊ฒ ๋๋ฉด ๊ทธ ๋ง์คํฐ ๋ ธ๋๊ฐ ์ ์ค๋์์ ๋ ํด๋ฌ์คํฐ ์ ์ฒด๊ฐ ์๋์ ์ ์ง ํ ์ํ
- ๋ง์คํฐ ํ๋ณด ๋ ธ๋๋ค์ 3๊ฐ ์ด์์ ํ์ ๊ฐ๋ฅผ ๋๋ ๊ฒ์ ๊ถ์ฅ
-
-
Index
- ๋ค์ ์ ์ฌํ ํน์ฑ์ ๊ฐ๋ Document๋ค์ ์งํฉ
- ๋จ์ผ ํด๋ฌ์คํฐ์์ ์ํ๋๋งํผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ ์ ์๋ค.
- RDB์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋น์ทํ ๊ฐ๋
- Index ๋ด ๋ค์์ Document์ ์ฅ
- Indexing
- ๋ฐ์ดํฐ๊ฐ ๊ฒ์๋ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด ์๋ณธ ๋ฌธ์๋ฅผ ๊ฒ์์ด ํ ํฐ๋ค์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ๋ ์ผ๋ จ์ ๊ณผ์
- Search
- ์ธ๋ฑ์ค์ ๋ค์ด์๋ ๊ฒ์์ด ํ ํฐ๋ค์ ํฌํจํ๊ณ ์๋ ๋ฌธ์๋ฅผ ์ฐพ์๊ฐ๋ ๊ณผ์
- Query
- ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ฌธ์๋ฅผ ์ฐพ๊ฑฐ๋ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ๊ฒ์ ์ ์ ๋ ฅํ๋ ๊ฒ์์ด ๋๋ ๊ฒ์ ์กฐ๊ฑด
-
Type
- Index ๋ด์์ ํ๋ ์ด์์ Type์ ์ ์ ํ ์ ์๋ค.
- ElasticSearch 7.x ๋ฒ์ ๋ถํฐ๋ _ doc๋ก ๊ณ ์
-
Document
- JSON(Java Script Object Notatoin) ํํ์ ์ค์ ์๋ฏธ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง Elasticsearch ๊ธฐ๋ณธ์ ์ฅ๋จ์
- Index๋ฅผ ์์ฑ
- ๊ณ ์ ํ ๋ฌธ์ ID ๋ณด์ (๋ฌธ์ ID๋ ๋๋ค&์๋ ํ ๋น๋๋ฉฐ ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๊ฐ ๋ ์ฌ์ฉ)
-
Shards
- Index๋ ์ ์ฌ์ ์ผ๋ก ๋จ์ผ ๋ ธ๋์ ํ๋์จ์ด ์ ํ์ ์ด๊ณผ ํ ์ ์๋ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ํ ์ ์๋ค. ํ์ง๋ง ๋จ์ผ ๋ ธ๋์ ๋์คํฌ๊ฐ ๋ง์ง ์๊ฑฐ๋ ๋จ์ผ ๋ ธ๋์ ๊ฒ์ ์์ฒญ๋ง ์ฒ๋ฆฌํ๊ธฐ์๋ ๋๋ฌด ๋๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ shards๋ฅผ ์ด์ฉํ์ฌ Index๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ์ ์๋ค.
- ๋ ธ๋์ ๋ถ์ฐ๋์ด ์ ์ฅ
- ์ํ์ ์ผ๋ก ์ฝํ ์ธ ๋ณผ๋ฅจ์ split/scale ๊ฐ๋ฅ
- ์ฌ๋ฌ ๋ ธ๋์์ ์ ์ฌ์ ์ผ๋ก ๋ถ์ฐ์ ํตํด ์์ ์ ๋ถ์ฐ ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ/์ฒ๋ฆฌ๋์ด ํฅ์
- ์๋ณธ์ค๋(Primary Shard)์ ๋ณต์ ๋ณธ์ค๋(Replica Shard)๋ก๋๋จ
- ๋จ์ผ ๋ ธ๋์ ๊ฒฝ์ฐ ํ๋ผ์ด๋จธ๋ฆฌ ์ค๋๋ง ์กด์ฌ. Elasticsearch ๋ ์๋ฌด๋ฆฌ ์์ ํด๋ฌ์คํฐ๋ผ๋ ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ์ํด ์ต์ 3๊ฐ์ ๋ ธ๋๋ก ๊ตฌ์ฑ ํ ๊ฒ์ ๊ถ์ฅ.
- ํด๋ฌ์คํฐ๊ฐ Node์ ์๋ ํ๋ผ์ด๋จธ๋ฆฌ ์ค๋๋ค์ ์ ์คํ๋๋ผ๋ ๋ค๋ฅธ ๋ ธ๋๋ค์ ๋ ํ๋ฆฌ์นด ์ค๋๊ฐ ๋จ์์์ผ๋ฉด ์ ์ฒด ๋ฐ์ดํฐ๋ ์ ์ค์ด ์์ด ์ฌ์ฉ์ด ๊ฐ๋ฅ.
- ํด๋ฌ์คํฐ๋ ๋จผ์ ์ ์ค๋ ๋
ธ๋์ ๋ณต๊ตฌ ๋๊ธฐ. ํ์์์์ด ์ง๋ ์ ์ค๋ ๋
ธ๋๊ฐ ๋ณต๊ตฌ๋์ง ์๋๋ค๊ณ ํ๋จ๋๋ฉด ๋ ํ๋ฆฌ์นด ์ค๋๋ค์ ๋ณต์ ๋ฅผ ์์.
- ํ๋ผ์ด๋จธ๋ฆฌ ์ค๋, ๋ ํ๋ฆฌ์นด ์ค๋์ ๊ฐ์๋ ์ ์ง๋จ.
- ์ค๋์ ๊ฐ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฒ์ ์์ฑ์ ์ง์ ๊ฐ๋ฅ. ํ๋ผ์ด๋จธ๋ฆฌ ์ค๋ ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฒ์ ์์ฑํ ๋ ์ง์ , ์ธ๋ฑ์ค๋ฅผ ์ฌ์์ธ ํ์ง ์๋ ์ด์ ๋ณ๊ฒฝ๋ถ๊ฐ. ๋ณต์ ๋ณธ์ ๊ฐ์๋ ์ถํ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅ.
-
Replication
- ์ฅ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ณต์ ๋ณธ ์ค๋๋ฅผ ์๋ณธ ์ค๋๋ก ์น๊ฒฉ์์ผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ณต์ ๋ณธ ์ค๋๋ ๋ณต์ฌ๋ ์๋ณธ/๊ธฐ๋ณธ ์ค๋์ ๋์ผํ ๋ ธ๋์ ํ ๋น๋์ง ์๋๋ค.
- ๋ชจ๋ ๋ณต์ ๋ณธ์์ ๊ฒ์์ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒ์ ๋ณผ๋ฅจ/์ฒ๋ฆฌ๋์ ์ํ ํ์ฅ ํ ์ ์๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ์ธ๋ฑ์ค๋ 4๊ฐ์ ๊ธฐ๋ณธ ์ค๋์ 1๊ฐ์ ๋ณต์ ๋ณธ์ด ํ ๋น
-
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 |
- 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 ๋ฅผ ์ฌ์ฉ
- EX)
- ์กฐํ (GET)
- EX)
GET my_index/_doc/1 - ํด๋น URL์ ๋ํ๋จผํธ์ ๋ด์ฉ์ ๊ฐ์ ธ์จ๋ค.
- ๋ฌธ์์ ๋ด์ฉ์ _source ํญ๋ชฉ์ ๋ํ๋จ
- EX)
- ์ญ์ (DELETE)
- EX)
DELETE my_index/_doc/1
- EX)
- ์์ (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๋ก ๋ณ๊ฒฝ
- EX)
- ์
๋ ฅ (PUT)
-
๋ฒํฌ API
- ์ฌ๋ฌ ๋ช ๋ น์ ๋ฐฐ์น๋ก ์ํํ๊ธฐ ์ํด์ _bulk API์ ์ฌ์ฉ
- index, create, update, delete์ ๋์์ด ๊ฐ๋ฅํ๋ฉฐ delete๋ฅผ ์ ์ธํ๊ณ ๋ ๋ช ๋ น๋ฌธ๊ณผ ๋ฐ์ดํฐ๋ฌธ์ ํ ์ค์ฉ ์์๋๋ก ์ ๋ ฅ
- EX)
- ๋ชจ๋ ๋ช
๋ น์ด ๋์ผํ ์ธ๋ฑ์ค์์ ์ํ๋๋ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด
<์ธ๋ฑ์ค๋ช >/_bulkํ์์ผ๋ก๋ ์ฌ์ฉ์ด ๊ฐ๋ฅ - ๋ฐ๋ก๋ฐ๋ก ์ํํ๋ ๊ฒ ๋ณด๋ค ์๋๊ฐ ํจ์ฌ ๋น ๋ฆ. ํนํ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ ํ ๋๋ ๋ฐ๋์ _bulk API๋ฅผ ์ฌ์ฉํด์ผ ๋ถํ์ํ ์ค๋ฒํค๋๊ฐ ์์.
- ๋ฒํฌ ๋ช
๋ น์ json ํ์ผ๋ก ์ ์ฅ ํ curl๋ช
๋ น์ผ๋ก ์คํ ๊ฐ๋ฅ
- _bulk API๋ฅผ bulk.jsonํ์ผ๋ก ์ ์ฅ ํ
curl -XPOST "http://localhost:9200/_bulk" -H 'Content-Type: application/json' --data-binary @bulk.json๋ฅผ ํตํด ์คํ
- _bulk API๋ฅผ bulk.jsonํ์ผ๋ก ์ ์ฅ ํ
-
๊ฒ์ API ( _search API )
- ๊ฒ์์ ์ธ๋ฑ์ค ๋จ์๋ก ์ด๋ฃจ์ด์ง.
- URI ๊ฒ์
- ์์ฒญ ์ฃผ์์ _search ๋ค์ q ํ๋ผ๋ฉํฐ๋ฅผ ์ฌ์ฉํด์ ๊ฒ์์ด๋ฅผ ์
๋ ฅ
- EX)
GET test/_search?q=value( URI ๊ฒ์์ผ๋ก ๊ฒ์์ด "value" ๊ฒ์ )
- EX)
- URI ์ฟผ๋ฆฌ์์๋ AND, OR, NOT ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ ๋ฐ๋์ ๋ชจ๋ ๋๋ฌธ์๋ก ์
๋ ฅ
- EX)
GET test/_search?q=value AND three( URI ๊ฒ์์ผ๋ก ๊ฒ์์ด "value AND three" ๊ฒ์ )
- EX)
- ๊ฒ์์ด๋ฅผ ํ๋์์ ์ฐพ๊ณ ์ถ์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด <ํ๋๋ช
>:<๊ฒ์์ด> ํํ๋ก ์
๋ ฅ
- EX)
GET test/_search?q=field:value( URI ๊ฒ์์ผ๋ก "field" ํ๋์์ ๊ฒ์์ด "value" ๊ฒ์ )
- EX)
- ์์ฒญ ์ฃผ์์ _search ๋ค์ q ํ๋ผ๋ฉํฐ๋ฅผ ์ฌ์ฉํด์ ๊ฒ์์ด๋ฅผ ์
๋ ฅ
- ๋ฐ์ดํฐ ๋ณธ๋ฌธ (Data Body) ๊ฒ์
- ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ ๋ณธ๋ฌธ์ผ๋ก ์ ๋ ฅํ๋ ๋ฐฉ์
- ์ฟผ๋ฆฌ ์ ๋ ฅ์ ํญ์ query ์ง์ ์๋ก ์์, ๊ทธ ๋ค์ ๋ ๋ฒจ์์ ์ฟผ๋ฆฌ์ ์ข ๋ฅ๋ฅผ ์ง์
- match ์ฟผ๋ฆฌ
- EX)
GET test/_search {"query": { "match": {"field": "value" }} }
- EX)
- ์ฟผ๋ฆฌ ๋ณ๋ก ๋ฌธ๋ฒ์ด ์์ดํ ์ ์๋๋ฐ 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 ๊ฒ์ )
- EX)
- match ๊ฒ์์ ์ฌ๋ฌ ๊ฐ์ ๊ฒ์์ด๋ฅผ ์ง์ด๋ฃ๊ฒ ๋๋ฉด ๋ํดํธ๋ก OR ์กฐ๊ฑด์ผ๋ก ๊ฒ์์ด ๋์ด ์
๋ ฅ๋ ๊ฒ์์ด ๋ณ๋ก ํ๋๋ผ๋ ํฌํจ๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ชจ๋ ๊ฒ์
- EX)
GET my_index/_search { "query": { "match": { "message": "quick dog" } } }( match ์ฟผ๋ฆฌ๋ก message ํ๋์์ quick OR dog ๊ฒ์ )
- EX)
- ๊ฒ์์ด๊ฐ ์ฌ๋ฟ์ผ ๋ ๊ฒ์ ์กฐ๊ฑด์ OR ๊ฐ ์๋ AND ๋ก ๋ฐ๊พธ๋ ค๋ฉด operator ์ต์
์ ์ฌ์ฉ
- EX)
GET my_index/_search { "query": { "match": { "message": { "query": "quick dog", "operator": "and" } } } }( match ์ฟผ๋ฆฌ quick AND dog ๊ฒ์ )
- EX)
- match_phrase
- ๊ณต๋ฐฑ์ ํฌํจํด ์ ํํ ์ผ์นํ๋ ๋ด์ฉ์ ๊ฒ์
- EX)
GET my_index/_search { "query": { "match_phrase": { "message": "lazy dog" } } }( match_phrase ์ฟผ๋ฆฌ๋ก "lazy dog" ๊ตฌ๋ฌธ ๊ฒ์ )
- EX)
- 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"์ฒ๋ผ ์ฌ์ด์ ํ ๋จ์ด๊ฐ ์ ๋ ฅ๋ ๊ฐ๋ ๊ฒ์๋จ.
- EX)
- ๊ณต๋ฐฑ์ ํฌํจํด ์ ํํ ์ผ์นํ๋ ๋ด์ฉ์ ๊ฒ์
- 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 ์ฒ๋ผ ๊ตฌ๋ฌธ ๊ฒ์์ ํ ๋๋ ๊ฒ์ํ ๊ตฌ๋ฌธ์ ์๋ฐ์ดํ " ์์ ๋ฃ์ )
- URL๊ฒ์์ ์ฌ์ฉํ๋ ๋ฃจ์ฌ์ ๊ฒ์ ๋ฌธ๋ฒ์ ๋ณธ๋ฌธ ๊ฒ์์ ์ด์ฉํ๊ณ ์ถ์ ๋ query_string ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉ
- match_all
- ๊ฒ์ (Search)
-
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 ์ฟผ๋ฆฌ ๋น๊ต
-
์ ํ๋ - 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" ๊ตฌ๋ฌธ์ ํฌํจํ ๊ฒฐ๊ณผ์ ๊ฐ์ค์น ๋ถ์ฌ )
- EX)
- ๊ฒ์ ์ ์๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉ
-
์ ํ๊ฐ ์ฟผ๋ฆฌ - 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" } } ] } } }
- bool์ฟผ๋ฆฌ์ filter ์์ ํ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ฝ์ด์ ์ํฅ์ ์ฃผ์ง ์์
- keyword
- ๋ฌธ์์ด ๋ฐ์ดํฐ๋ keyword ํ์์ผ๋ก ์ ์ฅํ์ฌ ์ ํ๊ฐ ๊ฒ์์ด ๊ฐ๋ฅ
- EX)
GET my_index/_search { "query": { "bool": { "filter": [ { "match": { "message.keyword": "Brown fox brown dog" } } ] } } }- keyword ํ์ ์ผ๋ก ์ ์ฅ๋ ํ๋๋ ์ค์ฝ์ด๋ฅผ ๊ณ์ฐํ์ง ์๊ณ ์ ํ๊ฐ์ ์ผ์น ์ฌ๋ถ๋ง์ ๋ฐ์ง
- EX)
- ๋ฌธ์์ด ๋ฐ์ดํฐ๋ 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 ์ดํ์ธ ๋ฐ์ดํฐ ๊ฒ์ )
- EX)
- ์ฟผ๋ฆฌ์ ๋ ์ง ํฌ๋งท์ ๋ค๋ฅด๊ฒ ํ๊ณ ์ถ์ผ๋ฉด
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 ์ฌ์ด์ ๋ฐ์ดํฐ ๊ฒ์ )
- EX)
- ๋ ์ง๋ฅผ ๊ฒ์ ํ ๋ ์์ฝ์ด ์ฌ์ฉ๊ฐ๋ฅ
now(ํ์ฌ์๊ฐ),y(๋ ),M(์),d(์ผ),h(์),m(๋ถ),s(์ด),w(์ฃผ)
- range๋ true / false ์ฌ๋ถ๋ง์ ํ๋จํ์ฌ ์ฟผ๋ฆฌ์ ์ค์ฝ์ด๋ ๋ชจ๋ "_score" : 1.0๋ก ๋์ผ
- ๋ ์ง ๊ฐ์ 2016-01-01 ๋๋ 2016-01-01T10:15:30 ๊ณผ ๊ฐ์ด JSON ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ISO8601 ํ์์ ์ฌ์ฉ
- ์ธ๋ฑ์ค ์ค์ ๊ณผ ๋งคํ
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": "โฆ" ... } } } } }
- number_of_shards, number_of_replicas
- ๋งคํ - 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 ์ ๋๋ผ์ด์ ๋ฅผ ์ ์ฉ ํ ๊ฒ๊ณผ ๋์ผ
- text
-
์ซ์
- 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 ์ดํ์ธ ๋ฐ์ดํฐ ๊ฒ์ )
- EX)
- ์ฟผ๋ฆฌ์ ๋ ์ง ํฌ๋งท์ ๋ค๋ฅด๊ฒ ํ๊ณ ์ถ์ผ๋ฉด
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 ์ฌ์ด์ ๋ฐ์ดํฐ ๊ฒ์ )
- EX)
- ๋ ์ง๋ฅผ ๊ฒ์ ํ ๋ ์์ฝ์ด ์ฌ์ฉ๊ฐ๋ฅ
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
- ๋ ์ง ๊ฐ์ 2016-01-01 ๋๋ 2016-01-01T10:15:30 ๊ณผ ๊ฐ์ด JSON ์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ISO8601 ํ์์ ์ฌ์ฉ
-
๋ถ๋ฆฌ์ธ - 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" } ] }์์ ๊ฐ์ด ์์ฑ ์ ์ญ ์์ธ ๊ตฌ์กฐ
-
-
Nested
- ์ฌ๋ฌ ๊ฐ์ object ๊ฐ๋ค์ด ์๋ก ๋ค๋ฅธ ์ญ ์์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ก ํ๋ ค๋ฉด nested ํ์ ์ผ๋ก ์ง์
- nested ํ์ ์ผ๋ก ์ง์ ํ๋ ค๋ฉด ๋งคํ์ ๋ค์๊ณผ ๊ฐ์ด "type": "nested" ๋ฅผ ๋ช ์ํฉ๋๋ค. ๋ค๋ฅธ ๋ถ๋ถ์ object ์ ๋์ผ
- object ๋ํ๋จผํธ์ nested ๋ํ๋จผํธ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋น๊ต
-
์์น ์ ๋ณด - 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 } } } } }
ํ ์ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฅํ ๋ฐ๊ฒฝ์ ์ ์์ ์๋ ๋ํ๋จผํธ GET GET my_geo/_search { "query": { "geo_distance": { "distance": "5km", "location": { "lat": 37.5358, "lon": 126.9559 } } } }
-
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 ] } }
- ์ฌ๋ฌ ์ ๊ฐ ์ ๋ ฅ
"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 ] ] } }
- ์ง์ ๊ฐ ์ ๋ ฅ
"type": "linestring" ํํ์ geo_shape ๊ฐ ์ ๋ ฅ PUT my_shape/_doc/3 { "location": { "type": "linestring", "coordinates": [ [ 127.027926, 37.497175 ], [ 126.991806, 37.571607 ] ] } }
- ์ฌ๋ฌ๊ฐ์ ์ง์ ๊ฐ ์ ๋ ฅ
"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 ] ] ] } }
- ๋ค๊ฐํ ๊ฐ ์ ๋ ฅ - ๋ฐฐ์ด ๋ง์ง๋ง์๋ ๋ฐ๋์ ์ฒ์๊ณผ ๊ฐ์ ์ ์ด ์ ๋ ฅ
"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 ] ] ] } }
- ์ฌ๋ฌ ๊ฐ์ ๋ค๊ฐํ ๊ฐ ์ ๋ ฅ
"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 ] ] ] ] } }
- ์ง์ฌ๊ฐํ ์์ญ ๊ฐ ์ ๋ ฅ
"type": "envelope" ํํ์ geo_shape ๊ฐ ์ ๋ ฅ PUT my_shape/_doc/7 { "location": { "type": "envelope", "coordinates": [ [ 126.936893, 37.555134 ], [ 127.004943, 37.50481 ] ] } }
-
-
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๊ฐ์ ์ญ ์์ธ์ด ์์ฑ
-
RDB๊ฐ ์ฝ๊ธฐ์ฑ๋ฅ์ด ๋ฎ์ ์ด์
- ๊ด๊ณํ DB์์๋ Text ์ด์ ํ ์ค์ฉ ์ฐพ์ ๋ด๋ ค๊ฐ๋ฉด์ ํค์๋๊ฐ ์์ผ๋ฉด ๊ฐ์ ธ์ค๊ณ ์์ผ๋ฉด ๋์ด๊ฐ.
- row ์์ ๋ด์ฉ์ ๋ชจ๋ ์ฝ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋๊ฐ ๋๋ฆผ.
-
Active-Standby
- ํ์ ์์๋ ํ๋์ ์๋ฒ๋ก ์ด์์ ํ๊ณ , ๊ทธ์ ์คํ์ด ๋น์ทํ ์๋ฒ๋ฅผ ์๋น๋ก ์ค๋น. ์๋น์๋ฒ๋ ์ธ์ ๋ผ๋ ๋ถํ ํ๋ฉด ๋ฐ๋ก ์ฌ์ฉ ํ ์ ์๋ ์ํ๋ก ์ค๋น ํฉ๋๋ค. ์ฅ์ ๊ฐ ๋ฐ์๋๋ฉด ๊ด๋ฆฌ์๊ฐ ํ๋จํ์ฌ ์๋น์๋ฒ๋ก ์๋น์ค ํด์ผ ํ๋ค๊ณ ํ๋จ์ด ๋๋ฉด Data์์ญ์ ๋์คํฌ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์๋น์๋ฒ๋ก ์ด์ ํ ํ ์๋น์๋ฒ๋ก ์๋น์ค๋ฅผ ์ด์ํ๋ฉด ๋ฉ๋๋ค.
- ์ด ํํ๋ ์ ๋ ดํ ๋น์ฉ์ผ๋ก ์ด์คํ๋ฅผ ๊ตฌ์ฑํ ์ ์์ง๋ง, ์์คํ ์ฅ์ ์๊ฐ์ด ๊ธธ๊ณ ์์ ์ฑ์ด ์ ์ ๋ฐฉ๋ฒ์ ๋๋ค.
-
Active-Active
- ์ฌ์ฉ์๊ฐ ๊ฐ ์๋ฒ๋ณ๋ก ๊ณ ๋ฃจ ๋ถ์ฐ๋๋๋ก ๊ตฌ์ฑ์ด ๋๊ณ , ์ฌ์ฉ์๋ ์์ ์ด ์ํ ์๋ฒ์์๋ง ์๋น์ค๋ฅผ ์ด์ฉ
- ํ์ชฝ ์๋ฒ๋ก ์ฌ์ฉ์๊ฐ ๋ชฐ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์์ผ๋ฏ๋ก, ์ฌ์ฉ์ ์์ฑ ์ ๊ณ ๋ฃจ ๋ถํฌ๋๋๋ก ์ ์
- ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ํด๋ฌ์คํฐ๋ง(Clustering) SW์ ์ํด ๊ฐ์ง๊ฐ ๋๊ณ ์๋์ผ๋ก ์๋น์ค ์ ์ฒด ๋ฐ ์ด์
- ์๋ฒ#1์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฒ#1์ ์ ๋ณด๊ฐ ์๋ฒ#2๋ก ์ด์ ๋์ด ์๋ฒ#2์์ ์๋ฒ#1์ ์๋น์ค๋ฅผ ๋์ ์ํํ๋ฏ๋ก์ ์์คํ ์ฅ์ ์๊ฐ์ ์ต์
- ์ฌ์ฉ์๊ฐ ๊ฐ ์๋ฒ๋ณ๋ก ๊ณ ๋ฃจ ๋ถ์ฐ๋๋๋ก ๊ตฌ์ฑ์ด ๋๊ณ , ์ฌ์ฉ์๋ ์์ ์ด ์ํ ์๋ฒ์์๋ง ์๋น์ค๋ฅผ ์ด์ฉ
-
split brain elasticsearch
- Split Brain
- ๋คํธ์ํฌ ๋จ์ ๋ก ๋ง์คํฐ ํ๋ณด ๋ ธ๋๊ฐ ๋ถ๋ฆฌ๋๋ฉด ๊ฐ์๊ฐ ์๋ก ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑ๋์ด ๊ณ์ ๋์, ๋คํธ์ํฌ๊ฐ ๋ณต๊ตฌ ๋๊ณ ํ๋์ ํด๋ฌ์คํฐ๋ก ๋ค์ ํฉ์ณ์ก์ ๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์์ค๋๋ ํ์.
- ๋ง์คํฐ ํ๋ณด ๋ ธ๋๋ฅผ ํ๋๋ง ๋๊ฒ ๋๋ฉด ๊ทธ ๋ง์คํฐ ๋ ธ๋๊ฐ ์ ์ค๋์์ ๋ ํด๋ฌ์คํฐ ์ ์ฒด๊ฐ ์๋์ ์ ์ง ํ ์ํ
- ๋ง์คํฐ ํ๋ณด ๋ ธ๋๋ค์ 3๊ฐ ์ด์์ ํ์ ๊ฐ๋ฅผ ๋๋ ๊ฒ์ ๊ถ์ฅ
- Split Brain
-
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"
}
}
}
}
-
๊ธฐ๋ฅ
- ์คํ์์ค ์๋ฒ์ธก ๋ฐ์ดํฐ ์์ง & ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ๋๊ตฌ
- ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ, ๋ก์ฐ ๋ฐ์ดํฐ, ์๋์ฐ ์ด๋ฒคํธ ๋ฑ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์ง
- ๋ค์ํ ํ๋ฌ๊ทธ์ธ์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณ ๋ฐ ๋ณด๊ด, ์๋ฒ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ํ์ดํ๋ผ์ธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ง
- ์์งํ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋ฅผ ํตํด ๋ณํ ํ ElasticSearch๋ก ์ ์ก
- Pipeline ๊ตฌ์กฐ(Input -> Filter -> Output)
-
๊ฐ๋ ์ ๋ฆฌ
-
input
- ์ ๋ ฅ์ ์ฌ์ฉํ์ฌ Logstash์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ค์
- ๋ฐ์ดํฐ ํ์ - file, syslog(RFC3164 ํ์), beats(Filebeat)
-
filter
- Logstash ํ์ดํ ๋ผ์ธ์ ์ค๊ฐ ์ฒ๋ฆฌ ์ฅ์น๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต
- grok : ๊ตฌ๋ฌธ ๋ถ์ ๋ฐ ์์์ ํ ์คํธ๋ก ๊ตฌ์ฑ
- mutate : ์ด๋ฒคํธ ํ๋์์ ์ผ๋ฐ์ ์ธ ๋ณํ์ ์ํ
- drop : ์ด๋ฒคํธ๋ฅผ ์ญ์
- clone : ์ด๋ฒคํธ์ ๋ณต์ฌ๋ณธ ์์ฑ
- geoip : ip ์ฃผ์์ ์ง๋ฆฌ์ ์์น์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๊ฐ
- Logstash ํ์ดํ ๋ผ์ธ์ ์ค๊ฐ ์ฒ๋ฆฌ ์ฅ์น๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต
-
output
- Logstash ํ์ดํ ๋ผ์ธ์ ์ต์ข
๋จ๊ณ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
- elasticsearch : ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ฅผ elasticsearch์ ์ ์ก
- file : ๋์คํฌ ํ์ผ์ ์์ฑ
- graphite : graphite์ ์ ์ก (graphite : ๋ฉํธ๋ฆญ์ ์ ์ฅํ๊ณ ๊ทธ๋ํ๋ก ์์ฑํ๋๋ฐ ์ฌ์ฉ๋๋ ์คํ ์์ค ๋๊ตฌ)
- statsd : ์นด์ดํฐ ๋ฐ ํ์ด๋จธ์ ๊ฐ์ ํต๊ณ๋ฅผ ์์ ํ๊ณ UDP๋ฅผ ํตํด ์ ์ก๋๋ฉฐ, ํ๋ ์ด์์ ํ๋ฌ๊ทธ ๊ฐ๋ฅํ ๋ฐฑ์๋ ์๋น์ค์ ์ง๊ณ๋ฅผ ๋ณด๋ด๋ ์๋น์ค
- Logstash ํ์ดํ ๋ผ์ธ์ ์ต์ข
๋จ๊ณ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ
-
codec
- ์ ๋ ฅ ๋๋ ์ถ๋ ฅ์ ์ผ๋ถ๋ก ์๋ ํ ์ ์๋ ์คํธ๋ฆผ ํํฐ
- ๋ํ์ ์ธ ์ฝ๋ฑ์๋ json, msgpack, plain์ด ์๋ค.
- json : JSON ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉํ๊ฑฐ๋ ๋์ฝ๋ฉ
- multiline : ์๋ฐ ์์ธ ๋ฐ ์คํ ์ถ์ฒ ๋ฉ์์ง์ ๊ฐ์ ์ฌ๋ฌ ์ค ํ ์คํธ ์ด๋ฒคํธ๋ฅผ ๋จ์ผ ์ด๋ฒคํธ๋ก ๋ณํฉ
- ๊ธฐ๋ฅ
- ์ฌ์ฉ์ Application์ผ๋ก Elastic Search์ ์ ์ฅ๋ ์ ๋ณด๋ค์ ๊ฒ์ ๋ฐ ๋ถ์ํ๊ณ ์ค์๊ฐ์ผ๋ก ์๊ฐํํ๋ ๊ธฐ๋ฅ
- ๊ธฐ๋ฅ
- ์๋ฒ์ ๊ฒฝ๋ ์์ด์ ํธ๋ก ์ค์น๋์ด ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ Logstash ๋๋ ElasticSearch๋ก ์ ์ก(์คํธ๋ฆฌ๋ฐ)ํ๋ ์คํ ์์ค ๋ฐ์ดํฐ ๋ฐ์ก์
- Filebeat, Metricbeat, Packetbeat, Winlogbeat, Heartbeat ๋ฑ์ด ์์ผ๋ฉฐ Libbeat์ ์ด์ฉํ์ฌ ์ง์ ๊ตฌ์ถ๋ ๊ฐ๋ฅ
- ๊ฐ๋ ์ ๋ฆฌ
- FileBeat
- ์๋ฒ์์ ๋ก๊ทธํ์ผ์ ์ ๊ณต
- PacketBeat
- ์์ฉ ํ๋ก๊ทธ๋จ ์๋ฒ๊ฐ์ ๊ตํ๋๋ ํธ๋์ญ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋คํธ์ํฌ ํจํท ๋ถ์๊ธฐ
- MetricBeat
- ์๋ฒ์์ ์คํ์ค์ธ ์ด์ ์ฒด์ ๋ฐ ์๋น์ค์์ Metrics๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์์งํ๋ ์๋ฒ ๋ชจ๋ํฐ๋ง ์์ด์ ํธ
- WinlogBeat
- Windows ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ ๊ณต
- ๋ฑ์ฅ๋ฐฐ๊ฒฝ
- ์ด๊ธฐ - ๋จ๋ฐฉํฅ ํต์
- ํ๊ธฐ - ๋ณต์กํ ๋ฐ์ดํฐ ํต์
- ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ line์ด ๋ณต์กํด์ง
- ๋ฐฐํฌ์ ์ฅ์ ์ ๋์ํ๊ธฐ ์ด๋ ค์์ง.
- ์ถํ ๋ฐ์ดํฐ ํฌ๋งท์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ธฐ๋ฉด ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง.
- Protocol ํฌ๋งท์ ํํธํ๊ฐ ์ฌํด์ง.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋งํฌ๋์ธ์์ ๋ด๋ถ์ ์ผ๋ก ๊ฐ๋ฐํ ์คํ์์ค
- Apache Kafka
- ์นดํ์นด๋ ์์ค์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํ๊ฒ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปคํ๋ง์ ์ถ์ํ๊ธฐ ์ํด ๋ฑ์ฅ.
- source์์ ๋ณด๋ผ ์ ์๋ ๋ฐ์ดํฐ ํฌ๋งท์๋ ๊ฑฐ์ ์ ํ์ด ์๋ค.
- ์นดํ์นด๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ํ ํฝ์ ํ๋ผ๊ณ ๋ณผ ์ ์๋ค.
- Producer - ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์.
- Consumer - ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ.
- Fault tolerant (๊ณ ๊ฐ์ฉ์ฑ)
- ์๋ฒ์ ์ด์๊ฐ ์๊ธฐ๊ฑฐ๋ ๊ฐ์๊ธฐ ๋์ด ๋ด๋ ค๊ฐ๋ ๋ฑ์ ์ํฉ์์๋ ๋ฐ์ดํฐ๋ฅผ ์์ค์์ด ๋ณต๊ตฌ ๊ฐ๋ฅ
- ๋ฎ์ ์ง์ฐ(latency), ๋์ ์ฒ๋ฆฌ๋(throuhput)์ผ๋ก ํจ๊ณผ์ ์ผ๋ก ๋ง์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- Topic
- Kafka์์ ๊ด๋ฆฌํ๋ data๊ฐ ๋ค์ด๊ฐ ์ ์๋ ๊ณต๊ฐ
- topic์ ์ด๋ฆ์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด๋์ง ๋ช ์ -> ์ ์ง๋ณด์ ์ ํธ๋ฆฌ.
- Topic๋ด๋ถ
- ํ๋์ ํ ํฝ์ ์ฌ๋ฌ๊ฐ์ ํํฐ์ ์ผ๋ก ๊ตฌ์ฑ๋จ.
- ํ๋์ ํํฐ์ ์ ํ์ ๊ฐ์ด ๋์์ ๋ถํฐ ๋ฐ์ดํฐ๊ฐ ์ ์ฌ.
- Consumer๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋๋ ์(0,1,...)์ผ๋ก ๊ฐ์ ธ๊ฐ.
- ๋์ด์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค์ง ์์ผ๋ฉด ๋ค๋ฅธ ๋ฐ์ดํฐ ๋ค์ด์ฌ ๋ ๊น์ง ๋๊ธฐ.
- consumer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋ ๋ฐ์ดํฐ๋ ์ญ์ ๋์ง ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
- ๋๊ฐ ์ด์์ partition
-
Producer๊ฐ data๋ฅผ ๋ณด๋ผ ๋ key๋ฅผ ์ง์ ๊ฐ๋ฅ (key๋ฅผ ํด์ฑํ์ฌ ํน์ ํํฐ์ ์ ์ ์ฅ)
-
ํํฐ์ ์ ๋๋ฆฌ๋ฉด consumer์ ์๋ฅผ ๋๋ ค ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ถ์ฐ์ํฌ ์ ์๋ค.
-
ํํฐ์ ์ ๋๋ฆฌ๋ ๊ฒ์ ๊ฐ๋ฅํ๋, ์ค์ด๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ
-
ํํฐ์ ์ ์ถ๊ฐํ๋ ์๊ฐ ํค - ํํฐ์ ๊ฐ์ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ง ์๋๋ค.
-
ํํฐ์ ์ data ์ญ์
- ์ต๋ ์ ์ฅ ์ฉ๋, ์ต๋ ์ ์ฅ ์๊ฐ ์ต์ ์ ์ค์ ํ์ฌ ์ด์ ๋ฐ๋ผ ์ ์ ํ ์ญ์ ๋จ.
-
Producer
- ๋ฐ์ดํฐ๋ฅผ kafka์ ๋ณด๋ด๋ ๊ฐ์ฒด
- ๋๋์ ๋ก๊ทธ๋ค์ ์ค์๊ฐ์ผ๋ก kafka์ ์ ์ฌํ ์ ์๋ค.
-
์ญํ
- 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์ ์ด์๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ณต๊ตฌ ๊ฐ๋ฅ
-
multiple consumer
- #partition > #consumer
- consumer๊ฐ ๊ฐ๊ฐ 1~n๊ฐ์ partition์ ๋งก์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- #partition = #consumer
- consumer๊ฐ ๊ฐ๊ฐ 1๊ฐ์ฉ partition์ ๋งก์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- #partition < #consumer
- ์ผ๋ถ consumer๋ partition์ ํ ๋น๋ฐ์ง ์์ ๋์ํ์ง ์๋๋ค.
- #partition > #consumer
-
Different groups
- Consumer group๊ณผ topic ๋ณ๋ก kafka์ consumer offset์ ๋๋์ด ์ ์ฅํ์ฌ ๊ฐ consumer group์ด ํ consumer group์ ์ํฅ์ ๋ผ์น์ง ์๊ณ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
-
kafka์ ํต์ฌ์์
-
kafka์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ์งํ๋๋ฐ์ ์ค์ํ ์ญํ ์ ํ๋ค.
-
Broker
- Kafka๊ฐ ์ค์น๋์ด์๋ ์๋ฒ ๋จ์
- ๋ณดํต 3๊ฐ ์ด์ ์ฌ์ฉ ๊ถ์ฅ
- ๋ธ๋ก์ปค๊ฐ 3๋๋ผ๋ฉด 3๋ ์ค 1๋์ ํด๋น ํ ํฝ์ data๊ฐ ์ ์ฅ
-
Replication
- ํด๋ฌ์คํฐ์์ ์๋ฒ์ ์ฅ์ ๊ฐ ์๊ธธ ๋, ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
- Partition์ ๋ณต์ ๋ฅผ ์๋ฏธํ๋ค.
- Broker์ ์ด์๊ฐ ๋ฐ์ํด ์ฌ์ฉ ๋ถ๊ฐ๋ฅํด์ง ๊ฒฝ์ฐ, ๋ณต์ ๋ณธ์ ํตํด ๋ณต๊ตฌ๊ฐ๋ฅ
-
ISR (In Sync Replica)
- Leader partition(์๋ณธ) + follower partition(๋ณต์ ๋ณธ)
-
-
Lag
- Producer์ ๋ฐ์ดํฐ ์ฝ์ ์๋๊ฐ Consumer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋ ์๋๋ณด๋ค ๋น ๋ฅธ ๊ฒฝ์ฐ ๋ฐ์
- Producer์ ๋ง์ง๋ง ์ฝ์ offset๊ณผ Consumer์ ๋ง์ง๋ง read offset๊ฐ์ ์ฐจ์ด๋ฅผ ์๋ฏธํจ.
- Partition์ ๊ฐ์๊ฐ ์ฌ๋ฌ๊ฐ์ด๋ฉด lag๋ ์ฌ๋ฌ๊ฐ ์กด์ฌ ๊ฐ๋ฅ
- ๊ฐ์ฅ ํฐ lag์ records-lag-max๋ผ ํจ.
-
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๋ผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
-
Znode
- ์์๋ ธ๋๋ฅผ ๊ฐ์ง ๊ณ์ธตํ ๊ตฌ์กฐ
-







