ElasticStack ์ฐ๋ถํฌ ํ๊ฒฝ์์ ์ค์น
ELK๊ตฌ์ฑ์์
Elasticsearch ์ฉ์ด์ ๋ฆฌ
Elasticsearch ํน์ง
Elasticsearch ๋ฐ์ดํฐ ์์ธ
Elasticsearch ์คํํ๊ฒฝ ์ค์
...
ํค๋ฐ๋ ๊ธฐ๋ณธ
ํค๋ฐ๋ ์ฝ๋ก๋ ๋์๋ณด๋ ๋ง๋ค๊ธฐ
...
OCI์ CRI
์ ์์ค ์ปจํ
์ด๋ ๋ฐํ์๊ณผ ๊ณ ์์ค ์ปจํ
์ด๋ ๋ฐํ์
์ปจํ
์ด๋์ VMs์ ์ฐจ์ด
๋์ปค ์ค์ต-๊ธฐ๋ณธ ๋ช
๋ น์ด
๋์ปค ์ค์ต-์ด๋ฏธ์ง ์์ฑ
๋์ปคํ๋ธ ์ด์ฉ
...
Producer & Consumer
Topic
Broker
Replication
ISR
Lag
Burrow
Zookeeper
...
yoonje๋์ ์๋ ๋ ํฌ์งํ ๋ฆฌ์์ 'tuto'ํ์ผ์ https://github.com/gjlee0802/ElasticStackStudy/blob/main/tuto ๋ก ๋์ฒดํ์ฌ ์ํ.
yoonje๋์ ์ค์น ํํ ๋ฆฌ์ผ: https://github.com/yoonje/elastic-stack-tutorial
tuto์์ ํจํค์ง ๋ค์ด๋ก๋ ์ฃผ์ ์์ , ์ฐ๋ถํฌ ํ๊ฒฝ์ ๋ง๊ฒ ์์
์ฃผ์์ฌํญ: ์ฌ์ฉ์๋ช
"user"์ ๊ธฐ์ค์ผ๋ก ํจ.
Logstash๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ ๋ฐ ์ง๊ณ๋ฅผ ํ์ฌ ํ์ํ ๊ด์ฌ ์๋ ์ ๋ณด๋ฅผ ํ๋.
Lucene ๊ฒ์์์ง ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๊ณ ์ฑ๋ฅ์ ๊ฒ์ ๊ธฐ๋ฅ, ๋๊ท๋ชจ ๋ถ์ฐ ์์คํ
๊ธฐ๋ฅ ๋ฑ์ ์ ๊ณตํ๋ค.
ํ์ค RESTful API์ JSON์ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
๋ค์ํ ์์ค( DB, csvํ์ผ ๋ฑ )์ ๋ก๊ทธ ๋๋ ํธ๋์ญ์
๋ฐ์ดํฐ๋ฅผ ์์ง, ์ง๊ณ, ํ์ฑํ์ฌ Elasticsearch๋ก ์ ๋ฌ
๋ฐ์ดํฐ ์์ง ํ์ดํ๋ผ์ธ ๋๊ตฌ์
๋๋ค.
๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ, ๋ก์ฐ ๋ฐ์ดํฐ, ์๋์ฐ ์ด๋ฒคํธ ๋ฑ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์์งํฉ๋๋ค.
๋ค์ํ ํ๋ฌ๊ทธ์ธ์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง๊ณ ๋ฐ ๋ณด๊ด, ์๋ฒ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ํ์ดํ๋ผ์ธ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ํํฐ๋ฅผ ํตํด ๋ณํ ํ ElasticSearch๋ก ์ ์กํฉ๋๋ค.
Elasticsearch์ ๋น ๋ฅธ ๊ฒ์์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํ ๋ฐ ๋ชจ๋ํฐ๋ง
Elastic Search์ ์ ์ฅ๋ ์ ๋ณด๋ค์ ๊ฒ์ ๋ฐ ๋ถ์ํ๊ณ ์๊ฐํํ๋ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์ต๋๋ค.
๊ฒฝ๋ ์์ด์ ํธ๋ก ์ค์น๋์ด ๋ฐ์ดํฐ๋ฅผ Logstash ๋๋ ElasticSearch๋ก ์ ์กํฉ๋๋ค.
- FileBeat
- ์๋ฒ์์ ๋ก๊ทธํ์ผ์ ์ ๊ณตํฉ๋๋ค.
- PacketBeat
- ์์ฉ ํ๋ก๊ทธ๋จ ์๋ฒ๊ฐ์ ๊ตํ๋๋ ํธ๋์ญ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋คํธ์ํฌ ํจํท ๋ถ์๊ธฐ ์ ๋๋ค.
- MetricBeat
- ์ด์ ์ฒด์ ๋ฐ ์๋น์ค์์ Metrics๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์์งํ๋ ์๋ฒ ๋ชจ๋ํฐ๋ง ์์ด์ ํธ์ ๋๋ค.
- WinlogBeat
- Windows ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํด๋ฌ์คํฐ๋ Elasticsearch์์ ๊ฐ์ฅ ํฐ ์์คํ
๋จ์๋ฅผ ์๋ฏธํ๋ฉฐ, ์ต์ ํ๋ ์ด์์ ๋
ธ๋๋ก ์ด๋ฃจ์ด์ง ๋
ธ๋๋ค์ ์งํฉ์
๋๋ค.
์๋ก ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ ๋ฐ์ดํฐ์ ์ ๊ทผ, ๊ตํ์ ํ ์ ์๋ ๋
๋ฆฝ์ ์ธ ์์คํ
์ผ๋ก ์ ์ง๋๋ฉฐ,
์ฌ๋ฌ ๋์ ์๋ฒ๊ฐ ํ๋์ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ ์ ์๊ณ , ํ ์๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ํด๋ฌ์คํฐ๊ฐ ์กด์ฌํ ์๋ ์์ต๋๋ค.
Elasticsearch๋ฅผ ๊ตฌ์ฑํ๋ ํ๋์ ๋จ์ ํ๋ก์ธ์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
๊ทธ ์ญํ ์ ๋ฐ๋ผ Master-eligible, Data, Ingest, Tribe ๋
ธ๋๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ํด๋ฌ์คํฐ์ ์ผ๋ถ์ด๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํด๋ฌ์คํฐ์ ์ธ๋ฑ์ฑ ๋ฐ ๊ฒ์ ๊ธฐ๋ฅ์ ์ฐธ์ฌํ๋ ๋จ์ผ ์๋ฒ์ ๋๋ค.
- ๋ ธ๋์ ํ ๋น๋๋ ์์ UUID์ธ ์ด๋ฆ์ผ๋ก ์๋ณํฉ๋๋ค.
- ํน์ ํด๋ฌ์คํฐ๋ฅผ ํด๋ฌ์คํฐ ์ด๋ฆ์ผ๋ก ๊ฒฐํฉํ๋๋ก ๋ ธ๋๋ฅผ ๊ตฌ์ฑ ํ ์ ์์ต๋๋ค.
index๋ RDBMS์์ database์ ๋์ํ๋ ๊ฐ๋
์
๋๋ค.
๋ํ shard์ replica๋ Elasticsearch์๋ง ์กด์ฌํ๋ ๊ฐ๋
์ด ์๋๋ผ, ๋ถ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์๋ ์กด์ฌํ๋ ๊ฐ๋
์
๋๋ค.
์ธ๋ฑ์ค
- ์์ธ ๊ณผ์ ์ ๊ฑฐ์น ๊ฒฐ๊ณผ๋ฌผ, ๋๋ ์์ธ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์ ์ฅ์์ ๋๋ค.
- ๋ค์ ์ ์ฌํ ํน์ฑ์ ๊ฐ๋ ๋ฌธ์๋ค์ ์งํฉ์ ๋๋ค.
์ค๋
- Index๋ ์ ์ฌ์ ์ผ๋ก ๋จ์ผ ๋ ธ๋์ ํ๋์จ์ด ์ ํ์ ์ด๊ณผ ํ ์ ์๋ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ๋จ์ผ ๋ ธ๋์ ๋์คํฌ๊ฐ ๋ง์ง ์๊ฑฐ๋ ๋จ์ผ ๋ ธ๋์ ๊ฒ์ ์์ฒญ๋ง ์ฒ๋ฆฌํ๊ธฐ์๋ ๋๋ฌด ๋๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ shards๋ฅผ ์ด์ฉํ์ฌ Index๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
- ์ํ์ ์ผ๋ก ์ฝํ ์ธ ๋ณผ๋ฅจ์ split/scale ๊ฐ๋ฅํฉ๋๋ค.
- ์ฌ๋ฌ ๋ ธ๋์์ ์ ์ฌ์ ์ผ๋ก ๋ถ์ฐ์ ํตํด ์์ ์ ๋ถ์ฐ ๋ฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ/์ฒ๋ฆฌ๋์ด ํฅ์๋ฉ๋๋ค.
-> ์ค๋ฉ๊ณผ ํํฐ์ ๋ ์ฐจ์ด
- ์ค๋ฉ : ์ฌ๋ฌ์์คํ ์ ๋๋์ด ์ ์ฅ
- ํํฐ์ ๋ : ํ ์์คํ ์์ ์ฌ๋ฌ ํ ์ด๋ธ๋ก ์ ์ฅ
Shard์ Replica ๊ฐ๋
์ฐธ๊ณ 1 : https://jiseok-woo.tistory.com/8
Shard์ Replica ๊ฐ๋
์ฐธ๊ณ 2 : http://guruble.com/elasticsearch-2-shard-replica/
๋ณต์
- ์ฅ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณต์ ๋ณธ ์ค๋๋ ๋ณต์ฌ๋ ์๋ณธ/๊ธฐ๋ณธ ์ค๋์ ๋์ผํ ๋ ธ๋์ ํ ๋น๋์ง ์์ต๋๋ค.
- ๋ชจ๋ ๋ณต์ ๋ณธ์์ ๊ฒ์์ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒ์ ๋ณผ๋ฅจ/์ฒ๋ฆฌ๋์ ์ํ ํ์ฅ ํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ์ธ๋ฑ์ค๋ 4๊ฐ์ ๊ธฐ๋ณธ ์ค๋์ 1๊ฐ์ ๋ณต์ ๋ณธ์ด ํ ๋น๋ฉ๋๋ค.
- ๋ ๋ค๋ฅธ ํํ์ shard๋ผ๊ณ ํ ์ ์์ต๋๋ค. ๋ ธ๋๋ฅผ ์์คํ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ์ ๋ขฐ์ฑ์ ์ํด ์ค๋๋ค์ ๋ณต์ ํ๋ ๊ฒ์ด์ฃ . ๋ฐ๋ผ์ replica๋ ์๋ก ๋ค๋ฅธ ๋ ธ๋์ ์กด์ฌํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
->Replica๊ฐ ํ์ํ ์ด์ 2๊ฐ์ง
-
- โ๊ฒ์์ฑ๋ฅ(search performance)โ
-
- โ์ฅ์ ๋ณต๊ตฌ(fail-over)โ
JSON ํํ์ ์ค์ ์๋ฏธ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง Elasticsearch ๊ธฐ๋ณธ ์ ์ฅ๋จ์
RDB์ row, ๋ ์ฝ๋์ ๋น์ท.
๋ฌธ์๋ ๊ฐ๊ฐ ๊ณ ์ ํ ID ๊ฐ์ ๊ฐ๋๋ค
๊ณ ์ ํ ID:
- ์ฌ์ฉ์ ์ง์ ๊ฐ or ๋๋ค๊ฐ
- ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๊ฐ๋ Meta key ์ญํ
- ์ค๋๋ฅผ ํตํด ๊ท๋ชจ๊ฐ ์ํ์ ์ผ๋ก ๋์ด๋ ์ ์์
- Json ๋ฌธ์๋ฅผ ํตํด ๋ฐ์ดํฐ ๊ฒ์์ ์ํํ๋ฏ๋ก ์คํค๋ง ๊ฐ๋ ์ด ์์
๋ฐ์ดํฐ๋ค์ ์ธ๋ฑ์ค(Index) ๋ผ๋ ๋
ผ๋ฆฌ์ ์ธ ์งํฉ ๋จ์๋ก ๊ตฌ์ฑ๋๋ฉฐ ์๋ก ๋ค๋ฅธ ์ ์ฅ์์ ๋ถ์ฐ๋์ด ์ ์ฅ๋ฉ๋๋ค.
์๋ก ๋ค๋ฅธ ์ธ๋ฑ์ค๋ค์ ๋ณ๋์ ์ปค๋ฅ์
์์ด ํ๋์ ์ง์๋ก ๋ฌถ์ด์ ๊ฒ์ํ๊ณ , ๊ฒ์ ๊ฒฐ๊ณผ๋ค์ ํ๋์ ์ถ๋ ฅ์ผ๋ก ๋์ถํ ์ ํน์ง.
RDB์ ๊ฒฝ์ฐ
like ๊ฒ์:
fox๊ฐ ํฌํจ๋ ํ๋ค์ ๊ฐ์ ธ์จ๋ค๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด Text ์ด์ ํ ์ค์ฉ ์ฐพ์ ๋ด๋ ค๊ฐ๋ฉด์ fox๊ฐ ์์ผ๋ฉด ๊ฐ์ ธ์ค๊ณ ์์ผ๋ฉด ๋์ด๊ฐ๋ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค
ElasticSearch์ ๊ฒฝ์ฐ
Inverted Index:
์ฑ
์ ๋งจ ๋ค์ ์๋ ์ฃผ์ ํค์๋์ ๋ํ ๋ด์ฉ์ด ๋ช ํ์ด์ง์ ์๋์ง ๋ณผ ์ ์๋ ์ฐพ์๋ณด๊ธฐ ํ์ด์ง์ ๋น์ ํ ์ ์์ต๋๋ค.
Elasticsearch์์๋ ์ถ์ถ๋ ๊ฐ ํค์๋๋ฅผ ํ
(term) ์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
์ด๋ ๊ฒ ์ญ ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด fox๋ฅผ ํฌํจํ๊ณ ์๋ ๋ํ๋จผํธ๋ค์ id๋ฅผ ๋ฐ๋ก ์ป์ด์ฌ ์ ์์ต๋๋ค.
Elasticsearch์ ์ ๋๋ผ์ด์ ๋ 0-3๊ฐ์ ์บ๋ฆญํฐ ํํฐ(Character Filter)์ 1๊ฐ์ ํ ํฌ๋์ด์ (Tokenizer), ๊ทธ๋ฆฌ๊ณ 0-n๊ฐ์ ํ ํฐ ํํฐ(Token Filter)๋ก ์ด๋ฃจ์ด์ง๋๋ค.
์บ๋ฆญํฐ ํํฐ: ์ ์ฒด ๋ฌธ์ฅ์์ ํน์ ๋ฌธ์๋ฅผ ๋์นํ๊ฑฐ๋ ์ ๊ฑฐํ๋๋ฐ ์ด ๊ณผ์ ์ ๋ด๋นํ๋ ๊ธฐ๋ฅ.
ํ ํฌ๋์ด์ : ๋ฌธ์ฅ์ ์ํ ๋จ์ด๋ค์ ํ
๋จ์๋ก ํ๋์ฉ ๋ถ๋ฆฌ ํด ๋ด๋ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์น๋๋ฐ ์ด ๊ณผ์ ์ ๋ด๋นํ๋ ๊ธฐ๋ฅ.(๋ฐ๋์ 1๊ฐ๋ง ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.)
lowercase ํ ํฐํํฐ: ๋๋ฌธ์๋ฅผ ๋ชจ๋ ์๋ฌธ์๋ก ๋ฐ๊ฟ์ค๋๋ค.
stop ํ ํฐํํฐ: ๋ถ์ฉ์ด(stopword, ๊ฒ์์ด๋ก์์ ๊ฐ์น๊ฐ ์๋ ๋จ์ด)๋ฅผ ์ ๊ฑฐ.
snowball ํ ํฐํํฐ: ํํ์ ๋ถ์ ๊ณผ์ ์ ๊ฑฐ์ณ์ ๋ฌธ๋ฒ์ ๋ณํ๋ ๋จ์ด๋ฅผ ์ผ๋ฐ์ ์ผ๋ก ๊ฒ์์ ์ฐ์ด๋ ๊ธฐ๋ณธ ํํ๋ก ๋ณํ.(jumps์ jumping์ ๋ชจ๋ jump๋ก ๋ณ๊ฒฝ)
์ถ์ฒ :
https://victorydntmd.tistory.com/308
https://iassad.tistory.com/7
https://heowc.tistory.com/49
https://esbook.kimjmin.net/06-text-analysis/6.1-indexing-data
- [๋์ฌ] ์์ธ (indexing) : ๋ฐ์ดํฐ๊ฐ ๊ฒ์๋ ์ ์๋ ๊ตฌ์กฐ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด ์๋ณธ ๋ฌธ์๋ฅผ ๊ฒ์์ด ํ ํฐ๋ค์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ๋ ์ผ๋ จ์ ๊ณผ์ ์ ๋๋ค.
- [๋ช ์ฌ] ์ธ๋ฑ์ค (index, indices) : ์์ธ ๊ณผ์ ์ ๊ฑฐ์น ๊ฒฐ๊ณผ๋ฌผ, ๋๋ ์์ธ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ์ ์ฅ์์ ๋๋ค. ๋ํ Elasticsearch์์ ๋ํ๋จผํธ๋ค์ ๋ ผ๋ฆฌ์ ์ธ ์งํฉ์ ํํํ๋ ๋จ์์ด๊ธฐ๋ ํฉ๋๋ค.
- ๊ฒ์ (search) : ์ธ๋ฑ์ค์ ๋ค์ด์๋ ๊ฒ์์ด ํ ํฐ๋ค์ ํฌํจํ๊ณ ์๋ ๋ฌธ์๋ฅผ ์ฐพ์๊ฐ๋ ๊ณผ์ ์ ๋๋ค.
- ์ง์ (query) : ์ฌ์ฉ์๊ฐ ์ํ๋ ๋ฌธ์๋ฅผ ์ฐพ๊ฑฐ๋ ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ๊ฒ์ ์ ์
๋ ฅํ๋ ๊ฒ์์ด ๋๋ ๊ฒ์ ์กฐ๊ฑด์
๋๋ค.
- -d : Elasticsearch๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด ๋ฐ๋ชฌ์ผ๋ก ์คํํฉ๋๋ค.
- -p <ํ์ผ๋ช > : Elasticsearch ํ๋ก์ธ์ค ID๋ฅผ ์ง์ ํ ํ์ผ์ ์ ์ฅํฉ๋๋ค. ์คํ์ด ์ข ๋ฃ๋๋ฉด ์ ์ฅ๋ ํ์ผ์ ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
- ํ ๋๋ ํ ๋ฆฌ์ config ๊ฒฝ๋ก ์๋ ์๋ ํ์ผ๋ค์ ๋ณ๊ฒฝ
- jvm.options - Java ํ๋ฉ๋ชจ๋ฆฌ ๋ฐ ํ๊ฒฝ๋ณ์ (Elasticsearch๋ Java์ ๊ฐ์๋จธ์ ์์์ ์คํ์ด ๋๋๋ฐ 7.0 ๊ธฐ์ค์ผ๋ก 1gb์ ํ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ค์ ๋์ด ์์ต๋๋ค.)
- elasticsearch.yml - Elasticsearch ์ต์ (elasticsearch ์คํ ํ๊ฒฝ์ ๋ํ ์ค์ ์ค์ ๋ค์ ๋๋ถ๋ถ elasticsearch.yml ํ์ผ์์ ์ค์ )
- log4j2.properties - ๋ก๊ทธ ๊ด๋ จ ์ต์
- ์์ ๋ช
๋ น์ผ๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ
- Elasticsearch ๋ฅผ ์ฒ์ ์คํํ ๋ -E ์ปค๋งจ๋ ๋ผ์ธ ๋ช ๋ น์ ํตํด์๋ ๊ฐ๋ฅํฉ๋๋ค.
- cluster.name: "<ํด๋ฌ์คํฐ๋ช >"
- node.name: "<๋ ธ๋๋ช >"
- node.attr.: ""
- path.data: [ "<๊ฒฝ๋ก>" ]
- path.logs: "<๊ฒฝ๋ก>"
- bootstrap.memory_lock: true
- network.host: <ip ์ฃผ์>
- http.port: <ํฌํธ ๋ฒํธ>
- transport.port: <ํฌํธ ๋ฒํธ>
- discovery.seed_hosts: [ "<ํธ์คํธ-1>", "<ํธ์คํธ-2>", ... ]
- cluster.initial_master_nodes: [ "<๋ ธ๋-1>", "<๋ ธ๋-2>" ]
- $ bin/elasticsearch -E cluster.name=my-cluster -E node.name="node-1"
Elasticsearch์ ๋
ธ๋๋ค์ ํด๋ผ์ด์ธํธ์์ ํต์ ์ ์ํ http ํฌํธ(9200-9299), ๋
ธ๋ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์ ์ํ tcp ํฌํธ (9300-9399) ์ด 2๊ฐ์ ๋คํธ์ํฌ ํต์ ์ ์ด์ด๋๊ณ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก 1๊ฐ์ ๋ฌผ๋ฆฌ ์๋ฒ๋ง๋ค ํ๋์ ๋
ธ๋๋ฅผ ์คํํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
- 3๊ฐ์ ๋ค๋ฅธ ๋ฌผ๋ฆฌ ์๋ฒ์์ ๊ฐ๊ฐ 1๊ฐ ์ฉ์ ๋
ธ๋๋ฅผ ์คํํ๋ฉด
- ์๋ฒ1 ์์ ๋๊ฐ์ ๋
ธ๋๋ฅผ ์คํํ๊ณ , ๋ ๋ค๋ฅธ ์๋ฒ์์ ํ๊ฐ์ ๋
ธ๋๋ฅผ ์คํ
์ถ์ฒ: https://esbook.kimjmin.net/03-cluster/3.1-cluster-settings
๋
ธ๋๊ฐ ์ฒ์ ์คํ ๋ ๋ ๊ฐ์ ์๋ฒ, ๋๋ discovery.seed_hosts: [ ] ์ ์ค์ ๋ ๋คํธ์ํฌ ์์ ๋ค๋ฅธ ๋
ธ๋๋ค์ ์ฐพ์ ํ๋์ ํด๋ฌ์คํฐ๋ก ๋ฐ์ธ๋ฉ ํ๋ ๊ณผ์
์์
- discovery.seed_hosts ์ค์ ์ ์๋ ์ฃผ์ ์์๋๋ก ๋ ธ๋๊ฐ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธ
- ๋
ธ๋๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ > cluster.name ํ์ธ
- ์ผ์นํ๋ ๊ฒฝ์ฐ > ๊ฐ์ ํด๋ฌ์คํฐ๋ก ๋ฐ์ธ๋ฉ > ์ข ๋ฃ
- ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ > 1๋ก ๋์๊ฐ์ ๋ค์ ์ฃผ์ ํ์ธ ๋ฐ๋ณต
- ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ > 1๋ก ๋์๊ฐ์ ๋ค์ ์ฃผ์ ํ์ธ ๋ฐ๋ณต
- ์ฃผ์๊ฐ ๋๋ ๋ ๊น์ง ๋ ธ๋๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ
- ์ธ๋ฑ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋(shard)๋ผ๋ ๋จ์๋ก ๋ถ๋ฆฌ๋๊ณ ๊ฐ ๋ ธ๋์ ๋ถ์ฐ๋์ด ์ ์ฅ์ด ๋ฉ๋๋ค.
- ๊ฐ์ ์ค๋์ ๋ณต์ ๋ณธ์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ ๋ฐ๋์ ์๋ก ๋ค๋ฅธ ๋ ธ๋์ ์ ์ฅ์ด ๋ฉ๋๋ค.
- ์ค๋์ ๊ฐ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฒ์ ์์ฑํ ๋ ์ง์ ํ ์ ์์ต๋๋ค.
- ํ๋ผ์ด๋จธ๋ฆฌ ์ค๋ ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฒ์ ์์ฑํ ๋ ์ง์ ํ๋ฉฐ, ์ธ๋ฑ์ค๋ฅผ ์ฌ์์ธ ํ์ง ์๋ ์ด์ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
- ๋ณต์ ๋ณธ์ ๊ฐ์๋ ๋์ค์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํ๋์ ๋
ธ๋๋ ์ธ๋ฑ์ค์ ๋ฉํ ๋ฐ์ดํฐ, ์ค๋์ ์์น์ ๊ฐ์ ํด๋ฌ์คํฐ ์ํ(Cluster Status) ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๋ง์คํฐ ๋
ธ๋์ ์ญํ ์ ์ํํฉ๋๋ค.
ํด๋ฌ์คํฐ๋ง๋ค ๋ฐ๋์ ํ๋์ ๋ง์คํฐ ๋
ธ๋๊ฐ ์กด์ฌํฉ๋๋ค.
(elasticsearch.yml)
- ๋ํดํธ ์ค์ ์ node.master: true๋ก ๋์ด ์์ต๋๋ค. ( ๋ชจ๋ ๋ ธ๋๊ฐ ๋ง์คํฐ ๋ ธ๋๋ก ์ ์ถ๋ ์ ์๋ ๋ง์คํฐ ํ๋ณด ๋ ธ๋ )
- ํด๋ฌ์คํฐ๊ฐ ์ปค์ ธ์ ๋ ธ๋์ ์ค๋๋ค์ ๊ฐ์๊ฐ ๋ง์์ง๊ฒ ๋๋ฉด ๋ชจ๋ ๋ ธ๋๋ค์ด ๋ง์คํฐ ๋ ธ๋์ ์ ๋ณด๋ฅผ ๊ณ์ ๊ณต์ ํ๋ ๊ฒ์ ๋ถ๋ด์ด ๋ ์ ์์ต๋๋ค. ๋ง์คํฐ ๋ ธ๋๋ก ์ฌ์ฉํ์ง ์๋ ๋ ธ๋๋ค์ ์ค์ ๊ฐ์ node.master: false ๋ก ํ์ฌ ๋ง์คํฐ ๋ ธ๋์ ์ญํ ์ ํ์ง ์๋๋ก ํฉ๋๋ค.
์ค์ ๋ก ์์ธ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์๋ ๋ ธ๋์ ๋๋ค.
(elasticsearch.yml)
- ๋ง์คํฐ ํ๋ณด ๋ ธ๋๋ค์ node.data: false ๋ก ์ค์ ํ์ฌ ๋ง์คํฐ ๋ ธ๋ ์ญํ ๋ง ํ๊ณ ๋ฐ์ดํฐ๋ ์ ์ฅํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค.
๋ง์คํฐ ํ๋ณด ๋
ธ๋๋ค์ 3๊ฐ ์ด์์ ํ์ ๊ฐ๋ฅผ ๋๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค. ๋ง์ฝ์ ๋ง์คํฐ ํ๋ณด ๋
ธ๋๋ฅผ 2๊ฐ ํน์ ์ง์๋ก ์ด์ํ๋ ๊ฒฝ์ฐ ๋คํธ์ํฌ ์ ์ค๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๊ฒช์ ์ ์์ต๋๋ค.
Split Brain์ด๋
๋คํธ์ํฌ ๋จ์ ๋ก ๋ง์คํฐ ํ๋ณด ๋
ธ๋๊ฐ ๋ถ๋ฆฌ๋๋ฉด ๊ฐ์๊ฐ ์๋ก ๋ค๋ฅธ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑ๋์ด ๋์ํ๋ค๊ฐ
๋คํธ์ํฌ๊ฐ ๋ณต๊ตฌ ๋๊ณ ํ๋์ ํด๋ฌ์คํฐ๋ก ๋ค์ ํฉ์ณ์ก์ ๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์์ค๋๋ ํ์.
Split Brain ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ
๋ง์คํฐ ํ๋ณด ๋
ธ๋ ๊ฐ์๋ ํญ์ ํ์๋ก ํ๊ณ ๊ฐ๋์ ์ํ ์ต์ ๋ง์คํฐ ํ๋ณด ๋
ธ๋ ์ค์ ์ (์ ์ฒด ๋ง์คํฐ ํ๋ณด ๋
ธ๋)/2+1 ๋ก ์ค์
(elasticsearch.yml)
7.0๋ฒ์ ๋ถํฐ๋ node.master: true ์ธ ๋
ธ๋๊ฐ ์ถ๊ฐ๋๋ฉด ํด๋ฌ์คํฐ๊ฐ ์ค์ค๋ก minimum_master_nodes ๋
ธ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋๋ก ๋์์ต๋๋ค.
์ฌ์ฉ์๋ ์ต์ด ๋ง์คํฐ ํ๋ณด๋ก ์ ์ถํ cluster.initial_master_nodes: [ ] ๊ฐ๋ง ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
ํ๋์ ์๋ฒ๊ฐ ํ์ฑ ์ํ๋ก ์๋น์ค ์ค์ผ ๋ ๋ค๋ฅธ ํ๋๋ ๋๊ธฐ๋ฅผ ํ๋ค.
ํ์ฑ ์๋ฒ์ ์ฅ์ ๊ฐ ๋ฐ์ํด ์๋น์ค๋ฅผ ๋ชปํ๊ฒ ๋๋ฉด, ๋๊ธฐ์๋ฒ๊ฐ ์ฅ์ ๋ฐ์์ ๊ฐ์งํ๊ณ ๋๊ธฐ ์๋ฒ์ ๋ชจ๋ ์๋น์ค๋ฅผ ์ฌ๋ ค์ ์๋น์ค๋ฅผ ์ด์ํ๋ ๊ตฌ์กฐ์ด๋ค.
๋ค์คํ ์ฅ๋น๊ฐ ๋๋ ๋ชจ๋ ํ์ฑํ ๋์ด ๋์ํ๋ ๊ตฌ์ฑ์ด๋ค. ๋๋๊ฐ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ Active-Standby์ ๋นํ์ฌ ์ฒ๋ฆฌ๋ฅ ์ด ๋์ง๋ง, ๋ณดํต ์ค์ ๋ฐ ๊ตฌ์ฑ์ด ๋ณต์กํด์ง๋ฉฐ ํ๋๊ฐ ์ฃฝ์์ ๊ฒฝ์ฐ, ๋๋์ ์ฒ๋ฆฌ๋์ ํ๋๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค๊ฐ ๋์์ ธ ๋ฆฌ์์ค์ ๋ํ ๊ณํ๋ ํ์ํ๋ค.
Elasticsearch์์๋ ์ค๋๋น ๋จ์ผ ์ฐ๋ ๋๊ฐ ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค.
์บ์ฑ์ ์ฌ์ฉํ์ง ์์ ๋, ์ต์ ์ฟผ๋ฆฌ ์๋ต ์๊ฐ์ ๋ฐ์ดํฐ, ์ฟผ๋ฆฌ ์ ํ ๋ฐ ์ค๋ ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๋ง์ ๊ฐ์์ ์์ ์ค๋๋ฅผ ์กฐํํ๋ฉด ๊ฐ ์ค๋๋ง๋ค ์ฒ๋ฆฌ ์๋๋ ๋นจ๋ผ์ง์ง๋ง ๋ ๋ง์ ์์
์ ํ์ ๋ฃ๊ณ ์์๋๋ก ์ฒ๋ฆฌํด์ผํ๋ฏ๋ก, ๋ ์ ์ ๊ฐ์์ ํฐ ์ค๋๋ฅผ ๊ฒ์ํ๋ ๊ฒ๋ณด๋ค ๋ฐ๋์ ๋น ๋ฅด๋ค๊ณ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๋์์ ์ฌ๋ฌ ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๋, ์ฌ๋ฌ ๊ฐ์ ์์ ์ค๋๊ฐ ์คํ๋ ค ์ฟผ๋ฆฌ ์ฒ๋ฆฌ๋(throughput)์ ์ค์ผ ์๋ ์๊ฒ ์ฃ .
์ค๋์ ์๊ฐ ๋๋ฌด ์ ์ผ๋ฉด ๋จ์ผ ์ฟผ๋ฆฌ์ ์๋ต ์๋๋ ๋๋ ค์ง ์ ์์ผ๋ ๋๋์ ์ฟผ๋ฆฌ๊ฐ ์ง์
๋ ๊ฒฝ์ฐ ๊ณ ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ฌ์ค ์ ์๊ณ , ์ค๋์ ์๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ๋จ์ผ ์ฟผ๋ฆฌ์ ์๋ต ์๋๋ ๋น ๋ฅผ ์ ์์ผ๋ ๋๋์ ์ฟผ๋ฆฌ๊ฐ ์ธ์
๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ ๋ณ ์ฑ๋ฅ ์ฐจ์ด๊ฐ ์ฌํด์ง ์ ์์ต๋๋ค.
์ถ์ฒ: https://www.elastic.co/kr/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster
https://brunch.co.kr/@alden/39
RESTFul API : ํญ์ ๋จ์ผ URL๋ก ์ ๊ทผ์ ํ๊ณ PUT, GET, DELETE ๊ฐ์ http ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค
http://<ํธ์คํธ>:<ํฌํธ>/<์ธ๋ฑ์ค>/_doc/<๋ํ๋จผํธ id>
- PUT (Update)
PUT my_index/_doc/1
{
"name":"GyeongJoo Lee",
"message":"์๋
ํ์ธ์ Elasticsearch"
}
- GET (Read)
GET my_index/_doc/1
- DELETE (Delete)
DELETE my_index/_doc/1
- POST (Create)
POST ๋ฉ์๋๋ PUT ๋ฉ์๋์ ์ ์ฌํ๊ฒ ๋ฐ์ดํฐ ์
๋ ฅ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ํ๋จผํธ๋ฅผ ์ ๋ ฅํ ๋ POST ๋ฉ์๋๋ก <์ธ๋ฑ์ค>/_doc ๊น์ง๋ง ์ ๋ ฅํ๊ฒ ๋๋ฉด ์๋์ผ๋ก ์์์ ๋ํ๋จผํธid ๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ํ๋จผํธid์ ์๋ ์์ฑ์ PUT ๋ฉ์๋๋ก๋ ๋์ํ์ง ์์ต๋๋ค.
POST my_index/_doc
{
"name":"GyeongJoo Lee",
"message":"์๋
ํ์ธ์ Elasticsearch"
}
- ์ฌ๋ฌ ๋ช
๋ น์ ๋ฐฐ์น๋ก ์ํํ๊ธฐ ์ํด์ _bulk API์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
_bulk API๋ก index, create, update, delete์ ๋์์ด ๊ฐ๋ฅํ๋ฉฐ delete๋ฅผ ์ ์ธํ๊ณ ๋ ๋ช ๋ น๋ฌธ๊ณผ ๋ฐ์ดํฐ๋ฌธ์ ํ ์ค์ฉ ์์๋๋ก ์ ํด์ผ ํฉ๋๋ค. - ๋ฒํฌ ๋์์ ๋ฐ๋ก๋ฐ๋ก ์ํํ๋ ๊ฒ ๋ณด๋ค ์๋๊ฐ ํจ์ฌ ๋น ๋ฆ ๋๋ค. ํนํ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ ํ ๋๋ ๋ฐ๋์ _bulk API๋ฅผ ์ฌ์ฉํด์ผ ๋ถํ์ํ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค.
๋ค์ ๋ช ๋ น์ผ๋ก bulk.json ํ์ผ์ ์๋ ๋ด์ฉ๋ค์ _bulk ๋ช ๋ น์ผ๋ก ์คํ ๊ฐ๋ฅํฉ๋๋ค. ํ์ผ ์ด๋ฆ ์์๋ @๋ฌธ์๋ฅผ ์ ๋ ฅํฉ๋๋ค.
$ curl -XPOST "http://localhost:9200/_bulk" -H 'Content-Type: application/json' --data-binary @bulk.json
Elasticsearch์ ์ง๊ฐ๋ ์ฟผ๋ฆฌ๋ฅผ ํตํ ๊ฒ์ ๊ธฐ๋ฅ์ ์์ต๋๋ค.
๊ฒ์์ ์ธ๋ฑ์ค ๋จ์๋ก ์ด๋ฃจ์ด์ง๋๋ค.
GET <์ธ๋ฑ์ค๋ช >/_search ํ์์ผ๋ก ์ฌ์ฉํ๋ฉฐ ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํ์ง ์์ผ๋ฉด ์ ์ฒด ๋ํ๋จผํธ๋ฅผ ์ฐพ๋ match_all ๊ฒ์์ ํฉ๋๋ค.
- URI ๊ฒ์์ผ๋ก ๊ฒ์์ด "value" ๊ฒ์
GET test/_search?q=value
- URI ๊ฒ์์ผ๋ก ๊ฒ์์ด "value AND three" ๊ฒ์ (AND, OR, NOT)
GET test/_search?q=value AND three
- URI ๊ฒ์์ผ๋ก "field" ํ๋์์ ๊ฒ์์ด "value" ๊ฒ์ (๊ฒ์์ด value ์ field ํ๋์์ ์ฐพ๊ณ ์ถ์ผ๋ฉด)
GET test/_search?q=field:value
๋ฐ์ดํฐ ๋ณธ๋ฌธ(data body) ๊ฒ์์ ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ ๋ณธ๋ฌธ์ผ๋ก ์
๋ ฅํ๋ ๋ฐฉ์์
๋๋ค.
Elasticsearch์ QueryDSL์ ์ฌ์ฉํ๋ฉฐ ์ฟผ๋ฆฌ ๋ํ Json ํ์์ผ๋ก ๋์ด ์์ต๋๋ค.
match ์ฟผ๋ฆฌ ์ฟผ๋ฆฌ ์ ๋ ฅ์ ํญ์ query ์ง์ ์๋ก ์์ํฉ๋๋ค. ๊ทธ ๋ค์ ๋ ๋ฒจ์์ ์ฟผ๋ฆฌ์ ์ข ๋ฅ๋ฅผ ์ง์ ํ๋๋ฐ ์์์๋ match ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํ์ต๋๋ค. ๊ทธ ๋ค์์ ์ฌ์ฉํ ์ฟผ๋ฆฌ ๋ณ๋ก ๋ฌธ๋ฒ์ด ์์ดํ ์ ์๋๋ฐ match ์ฟผ๋ฆฌ๋ <ํ๋๋ช >:<๊ฒ์์ด> ๋ฐฉ์์ผ๋ก ์ ๋ ฅํฉ๋๋ค. ๋ฐ์ดํฐ ๋ณธ๋ฌธ ๊ฒ์์ผ๋ก "field" ํ๋์์ ๊ฒ์์ด "value" ๊ฒ์
GET test/_search
{
"query": {
"match": {
"field": "value"
}
}
}
๋ฉํฐํ ๋์ (Multitenancy) ์ฌ๋ฌ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ํ๊บผ๋ฒ์ ๋ฌถ์ด์ ๊ฒ์ํ ์ ์๋ ๋ฉํฐํ ๋์๋ฅผ ์ง์ํฉ๋๋ค.
- ์ผํ๋ก ๋์ดํด์ ์ฌ๋ฌ ์ธ๋ฑ์ค ๊ฒ์
GET logs-2018-01,2018-02,2018-03/_search
- ์์ผ๋์นด๋ * ๋ฅผ ์ด์ฉํด์ ์ฌ๋ฌ ์ธ๋ฑ์ค ๊ฒ์
GET logs-2018-*/_search
Elasticsearch ๋ ๊ฒ์์ ์ํ ์ฟผ๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฐ ๋ฐ์ดํฐ ์์คํ
์์ ์ ๊ณตํ๋ ์ฟผ๋ฆฌ ๊ธฐ๋ฅ์ Query DSL (Domain Specific Language) ์ด๋ผ๊ณ ์ด์ผ๊ธฐ ํ๋ฉฐ Elasticsearch ์ Query DSL ์ ๋ชจ๋ json ํ์์ผ๋ก ์
๋ ฅํด์ผ ํฉ๋๋ค.
GET my_index/_search
์ ์๋๋ ๋์ผ
GET my_index/_search
{
"query":{
"match_all":{ }
}
}
#match ์ฟผ๋ฆฌ๋ก message ํ๋์์ dog ๊ฒ์
GET my_index/_search
{
"query": {
"match": {
"message": "dog"
}
}
}
dog๊ฐ ํฌํจ๋ ๋ํ๋จผํธ๋ค์ด ๊ฒ์ ๊ฒฐ๊ณผ๋ก ๋ํ๋ฉ๋๋ค.
#match ์ฟผ๋ฆฌ๋ก message ํ๋์์ quick dog ๊ฒ์
match ๊ฒ์์ ์ฌ๋ฌ ๊ฐ์ ๊ฒ์์ด๋ฅผ ์ง์ด๋ฃ๊ฒ ๋๋ฉด ๋ํดํธ๋ก OR ์กฐ๊ฑด์ผ๋ก ๊ฒ์์ด ๋์ด ์
๋ ฅ๋ ๊ฒ์์ด ๋ณ๋ก ํ๋๋ผ๋ ํฌํจ๋ ๋ชจ๋ ๋ฌธ์๋ฅผ ๋ชจ๋ ๊ฒ์ํฉ๋๋ค.
GET my_index/_search
{
"query": {
"match": {
"message": "quick dog"
}
}
}
quick๊ณผ dog์ค ์ด๋ค ๋จ์ด๋ผ๋ ํฌํจํ ๋ํ๋จผํธ๋ค์ด ๊ฒ์๋ฉ๋๋ค.
#๊ฒ์์ด๊ฐ ์ฌ๋ฟ์ผ ๋ ๊ฒ์ ์กฐ๊ฑด์ OR ๊ฐ ์๋ AND ๋ก ๋ฐ๊พธ๋ ค๋ฉด operator ์ต์
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
quick dog ๋ฅผ AND ์กฐ๊ฑด์ผ๋ก ๊ฒ์ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
GET my_index/_search
{
"query": {
"match": {
"message": {
"query": "quick dog",
"operator": "and"
}
}
}
}
"quick dog" ๋ผ๋ ๊ตฌ๋ฌธ์ ๊ณต๋ฐฑ์ ํฌํจํด ์ ํํ ์ผ์นํ๋ ๋ด์ฉ์ ๊ฒ์ํ๋ ค๋ฉด match_phrase ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
#match_phrase ์ฟผ๋ฆฌ๋ก "lazy dog" ๊ตฌ๋ฌธ ๊ฒ์
GET my_index/_search
{
"query": {
"match_phrase": {
"message": "lazy dog"
}
}
}
#slop ์ด๋ผ๋ ์ต์
์ ์ด์ฉํ์ฌ slop์ ์ง์ ๋ ๊ฐ ๋งํผ ๋จ์ด ์ฌ์ด์ ๋ค๋ฅธ ๊ฒ์์ด๊ฐ ๋ผ์ด๋๋ ๊ฒ์ ํ์ฉํ ์ ์์ต๋๋ค.
match_phrase ์ฟผ๋ฆฌ์ slop:1 ๋ก "lazy dog" ๊ตฌ๋ฌธ ๊ฒ์
GET my_index/_search
{
"query": {
"match_phrase": {
"message": {
"query": "lazy dog",
"slop": 1
}
}
}
}
slop์ ํฌ๊ธฐ๋ฅผ 1๋ก ํ๊ธฐ ๋๋ฌธ์ lazy์dog ์ฌ์ด์ jumping์ด ์๋ "Lazy jumping dog" ๊ฐ๋ ๊ฒ์์ด ๋ฉ๋๋ค.
URL๊ฒ์์ ์ฌ์ฉํ๋ ๋ฃจ์ฌ์ ๊ฒ์ ๋ฌธ๋ฒ์ ๋ณธ๋ฌธ ๊ฒ์์ ์ด์ฉํ๊ณ ์ถ์ ๋ query_string ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
#message ํ๋์์ lazy์ jumping์ ๋ชจ๋ ํฌํจํ๊ฑฐ๋ ๋๋ "quick dog" ๊ตฌ๋ฌธ์ ํฌํจํ๋ ๋ํ๋จผํธ๋ฅผ ๊ฒ์ํ๋ ์ฟผ๋ฆฌ์
๋๋ค.
match_phrase ์ฒ๋ผ ๊ตฌ๋ฌธ ๊ฒ์์ ํ ๋๋ ๊ฒ์ํ ๊ตฌ๋ฌธ์ ์๋ฐ์ดํ " ์์ ๋ฃ์ต๋๋ค.
GET my_index/_search
{
"query": {
"query_string": {
"default_field": "message",
"query": "(jumping AND lazy) OR \"quick dog\""
}
}
}
"Lazy jumping dog" ๋ํ๋จผํธ์ "quick dog" ๊ฐ์ ํฌํจํ๋ ๋ํ๋จผํธ ๋๊ฐ๊ฐ ๊ฒฐ๊ณผ๋ก ๋ฆฌํด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
- must : ์ฟผ๋ฆฌ๊ฐ ์ฐธ์ธ ๋ํ๋จผํธ๋ค์ ๊ฒ์ํฉ๋๋ค.
- must_not : ์ฟผ๋ฆฌ๊ฐ ๊ฑฐ์ง์ธ ๋ํ๋จผํธ๋ค์ ๊ฒ์ํฉ๋๋ค.
- should : ๊ฒ์ ๊ฒฐ๊ณผ ์ค ์ด ์ฟผ๋ฆฌ์ ํด๋นํ๋ ๋ํ๋จผํธ์ ์ ์๋ฅผ ๋์ ๋๋ค.
- filter : ์ฟผ๋ฆฌ๊ฐ ์ฐธ์ธ ๋ํ๋จผํธ๋ฅผ ๊ฒ์ํ์ง๋ง ์ค์ฝ์ด๋ฅผ ๊ณ์ฐํ์ง ์์ต๋๋ค. must ๋ณด๋ค ๊ฒ์ ์๋๊ฐ ๋น ๋ฅด๊ณ ์บ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ฌ์ฉ๋ฌธ๋ฒ
GET <์ธ๋ฑ์ค๋ช
>/_search
{
"query": {
"bool": {
"must": [
{ <์ฟผ๋ฆฌ> }, โฆ
],
"must_not": [
{ <์ฟผ๋ฆฌ> }, โฆ
],
"should": [
{ <์ฟผ๋ฆฌ> }, โฆ
],
"filter": [
{ <์ฟผ๋ฆฌ> }, โฆ
]
}
}
}
Elasticsearch ์ ๊ฐ์ ํ ํ
์คํธ ๊ฒ์์์ง์ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์
๋ ฅ๋ ๊ฒ์ ์กฐ๊ฑด๊ณผ ์ผ๋ง๋ ์ ํํ๊ฒ ์ผ์นํ๋ ์ง๋ฅผ ๊ณ์ฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ง๊ณ ์์ด
์ด ์ ํ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๊ฐ ๊ฐ์ฅ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋จผ์ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ์ด ์ ํํ ์ ๋๋ฅผ relevancy ๋ผ๊ณ ํฉ๋๋ค.
- _score ํญ๋ชฉ์ ์ค์ฝ์ด ์ ์๊ฐ ํ์๋๊ณ ์ด ์ ์๊ฐ ๋์ ๊ฒฐ๊ณผ๋ถํฐ ๋ํ๋ฉ๋๋ค.
- max_score์๋ ์ ์ฒด ๊ฒฐ๊ณผ ์ค์์ ๊ฐ์ฅ ๋์ ์ ์๊ฐ ํ์๋ฉ๋๋ค.
๋ํ๋จผํธ ๋ด์ ๊ฒ์๋ ํ (term)์ ๋ง์ด ํฌํจํ ์๋ก ์ ์๊ฐ ๋์์ง๋ ๊ฒ
์ ์ฒด ์ธ๋ฑ์ค์ ๊ฒ์ํ ํ ์ ํฌํจํ๊ณ ์๋ ๋ํ๋จผํธ ๊ฐ์๊ฐ ๋ง์์๋ก ๊ทธ ํ ์ ์์ ์ ์ ์๊ฐ ๊ฐ์ํ๋ ๊ฒ
๋ํ๋จผํธ์์ ํ๋ ๊ธธ์ด๊ฐ ํฐ ํ๋ ๋ณด๋ค๋ ์งง์ ํ๋์ ์๋ ํ ์ ๋น์ค์ด ํด ๊ฒ์ ๋๋ค.
๊ฒ์์ด ์ค ํน์ ๊ฒ์์ด๊ฐ ํฌํจ๋ ๊ฒฐ๊ณผ์ ๊ฐ์ค์น๋ฅผ ์ค์ ์์๋ก ์ฌ๋ฆฌ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ฌ์ฉ
๊ฒ์ ์กฐ๊ฑด์ ์ฐธ / ๊ฑฐ์ง ์ฌ๋ถ๋ง ํ๋ณํด์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋๋ค.
- bool : filter filter๋ ๊ฒ์์ ์กฐ๊ฑด์ ์ถ๊ฐํ์ง๋ง ์ค์ฝ์ด์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ก ์ ์ดํ ๋ ์ฌ์ฉ.
- keyword
๋ฌธ์์ด๊ณผ ๊ณต๋ฐฑ, ๋์๋ฌธ์๊น์ง ์ ํํ ์ผ์นํ๋ ๋ฐ์ดํฐ๋ง์ ๊ฒฐ๊ณผ๋ก ๋ฆฌํดํฉ๋๋ค.
์ค์ฝ์ด๋ฅผ ๊ณ์ฐํ์ง ์๊ธฐ ๋๋ฌธ์ keyword ๊ฐ์ ๊ฒ์ ํ ๋๋ filter ๊ตฌ๋ฌธ ์์ ๋ฃ๋๋ก ํฉ๋๋ค.
์ซ์, ๋ ์ง ํ์์ range ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ ๊ฒ์์ ํฉ๋๋ค.
'range : { <ํ๋๋ช
>: { <ํ๋ผ๋ฉํฐ>:<๊ฐ> } }'
#price ๊ฐ์ด 700 ์ด์ 900 ๋ฏธ๋ง์ธ ๋ฐ์ดํฐ ๊ฒ์
GET phones/_search
{
"query": {
"range": {
"price": {
"gte": 700,
"lt": 900
}
}
}
}
#date ๊ฐ์ด 2016-01-01 ~ 2018-01-01 ์ฌ์ด์ ๋ฐ์ดํฐ ๊ฒ์
GET phones/_search
{
"query": {
"range": {
"date": {
"gt": "31/12/2015",
"lt": "2018",
"format": "dd/MM/yyyy||yyyy"
}
}
}
}
๋ถ์๋ ๋ฌธ์ฅ์ _analyze API๋ฅผ ์ด์ฉํด์ ํ์ธํ ์ ์์ต๋๋ค.
ํ ํฌ๋์ด์ ๋ tokenizer, ํ ํฐ ํํฐ๋ filter ํญ๋ชฉ์ ๊ฐ์ผ๋ก ์
๋ ฅํ๋ฉด ๋ฉ๋๋ค.
ํ ํฌ๋์ด์ ๋ ํ๋๋ง ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์
๋ ฅํ๊ณ , ํ ํฐํํฐ๋ ์ฌ๋ฌ๊ฐ๋ฅผ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ [ ] ์์ ๋ฐฐ์ด ํ์์ผ๋ก ์
๋ ฅํฉ๋๋ค.
GET _analyze
{
"text": "The quick brown fox jumps over the lazy dog",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"stop",
"snowball"
]
}
-
์ฌ๋ฌ ํ ํฐ ํํฐ๋ฅผ ์ ๋ ฅ ํ ๋๋ ์์๊ฐ ์ค์ํ๋ฉฐ ๋ง์ฝ์ stop ํ ํฐ ํํฐ๋ฅผ lowercase ๋ณด๋ค ๋จผ์ ๋๊ฒ ๋๋ฉด stop ํ ํฐํํฐ ์ฒ๋ฆฌ์ ๋๋ฌธ์๋ก ์์ํ๋ "The"๋ ๋ถ์ฉ์ด๋ก ๊ฐ์ฃผ๋์ง ์์ ๊ทธ๋ฅ ๋จ์์๊ฒ ๋ฉ๋๋ค. ๊ทธ ํ์ lowercase๊ฐ ์ ์ฉ๋์ด ์๋ฌธ์ "the"๊ฐ ์ต์ข ๊ฒ์ ํ ์ผ๋ก ์ญ ์์ธ์ ๋จ์์๊ฒ ๋ฉ๋๋ค.
-
whitespace ํ ํฌ๋์ด์ ๊ทธ๋ฆฌ๊ณ lowercase, stop, snowball ํ ํฐํํฐ๋ค์ ์กฐํฉํ ๊ฒ์ด snowball ์ ๋๋ผ์ด์ ์ ๋๋ค.
snowball ์ ๋๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ ๊ฒฐ๊ณผ๋ ์์ whitespace ํ ํฌ๋์ด์ ๊ทธ๋ฆฌ๊ณ lowercase, stop, snowball ํ ํฐํํฐ๋ฅผ ์ฌ์ฉํ ๊ฒฐ๊ณผ์ ๋์ผํ๊ฒ ๋ํ๋ฉ๋๋ค. -
jumps, jumping์ ๊ฒ์ํ๋ฉด ์ค์ ๋ก๋ jump๋ก ๋ฐ๊พธ์ด ๊ฒ์์ด ๋ฉ๋๋ค.
basketball ์ธ๋ฑ์ค ์ถ๊ฐ
$ curl -XPUT localhost:9200/basketball
์ฌ์ฉ๋ ํ๋๋ค์ data type์ ์ง์ ํด์ฃผ์ด ์๊ฐํ์ ๋์์ ์ค. (์ฃผ์: ContentType ๋ช ์)
$ curl -XPUT 'localhost:9200/basketball/record/_mappin' -d @basketball_mapping.json -H 'ContentType:application/json'
bulk (json์๋ฃ ํ๊บผ๋ฒ์ ์ฝ์ )
$ curl -XPOST 'localhost:9200/_bulk' --data-binary @bulk_basketball.json
basketball index ์ญ์
$ curl -XDELETE localhost:9200/basketball
Discover ํ์ด์ง: ํน์ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์์.
-
๋ํ๊ธฐ ๋ชจ์ ๋ฒํผ์ ํด๋ฆญํ์ฌ ํด๋น ๋ฐ์ดํฐ์ ์ผ์นํ๋ ๊ฒ๋ค๋ง ์๊ฐํํ๋๋ก ํํฐ๋ฅผ ์ถ๊ฐํ ์ ์์.
-
ํ ๊ธ ๋ฒํผ์ ๋๋ฌ ํน์ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ณด๋ค๋ง ํ์ธํ ์ ์์.
-
ํํ ๋ฆฌ์ผ
https://github.com/eskrug/elastic-demos/tree/master/covid19 -
๋ฐ์ดํฐ
https://www.kaggle.com/kimjihoo/coronavirusdataset -
TimeProvince.csv ๋ฐ์ดํฐ์ ์ ํ์ผ์ ๋ก๋.
-
Mappings๋ฅผ longํ์ ์ด ๋ถํ์ํ ๋ฐ์ดํฐ๋ค์ ๋น๊ต์ ํฌ๊ธฐ๊ฐ ์์ integer๋ก ๋ฐ๊ฟ.
-
EMS(Elastic Map Service)์์ ๋ค๋ฅด๊ฒ ๋ผ์๋ ์ง์ญ๋ช ๊ณผ ๋งค์นญ์ด ๋๊ฒ ํด์ค์ผ ํจ.
Elastic Map Service : https://maps.elastic.co/#file/south_korea_provinces
-
south-korea-province ์ธ๋ฑ์ค์ ๊ฐ ์ ๋ ฅ.
- covid19-name : TimeProvince.csv ํ์ผ์ province ํ๋ ๊ฐ
- ems-name { en, kr} : Elastic Map Service ์ South Korea Provinces ๋งต์ ๋งค์นญ๋๋ ๊ฐ
- ์์ธ์ ๋ฐ์ดํฐ ํ์ฅ์ ์ํ enrich pipeline ์์ฑ ๋ฐ ํ์ฅ
- Enrich Ingest Pipeline ์์ฑ
- Enrich ํ๋ก์ธ์๋ฅผ ์ ์ฉํด์ ์ธ๋ฑ์ค ๊ฐ ์
๋ฐ์ดํธ
- Index Pattern ์์ฑ
- Discover์์ ๋ฐ์ดํฐ ํ์ธ
- Area Chart
- Line Chart
- Dashboard (Maps์ Metric๋ ์ถ๊ฐ)
์ต๊ทผ์๋ ์ปดํจํฐ ์ ์ฒด๋ฅผ ๊ฐ์ํํ๋ ๊ฐ์๋จธ์ ์ ๋นํด ์ค๋ฒํค๋๊ฐ ์ ์ ์ปจํ
์ด๋ ๊ธฐ์ ์ด ์ฃผ๋ชฉ ๋ฐ๊ณ ์์ต๋๋ค.
๊ฐ์๋จธ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ปจํ
์ด๋๋ ์ปจํ
์ด๋ ๋ด๋ถ์ ์ ์ฅ๋๋ ์ํํธ์จ์ด๋ฅผ ๋ด๊ณ ์๋ ํ์ผ๋ค์ ํจํค์งํ ์ ์๋ ํฌ๋งท์ด ํ์ํ๋ฐ,
๊ฐ์๋จธ์ ์ OVF์ ํด๋นํ๋ ํ์ค์ด OCI (Open Container Initiative) ์
๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ CRI๋ฅผ ๋ง๋ค์ด ๋ช
ํํ๊ฒ ์ ์๋ ์ถ์ํ ๊ณ์ธต์ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ์ปจํ
์ด๋ ๋ฐํ์ ๊ตฌ์ถ์ ์ง์คํ ์ ์๊ฒ ํ์์ต๋๋ค.
์ด๊ธฐ ์ฟ ๋ฒ๋คํฐ์ค๋ ์ปจํ
์ด๋๋ฅผ ์คํํ๊ธฐ ์ํด ๋์ปค๋ฅผ ์ฌ์ฉํ์๋๋ฐ ์ด๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์ปค ๋
ธ๋์ ์์ด์ ํธ์ธ Kubelet ์์ค์ฝ๋ ๋ด๋ถ์ ํตํฉ๋์ด ์์์ต๋๋ค.
์ด์ฒ๋ผ ํตํฉ๋ ํ๋ก์ธ์ค๋ Kubelet์ ๋ํ ๊น์ ์ดํด๋ฅผ ํ์๋ก ํ์๊ณ ์ฟ ๋ฒ๋คํฐ์ค ์ปค๋ฎค๋ํฐ์ ์๋นํ ์ ์ง๋ณด์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์์ผฐ์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฟ ๋ฒ๋คํฐ์ค๋ CRI๋ฅผ ๋ง๋ค์ด ๋ช
ํํ๊ฒ ์ ์๋ ์ถ์ํ ๊ณ์ธต์ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ์ปจํ
์ด๋ ๋ฐํ์ ๊ตฌ์ถ์ ์ง์คํ ์ ์๊ฒ ํ์์ต๋๋ค.
-
์ ์์ค ์ปจํ ์ด๋ ๋ฐํ์
namespace์ cgroup์ ์ค์ ํ ๋ค์ ํด๋น namespace ๋ฐ cgroup ๋ด์์ ๋ช ๋ น ์คํํฉ๋๋ค.
OCI๋ฅผ ์ค์ํ๋ ์ ์์ค ์ปจํ ์ด๋ ๋ฐํ์์๋ runC๊ฐ ์์ต๋๋ค.
์ ์์ค ์ปจํ ์ด๋ ๋ฐํ์์ ์ปจํ ์ด๋๋ฅผ ์ค์ ์คํํ๋ ์ญํ ์ ํ์ง๋ง ์ด๋ฏธ์ง๋ก๋ถํฐ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ค๋ฉด ์ด๋ฏธ์ง์ ๊ด๋ จ๋ API๊ฐ์ ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค. ์ด๋ ๊ณ ์์ค ์ปจํ ์ด๋ ๋ฐํ์์์ ์ ๊ณตํฉ๋๋ค. -
๊ณ ์์ค ์ปจํ ์ด๋ ๋ฐํ์
์๊ฒฉ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปจํ ์ด๋๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์คํํ๊ณ ๋ชจ๋ํฐ๋ง ํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ฐ๋ชฌ ๋ฐ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ปจํ ์ด๋๋ฅผ ์คํํ๊ธฐ ์ํด ์ ์์ค ๋ฐํ์ ์์ ๋ฐฐ์นํฉ๋๋ค.
์ด์ฒ๋ผ ์ปจํ ์ด๋๋ฅผ ์คํํ๋ ค๋ฉด ์ ์์ค ๋ฐ ๊ณ ์์ค ์ปจํ ์ด๋ ๋ฐํ์์ด ํ์ํ๊ธฐ ๋๋ฌธ์ OCI ๋ฐํ์๊ณผ ํจ๊ป ๋์ปค๊ฐ ๊ทธ ์ญํ ์ ํ์ต๋๋ค.
๋์ปค๋ docker-containerd๋ผ๋ ๊ณ ์์ค ์ปจํ ์ด๋ ๋ฐํ์์ ์ ๊ณตํฉ๋๋ค.
CRI์ OCI์์ ์ ๋๋ ํ๋ก์ ํธ๋ก ์ปจํ
์ด๋ ๋ฐํ์ ๋ฐ ์ด๋ฏธ์ง๊ฐ OCI์ ํธํ๋๋ ๊ฒ์ ์ค์ ์ ๋๊ณ ์๋ค.
CRI ํ์ค ์ปดํฌ๋ํธ๋ฅผ ์ต์ํ์ ๋ฐํ์์ผ๋ก ๊ตฌํํ๋ฉฐ ์ฟ ๋ฒ๋คํฐ์ค์์ ๋ชจ๋ OCI ํธํ ๋ฐํ์ ๋ฐ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ง์ํฉ๋๋ค.
CRI-O๋ ์ปจํ
์ด๋ ์คํ๋ชฉ์ ์ด๊ธฐ ๋๋ฌธ์ ๋์ปค๊ฐ ์ ๊ณตํ๋ ์ปจํ
์ด๋ ์์ฑ ๋ฐ ์ด๋ฏธ์ง ๋น๋์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๋๋ค.
VM์ "hypervisor"๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌผ๋ฆฌ์ ์์คํ
์์์ ์คํ๋ฉ๋๋ค.
hypervisor ์์ฒด๋ "ํธ์คํธ ๋จธ์ "์ด๋ผ๊ณ ํ๋ ๋ฌผ๋ฆฌ์ ์ปดํจํฐ์์ ์คํ๋ฉ๋๋ค.
Hypervisor๊ธฐ๋ฐ Solution์ ์ฃผ์ ์ฅ์ ์ ์ฌ๋ฌ๋ถ์ด ์ ์ฒด ๋ฒ์ OS๋ฅผ ์ด์์ ๊ฐ๋ฅํ๊ฒ ํ๋ค๋ ๊ฒ์
๋๋ค.
ํ๋์จ์ด ๊ฐ์ํ๋ฅผ ์ ๊ณตํ๋ VM๊ณผ ๋ฌ๋ฆฌ ์ปจํ
์ด๋๋ "์ฌ์ฉ์ ๊ณต๊ฐ"์ ์ถ์ํํ์ฌ ์ด์ ์ฒด์ ์์ค์ ๊ฐ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
"The one big difference between containers and VMs is that containers share the host systemโs kernel with other containers."
์ปจํ
์ด๋์ VM์ ํฐ ์ฐจ์ด์ ์ ์ปจํ
์ด๋๊ฐ ํธ์คํธ ์์คํ
์ ์ปค๋์ ๋ค๋ฅธ ์ปจํ
์ด๋์ ๊ณต์ ํ๋ค๋ ๊ฒ์
๋๋ค.
VMs์ ๊ฒฝ์ฐ ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋งํผ ๊ฒฝ๋ํํ ์๋ ์์ต๋๋ค.
๋ฆฌ์์ค์ ๊ธฐ๋ฅ์ด ์ ํ๋์ด ์์ ๋๋ ์ง์ค์ ์ผ๋ก ๋ฐฐํฌํ ์ ์๋ ๊ฒฝ๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ํฉ๋๋ค.
Linux ์ปจํ
์ด๋๋ ์ด์ ์ฒด์ ์์ ๊ธฐ๋ณธ์ผ๋ก ์คํ๋๊ณ ๋ชจ๋ ์ปจํ
์ด๋ ์ ์ฒด์์ ์ด์ ์ฒด์ ๋ฅผ ๊ณต์ ํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ์๋น์ค๋ฅผ ๊ฐ๋ณ๊ฒ ์ ์งํ ์ ์์ผ๋ฉฐ ๋น ๋ฅธ ์๋๋ก ๋์์ ์คํํ ์ ์์ต๋๋ค.
ํด, ํ
ํ๋ฆฟ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ธ์ด ๋ฐ์ธ๋ฉ ์ธํธ๋ฅผ ์ ๊ณตํ๋ ์คํ์์ค ์ปจํ
์ด๋ ํ๋ซํผ์
๋๋ค.
LXC์๋ ์ปจํ
์ด๋๋ฅผ ์์ํ ๋ ์ฌ์ฉ์ ํ๊ฒฝ์ ๊ฐ์ ํ๋ ๋จ์ํ ์ปค๋งจ๋๋ผ์ธ ์ธํฐํ์ด์ค๊ฐ ์์ต๋๋ค.
LXC๋ ๋๋ถ๋ถ์ Linux ๊ธฐ๋ฐ ์์คํ
์ ์ค์นํ ์ ์๋ ์ด์ ์ฒด์ ์์ค์ ๊ฐ์ํ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ฉ ์ค์ธ Linux ๋ฐฐํฌ์์ ํจํค์ง ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ํตํด ์ ๊ณตํ ์๋ ์์ต๋๋ค.
- ์ฐ๋ถํฌ ์ต์ ๋ฒ์ ์ด๋ฏธ์ง ๋ค์ด
$ docker pull ubuntu:latest
- ๊ฐ๋จํ๊ฒ ๋์ปค ์ด๋ฏธ์ง ๋ชฉ๋ก์ ํ์ธ
$ docker images
- ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ญ์
$ docker rmi [OPTIONS] IMAGE [IMAGE...]
- ์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก์ ํ์ธ (-a : ์ค์ง๋ ์ปจํ ์ด๋๋ ํ์ธ)
$ docker ps
- ์ฐ๋ถํฌ ์ด๋ฏธ์ง ๋์ปค ์คํ
ํค๋ณด๋ ์ ๋ ฅ์ ์ํด -it(== โi โt)์ต์ ์ ์ค๋๋ค.
--rm์ต์ ์ด ์๋ค๋ฉด ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๋๋ผ๋ ์ญ์ ๋์ง ์๊ณ ๋จ์์์ต๋๋ค.
$ docker run --rm -it ubuntu:latest bash
- ์คํ์ค์ธ ์ปจํ ์ด๋๋ฅผ ์ค์ง
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
- ์ข ๋ฃ๋ ์ปจํ ์ด๋๋ฅผ ์์ ํ ์ ๊ฑฐ
$ docker rm [OPTIONS] CONTAINER [CONTAINER...]
- ๋ชจ๋ ์ปจํ ์ด๋๋ฅผ ์ ๊ฑฐ
$ docker rm $(docker ps -qa)
- ์ด๋ฏธ์ง ์ ๊ฑฐ
docker rmi <์ ์ฅ์ ์ด๋ฆ>/<์ด๋ฏธ์ง ์ด๋ฆ, ID>:<ํ๊ทธ>
- ์ปจํ ์ด๋ ๋ก๊ทธ ํ์ธ (-f : ์ค์๊ฐ์ผ๋ก ๋ก๊ทธ ํ์ธ)
$ docker logs
- Busybox(๋งค์ฐ ์์ ์ด๋ฏธ์ง)
$ docker run ---rm it busybox:latest sh
- ๋์ปค ์ปจํ ์ด๋๋ผ๋ฆฌ ํต์ ์ ํ ์ ์๋ ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์์ฑ
$ docker network create [OPTIONS] NETWORK
- example > app-network๋ผ๋ ์ด๋ฆ์ผ๋ก wordpress์ mysql์ด ํต์ ํ ๋คํธ์ํฌ ์์ฑ
$ docker network create app-network
- ๊ธฐ์กด์ ์์ฑ๋ ์ปจํ ์ด๋์ ๋คํธ์ํฌ๋ฅผ ์ถ๊ฐ
$ docker network connect [OPTIONS] NETWORK CONTAINER
- example > ๋ง๋ค์ด ๋์ mysql ์ ๋คํธ์ํฌ๋ฅผ ์ถ๊ฐ
$ docker network connect app-network mysql
- example > ์๋ํ๋ ์ค๋ฅผ appโnetwork ์ ์ํ๊ฒ ์์ฑํ๊ณ IP ๊ฐ ์๋ mysql ์ปจํ
์ด๋ ip๋ก ๋ฐ๋ก ์ ๊ทผ
๊ฐ์ ๋คํธ์ํฌ์ ์ํด ์์ผ๋ฉด ์๋ ์ปจํ ์ด๋์ ์ด๋ฆ์ DNS ๋ก ์กฐํํ์ฌ ๋ฐ๋ก ์ ๊ทผ ํ ์ ์์ต๋๋ค.
ํ๋์ ์ปจํ ์ด๋๋ ์ฌ๋ฌ๊ฐ์ network ์ ์ํ ์ ์์ผ๋ฉฐ Docker Swarm ๊ฐ์ ํด๋ฌ์คํฐ์์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ docker run -d -p 8080:80 \
--network=app-network \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress
- Mysql ๋์ปค๋ก ์คํ
$ docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7
- Mysql์ ์ ์ํ์ฌ database ๋ง๋ค๊ธฐ
$ docker exec -it mysql mysql
create database wp CHARACTER SET utf8;
grant all privileges on wp.* to wp@'%' identified by 'wp';
flush privileges;
quit
-
exec ๋ช ๋ น์ด์ run ๋ช ๋ น์ด์ ์ฐจ์ด
exec ๋ช ๋ น์ด๋ run ๋ช ๋ น์ด์ ๋ฌ๋ฆฌ ์คํ์ค์ธ ๋์ปค ์ปจํ ์ด๋์ ์ ์ํ ๋ ์ฌ์ฉํ๋ฉฐ
์ผ๋ฐ์ ์ผ๋ก ์ปจํ ์ด๋ ์์ ssh server ๋ฑ์ ์ค์นํ์ง ์๊ณ exec ๋ช ๋ น์ด๋ก ์ ์ํฉ๋๋ค. -
docker-compose ์ค์น
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
- docker-compose.yml ์์ฑ(db์ wordpress์๋น์ค๋ฅผ ํ๋์ ํ์ผ๋ก ๋ฌถ์)
"volumes: " -> ๋ณผ๋ฅจ ๋ง์ดํธ๋ฅผ ํ์ฌ ์ปจํ ์ด๋๊ฐ ์ฌ๋ผ์ง๋๋ผ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ค๋์ง ์๋๋ก ํจ.
version: '2'
services:
db:
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
image: wordpress:latest
volumes:
- ./wp:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress
- docker compose๋ฅผ ์ด์ฉํ์ฌ ์ ํ์ผ๋ก ์์ฑํ ๊ฒ๊ณผ ๊ฐ์ด mysql, wordpress ์คํ
$ docker-compose up -d
- docker compose๋ก ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃํ๊ณ ์ญ์
$ docker-compose down
์ค์ต : git์ ์ถ๊ฐ์ ์ผ๋ก ์ค์นํ ํ๊ฒฝ์ ์ด๋ฏธ์ง๋ก ๋ง๋ค๊ธฐ(์ปจํ ์ด๋ ํ๊ฒฝ์ ์ ์ฅ)
- ์ปจํ ์ด๋๋ฅผ ์คํ์ํค๊ณ git์ ์ค์น
$ docker run -it ubuntu:latest --name git /bin/bash
# apt update
# apt install git
- ์ปจํ ์ด๋ ์ฐจ์ด์ ๋น๊ต(๋ณ๊ฒฝ์ฌํญ ํ์ธ ๊ฐ๋ฅ)
$ docker diff CONTAINER_ID
- ubuntu:git ์ด๋ฆ์ผ๋ก ์ด๋ฏธ์ง ์์ฑ
$ docker commit git ubuntu:git
- ์ด๋ฏธ์ง ์์ฑ๋๋์ง ํ์ธ
$ docker images | grep ubuntu
๊ฒฐ๊ณผ:
ubuntu | git | f98472c1d8aa | 6 seconds ago | 252.2 MB
..
- Dockerfile์ด๋?
์ด๋ฏธ์ง ์์ฑ ๊ณผ์ ์ ๊ธฐ์ ํ Docker์ ์ฉ DSL - Dockerfile ์์ฑ
$ vim Dockerfile
๋ค์๊ณผ ๊ฐ์ด ์์ฑ
# ์ด๋ค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ง ๊ฒฐ์ (๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ง์ )
FROM ubuntu:16.04
# RUN์ ์คํํ ๋ช
๋ น์ด๋ฅผ ์๋ฏธ
RUN apt update
RUN apt install -y
- ํ์ฌ ๊ฒฝ๋ก์ ์๋ ๋์ปคํ์ผ์ ์ด์ฉํ์ฌ ubuntu:git ์ด๋ฆ์ผ๋ก ์ด๋ฏธ์ง ์์ฑ
$ docker build -t ubuntu:git2 ./
- Dockerfile๋ก ์์ฑํ ์ด๋ฏธ์ง ์คํํด๋ณด๊ธฐ
$ docker run --rm -it ubuntu:git2 bash
- FROM <์ด๋ฏธ์ง์ด๋ฆ>
๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ง์ - ADD <์ถ๊ฐํ ํ์ผ> <์ถ๊ฐ๋ ๊ฒฝ๋ก>
ํ์ผ ์ถ๊ฐ
ADD data.txt /temp/data.txt
- RUN <๋ช
๋ น์ด>
๋ช ๋ น์ด ์คํ - WORKDIR <๊ฒฝ๋ก>
์์ ๋๋ ํฐ๋ฆฌ ๋ณ๊ฒฝ(cd <๊ฒฝ๋ก>์ ๋น์ทํ ๋๋) - ENV <ํ๊ฒฝ๋ณ์> <๊ฐ>
ํ๊ฒฝ๋ณ์ ๊ธฐ๋ณธ๊ฐ ์ง์ - EXPOSE <ํฌํธ>
์ปจํ ์ด๋๋ก ์คํ ์ ๋ ธ์ถ์ํฌ ํฌํธ - CMD <๋ช
๋ น์ด>
์ด๋ฏธ์ง์ ๊ธฐ๋ณธ ์คํ ๋ช ๋ น์ด ์ง์
<๋ช ๋ น์ด>๊ฐ ๋น์ด์์ ๋๋ bash๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ง์
๋์ปคํ๋ธ ์ฃผ์
https://hub.docker.com/
- tag๋ช ๋ น์ด๋ก ์ด๋ฏธ์ง์ ํ๊ทธ(์ ์ฅ์ ์ด๋ฆ : gjlee0802)
$ docker tag mydockerimage:latest gjlee0802/mydockerimage:latest
- Dockerhub์ ๋ก๊ทธ์ธ
$ docker login --username=gjlee0802 --email=userid@gmail.com
Password:
WARNING: login credentials saved in /Users/devsun/.docker/config.json
Login Succeeded
- ๋์ปคํ๋ธ์ ์ด๋ฏธ์ง push
$ docker push gjlee0802/mydockerimage
- ๋์ปคํ๋ธ๋ก๋ถํฐ ์ด๋ฏธ์ง pull
$ docker pull gjlee0802/mydockerimage
๊ฐ์ข
๋ฐ์ดํฐ๋ฅผ ๋ด๋ topic์ด๋ผ๋ ๊ฐ๋
์ด ์๋๋ฐ, ์ฝ๊ฒ ์๊ฐํด์ ํ(queue) ๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค.
ํ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ์ญํ ์ Producer๊ฐ ํ๊ณ , ํ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ์ Consumer๊ฐ ํฉ๋๋ค.
Producer์ Consumer์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ผ์์ด์ ์ดํ๋ฆฌ์ผ์ด์
์์ ๊ตฌํ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ค๊ฐ๋ ๋ฐ์ดํฐ ํฌ๋งท์ ๊ฑฐ์ ์ ํ์ด ์์ต๋๋ค.(json, tsv, avro etc... ์ฌ๋ฌ ํฌ๋งท์ ์ง์)
- Topic์ ํด๋นํ๋ ๋ฉ์์ง๋ฅผ ์์ฑ
- ํน์ Topic์ผ๋ก ๋ฐ์ดํฐ๋ฅผ publish
- ์ฒ๋ฆฌ ์คํจ/์ฌ์๋
- Topic์ partition์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ polling(๊ฐ์ ธ์ค๊ธฐ)
- Partition offset(ํํฐ์ ์ ์๋ ๋ฐ์ดํฐ์ ๋ฒํธ) ์์น ๊ธฐ๋ก(commit) -> ์ด๋ ์ง์ ๊น์ง ๋ฐ์ดํฐ๋ฅผ ์ฝ์๋์ง ํ์ธํ์ฌ ๊ณ ๊ฐ์ฉ์ฑ ๋ณด์ฅ
- Consumer group์ ํตํด ๋ณ๋ ฌ์ฒ๋ฆฌ(ํํฐ์ ๊ฐ์์ ๋ฐ๋ผ ์ปจ์๋จธ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ฐฐ์น) -> ์ฃผ์์ : Consumer ๊ฐ์ <= partition๊ฐ์
์ฐธ๊ณ : https://www.youtube.com/watch?v=rBVCvv9skT4&list=PL3Re5Ri5rZmkY46j6WcJXQYRlDRZSUQ1j&index=5
https://jhleed.tistory.com/179
Topic์ ํ์ผ์์คํ
ํด๋์ ์ ์ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
Topic์ ์ด๋ฆ์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด๋์ง ๋ช
ํํ๊ฒ ๋ช
์ํ์ฌ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
ํ๋์ ํ ํฝ์ ์ฌ๋ฌ๊ฐ์ ํํฐ์
์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ผ๋ฉฐ ์ฒซ๋ฒ์งธ ํํฐ์
๋ฒํธ๋ 0์
๋๋ค.
ํ๋์ ํํฐ์
์ ํ์ ๊ฐ์ด ๋ฐ์ดํฐ๊ฐ ๋์์๋ถํฐ ์ฐจ๊ณก์ฐจ๊ณก ์์ด๊ฒ ๋ฉ๋๋ค.
Kafka Consumer์ ๋์์๋ถํฐ(๊ฐ์ฅ์ค๋๋ ์์ผ๋ก) ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
Consumer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋ค๊ณ ํด์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ์ด ์๋๋ผ ํํฐ์
์ ๊ทธ๋๋ก ๋จ์ต๋๋ค.(๋ ๋ค๋ฅธ Consumer๊ฐ ์ฐ๊ฒฐ๋์ด ๊ฐ์ ธ๊ฐ ์ ์๋๋ก ํจ.)
- ํํฐ์ ์ ๋๋ฆฌ๋ ์ด์ : Consumer ๊ฐ์๋ฅผ ๋๋ ค ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ถ์ฐ์ํฌ ์ ์์ต๋๋ค.
- ํํฐ์ ์ ๋ฐ์ดํฐ(record)๋ฅผ ์ญ์ ํ๋ ํ์ด๋ฐ: ์ต๋ record ๋ณด์กด ์๊ฐ, ์ต๋ record ๋ณด์กด ํฌ๊ธฐ๋ก ๊ฒฐ์
- Kafka๋ key๋ฅผ ํน์ ํ ํด์๋ก ๋ณํ์์ผ ํํฐ์
๊ณผ 1๋1 ๋งค์นญ์ ์ํต๋๋ค.
ํํฐ์ ์๋ ๋์ผํ key์ value๋ง ์์ด๊ฒ ๋ฉ๋๋ค.
key๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํค์ ํํฐ์ ๋งค์นญ์ด ๊นจ์ง ์ ์๊ธฐ ๋๋ฌธ์ ํํฐ์ ๊ฐ์์ ์ ์ํ์ฌ ํํฐ์ ์ ์์ฑํฉ๋๋ค.
Kafka Brocker์ Kafka๊ฐ ์ค์น๋์ด ์๋ ์๋ฒ ๋จ์๋ฅผ ๋งํฉ๋๋ค.
๋ณดํต 3๊ฐ ์ด์์ broker ์ด์ฉ์ ๊ถ์ฅํฉ๋๋ค.
์๋ฒ์ ์ฅ์ ๊ฐ ์๊ฒผ์ ๋, ๋ณต๊ตฌ ํ ์ ์๋ ๊ณ ๊ฐ์ฉ์ฑ์ ๋ณด์ฅํฉ๋๋ค.(Elastic Search์์ ๊ณต๋ถํ replica ๊ฐ๋
๊ณผ ๋งค์ฐ ์ ์ฌ)
replication = Leader partition(์๋ณธ ํํฐ์
) + Follower partition(๋ณต์ ํํฐ์
)
replication์ ๊ฐ์๋ ์ ํ๋ฉ๋๋ค.(replication ๊ฐ์ <= Kafka broker ๊ฐ์)
๊ฐ๊ฐ์ replication group์ด ๋ฐ๋ก ISR์
๋๋ค.
- leader๊ฐ down ๋๋ฉด์ follower๊ฐ new leader๊ฐ ๋๋ ๊ณผ์
- topic01์ ๊ฒฝ์ฐ,
ISR ๋ด follower๋ ๋๊ตฌ๋ผ๋ leader๊ฐ ๋ ์ ์๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ๊ธฐ ๋๋ฌธ์ follower -> new leader
์ด๋, ์ผ์์ ์ผ๋ก follower๊ฐ leader๊ฐ ๋๋ ๊ณผ์ ์์ read/write์ timeout์ด ๋ฐ์ํ ์ ์๊ฒ ์ง๋ง, retry๊ฐ ์ผ์ด๋๋ฉด new leader์ read/write๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ฅ์ ์ํฉ์ ์๋๋๋ค. - topic02์ ๊ฒฝ์ฐ,
down ๋ follower๋ leader๊ฐ ๋ ์๊ฒฉ์ด ์๊ธฐ ๋๋ฌธ์ ISR์์ ์ ์ธ๊ฐ ๋๋ฉด์ ISR์๋ leader ํ๋์ follower ํ๋๋ง ํฌํจ๋๊ฒ ๋ฉ๋๋ค.
topic01๊ณผ ๋ฌ๋ฆฌ topic02์ leader๋ ๋ณํ์ง ์์๊ธฐ ๋๋ฌธ์ ์๋ฌด๋ฐ ํน์ด์ฌํญ ์์ด read/write๊ฐ ๊ณ์ ์ผ์ด๋ฉ๋๋ค.
- topic01์ ๊ฒฝ์ฐ,
ISR ๋ด follower๋ ๋๊ตฌ๋ผ๋ leader๊ฐ ๋ ์ ์๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ๊ธฐ ๋๋ฌธ์ follower -> new leader
Producer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ ์๋๊ฐ Consumer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋ ์๋๋ณด๋ค ๋น ๋ฅธ ๊ฒฝ์ฐ์
Producer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ ์คํ์
๊ณผ Consumer๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๊ฐ ์คํ์
๊ฐ์ ์ฐจ์ด๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด ๋ ์คํ์
๊ฐ์ ์ฐจ์ด๊ฐ Consumer Lag ์
๋๋ค.
ํํฐ์
์ด ํ๋๊ฐ ์๋๋ผ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด Lag๋ ์ฌ๋ฌ๊ฐ๊ฐ ์กด์ฌํ ์ ์์ต๋๋ค.
์ฌ๋ฌ๊ฐ์ Lag์ค์ ๊ฐ์ฅ ๋์ ์ซ์์ Lag์ records-lag-max๋ผ๊ณ ํฉ๋๋ค.
Consumer Lag์ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
- ๋ฉํฐ ์นดํ์นด ํด๋ฌ์คํฐ ์ง์
- Sliding window๋ฅผ ํตํ Consumer์ status(ERROR/WARING/OK) ํ์ธ
- HTTP api ์ ๊ณต(๋ค์ํ ์ถ๊ฐ ์ํ๊ณ ๊ตฌ์ถ ๊ฐ๋ฅ)
์ฃผํคํผ๋(Zookeeper)๋ ๋ถ์ฐ ์ฝ๋๋ค์ด์
์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์คํ์์ค ํ๋ก์ ํธ์
๋๋ค.
์ฃผํคํผ๋ znode๋ก ์ด๋ฃจ์ด์ง ๋ถ์ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ง์ํ๋ ์์คํ
์ด๋ผ๊ณ ํด๋ ๊ณผ์ธ์ด ์๋๋๋ค.
์ด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ฆฌ๋
์ค(linux) ํ์ผ์์คํ
๊ณผ ์ ์ฌํ ์์คํ
์ ์ ๊ณตํ๊ณ ์ด๊ฒ์ด ์ฃผํคํผ์ ํต์ฌ์
๋๋ค.
์ฃผํคํผ์ ์ฑํ๋ ์ํคํ
์ฒ์ ๊ธฐ๋ฒ๋ค์ ์ด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์์ ์ ์ผ๋ก ์ ๊ณตํ๊ณ ์ ํ๊ธฐ ์ํจ์
๋๋ค.
์ด ์์คํ
์ ํตํด ์ฃผํคํผ๋ ๊ธ๋ก๋ฒ๋ฝ, ํด๋ฌ์คํฐ ์ ๋ณด, Leader ์ ์ถ ๋ฑ์ ๊ตฌํํด์ผํ๋ ๊ณณ์ ํ์ฉํ ์ ์์ต๋๋ค.
์ฃผํคํผ๋ ํด๋ฌ์คํฐ์์ ๊ตฌ์ฑ ์๋ฒ๋ค๋ผ๋ฆฌ ๊ณต์ ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๊ฑฐ๋ ์ด๋ค ์ฐ์ฐ์ ์กฐ์จํ๊ธฐ ์ํด ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
์ฃผํคํผ๋ ์นดํ์นด์ ๋
ธ๋ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ๊ณ , ํ ํฝ์ offset ์ ๋ณด๋ฑ์ ์ ์ฅํ๊ธฐ ์ํด ํ์ํฉ๋๋ค.
ํด๋ฌ์คํฐ ๋ด์ broker์ ๋ํ ๋ถ์ฐ ์ฒ๋ฆฌ๋ Apache ZooKeeper๊ฐ ๋ด๋นํฉ๋๋ค.
-
์ค์ ๊ด๋ฆฌ(Configuration management) : ํด๋ฌ์คํฐ์ ์ค์ ์ ๋ณด๋ฅผ ์ต์ ์ผ๋ก ์ ์งํ๊ธฐ ์ํ ์กฐ์จ ์์คํ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
-
ํด๋ฌ์คํฐ ๊ด๋ฆฌ(Cluster management) : ํด๋ฌ์คํฐ์ ์๋ฒ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ ์ธ๋ ๋ ๊ทธ ์ ๋ณด๋ฅผ ํด๋ฌ์คํฐ ์ ์๋ฒ๋ค์ด ๊ณต์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
-
๋ฆฌ๋ ์ฑํ(Leader selection) : ๋ค์ค ์ดํ๋ฆฌ์ผ์ด์ ์ค์์ ์ด๋ค ๋ ธ๋๋ฅผ ๋ฆฌ๋๋ก ์ ์ถํ ์ง๋ฅผ ์ ํ๋ ๋ก์ง์ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ๋ก ๋ณต์ ๋ ์ฌ๋ฌ ๋ ธ๋ ์ค ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง๋ ํ๋์ ๋ ธ๋๋ฅผ ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
-
๋ฝ, ๋๊ธฐํ ์๋น์ค(Locking and synchronization service) : ํด๋ฌ์คํฐ์ ์ฐ๊ธฐ ์ฐ์ฐ์ด ๋น๋ฒํ ๊ฒฝ์ฐ ๊ฒฝ์์ํ์ ๋ค์ด๊ฐ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๋ถ์ผ์น๋ฅผ ๋ฐ์์ํต๋๋ค. ์ด ๋, ํด๋ฌ์คํฐ ์ ์ฒด๋ฅผ ๋์์ ๋๊ธฐํํด( ๋ฝ์ ๊ฒ ) ๊ฒฝ์์ํ์ ๋ค์ด๊ฐ ๊ฒฝ์ฐ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํฉ๋๋ค.