๋ฐ์—”์œผ๋กœ ์„ฑ์žฅ์ค‘ ๐ŸŒฑ

Elasticsearch

Elasticsearch ์ดํ•ดํ•˜๊ธฐ

์จ๋ฐ 2023. 6. 30. 05:18

0๏ธโƒฃ Elasticsearch๋ž€?

 

ES๋Š” ์–ด๋–ค ์—ญํ• ์ผ๊นŒ?

 
Elasticsearch๋Š” ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚œ ์˜คํ”ˆ์†Œ์Šค ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ๋ฐ ๋ถ„์„ ์—”์ง„์ด๋‹ค.
๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ, ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„(์ค€์‹ค์‹œ๊ฐ„)์œผ๋กœ ์ €์žฅ, ๊ฒ€์ƒ‰, ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๊ธฐ๋ณธ ์—”์ง„/๊ธฐ์ˆ ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
 
Elasticsearch๋Š” NRT ๊ฒ€์ƒ‰ ํ”Œ๋žซํผ์ด๋‹ค.
๋ฌธ์„œ๋ฅผ ์ƒ‰์ธํ™”ํ•˜๋Š” ์‹œ์ ๋ถ€ํ„ฐ ๋ฌธ์„œ๊ฐ€ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•ด์ง€๋Š” ์‹œ์ ๊นŒ์ง€ ์•ฝ๊ฐ„์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„(๋Œ€๊ฐœ 1์ดˆ)์ด ์žˆ๋‹ค.
 
*NRT(Near Realtime): ์ค€์‹ค์‹œ๊ฐ„
 
 
 

์™œ ES๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

 

๋น ๋ฅด๋‹ค.

 
Elasticsearch๋Š” Lucene(๋ฃจ์”ฌ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰์— ๋›ฐ์–ด๋‚˜๋‹ค.
๋˜ํ•œ ๊ฑฐ์˜ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ํ”Œ๋žซํผ์œผ๋กœ, ๋ฌธ์„œ๊ฐ€ ์ƒ‰์ธ๋  ๋•Œ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•ด์งˆ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ๋ณดํ†ต 1์ดˆ ์ •๋„๋กœ ์•„์ฃผ ์งง๋‹ค.
๋ณด์•ˆ ๋ถ„์„, ์ธํ”„๋ผ ๋ชจ๋‹ˆํ„ฐ๋ง์ฒ˜๋Ÿผ ์‹œ๊ฐ„์ด ์ค‘์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ด์ƒ์ ์ด๋‹ค.
 
*Lucene(๋ฃจ์”ฌ): Apache ์—์„œ ๊ฐœ๋ฐœ๋œ ์ž๋ฐ” ๊ธฐ๋ฐ˜์˜ ๊ฒ€์ƒ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ๋“ฑ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋„๊ตฌ
 
 

๋ถ„์‚ฐ์ ์ด๋‹ค.

 
Elasticsearch์— ์ €์žฅ๋œ ๋ฌธ์„œ๋Š” ์ƒค๋“œ๋ผ๊ณ  ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์— ๊ฑธ์ณ ๋ถ„์‚ฐ๋œ๋‹ค.
์ด ์ƒค๋“œ๋Š” ๋ณต์ œ๋˜์–ด ํ•˜๋“œ์›จ์–ด ์žฅ์•  ์‹œ, ์ค‘๋ณต๋˜๋Š” ๋ฐ์ดํ„ฐ ์‚ฌ๋ณธ์„ ์ œ๊ณตํ•œ๋‹ค.
๋ถ„์„์ ์ธ ํŠน์ง•์€ ์ˆ˜๋ฐฑ ๊ฐœ(ํ˜น์€ ์ˆ˜์ฒœ ๊ฐœ)์˜ ์„œ๋ฒ„๊นŒ์ง€ ํ™•์žฅํ•˜๊ณ  ํŽ˜ํƒ€๋ฐ”์ดํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
 
*์ƒค๋“œ(shard): 2๋ฒˆ์—์„œ ์„ค๋ช….
 
 

๊ธฐ๋Šฅ์ด ๋งŽ๋‹ค.

 
์†๋„, ํ™•์žฅ์„ฑ, ๋ณต์›๋ ฅ๋ฟ ์•„๋‹ˆ๋ผ, Elasticsearch์—๋Š” ๋ฐ์ดํ„ฐ ๋กค์—…, ์ธ๋ฑ์Šค ์ˆ˜๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ ๋“ฑ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ›จ์”ฌ ๋” ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด ๋‹ค์ˆ˜ ํƒ‘์žฌ๋˜์–ด ์žˆ๋‹ค.
 
 
 

๋‹ค๋ฅธ ๋„๊ตฌ์™€์˜ ์—ฐ๊ณ„์„ฑ

 
์ฃผ๋กœ ELK(Elasticsearch, Logstash, Kibana)์˜ ์•ฝ์–ด๋กœ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋ฐ ์ €์žฅ, ๋ถ„์„ ๋ฐ ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ๋„๊ตฌ์˜ ์กฐํ•ฉ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.
*Logstash(๋กœ๊ทธ์Šคํƒœ์‹œ): ๋กœ๊ทธ, ์ด๋ฒคํŠธ, ๋ฉ”ํŠธ๋ฆญ ๋“ฑ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜์—ฌ Elasticsearch์— ์ „๋‹ฌํ•˜๋Š” ๋„๊ตฌ
*Kibana(ํ‚ค๋ฐ”๋‚˜): Elasticsearch์—์„œ ์ˆ˜์ง‘๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๊ณ  ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ
 
 
 

ES์˜ ๋‹จ์ ์€ ์—†์„๊นŒ?

 

ํŠธ๋žœ์žญ์…˜๊ณผ ๋กค๋ฐฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

 
Elasticsearch๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ, ์ „์ฒด์ ์ธ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์‹œ์Šคํ…œ์ ์œผ๋กœ ๋น„์šฉ ์†Œ๋ชจ๊ฐ€ ํฐ ๋กค๋ฐฑ(Rollback)๊ณผ ํŠธ๋žœ์žญ์…˜(Transaction)์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์†์‹ค์˜ ์œ„ํ—˜์„ฑ์ด ์žˆ๋‹ค.
 
*ํŠธ๋žœ์žญ์…˜(Transaction): DB๋˜๋Š” ์‹œ์Šคํ…œ์—์„œ ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์„ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์ ์ธ ์ž‘์—… ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐœ๋…. ACID ๊ฐœ๋…์„ ๋”ฐ๋ฆ„.
*๋กค๋ฐฑ(Rollback): ํŠธ๋žœ์žญ์…˜์ด ์‹คํŒจ ๋ฐ ์ค‘๋‹จ์‹œ, ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ์ž‘์—…
 
 

๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ํž˜๋“ค ์ˆ˜ ์žˆ๋‹ค.

 
Elasticsearch๋Š” ์—…๋ฐ์ดํŠธ ๋ช…๋ น์ด ์š”์ฒญ๋  ๊ฒฝ์šฐ ๊ธฐ์กด ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ๋‹จ์ˆœ ์—…๋ฐ์ดํŠธ์— ๋น„ํ•ด์„œ ์ƒ๋Œ€์ ์œผ๋กœ ๋งŽ์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.
 
 
 
 

1๏ธโƒฃ ES์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

 

ํด๋Ÿฌ์Šคํ„ฐ๋ž€?

 
ํด๋Ÿฌ์Šคํ„ฐ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๋…ธ๋“œ(์„œ๋ฒ„)๊ฐ€ ๋ชจ์ธ ๊ฒƒ์ด๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํฌ๊ด„ํ•˜๋Š” ํ†ตํ•ฉ ์ƒ‰์ธํ™” ๋ฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
๋ถ„์‚ฐ ์‹œ์Šคํ…œ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ ์ €์žฅ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๊ณ ๊ฐ€์šฉ์„ฑ, ํ™•์žฅ์„ฑ ๋ฐ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
 
*์ƒ‰์ธ(indexing): 2๋ฒˆ์—์„œ ์„ค๋ช…
 
 

๋…ธ๋“œ๋ž€?

 
ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ตฌ์„ฑ์›์œผ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTP๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.
์ „์†ก ๊ณ„์ธต์€ ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์—๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ HTTP ๊ณ„์ธต์€ REST ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.
๋ชจ๋“  ๋…ธ๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ ์ ˆํ•œ ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
 
๋…ธ๋“œ์˜ ์—ญํ• ๋กœ,
master,
data, data_content, data_hot, data_warm, data_cold, data_frozen,
ingest,
ml,
remote_cluster_client,
transform
์ด ์žˆ๋‹ค.
 
์šฐ์„ , ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์™€ ๋ฐ์ดํ„ฐ ๋…ธ๋“œ๋ฅผ ์•Œ์•„๋ณด์ž.
 
 

๋งˆ์Šคํ„ฐ ๋…ธ๋“œ (Master Node)

 
์ธ๋ฑ์Šค์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ, ์ƒค๋“œ์˜ ์œ„์น˜์™€ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ(Cluster Status) ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
ํด๋Ÿฌ์Šคํ„ฐ๋งˆ๋‹ค ํ•˜๋‚˜์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ์—†๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์ž‘๋™์ด ์ •์ง€๋œ๋‹ค.
 
elasticsearch.yml์— ๋””ํดํŠธ ์„ค์ •์€ node.master:true๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ธฐ์—, ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋กœ ์„ ์ถœ๋  ์ˆ˜ ์žˆ๋Š” ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ(master eligible node)์ด๋‹ค.
ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ปค์ง€๊ฒŒ ๋˜๋ฉด ๋…ธ๋“œ์™€ ์ƒค๋“œ๋“ค์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์ ธ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์ด ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์˜ ์ •๋ณด๋ฅผ ๊ณ„์† ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
์ด๋•Œ๋Š” ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ ํ•  ํ›„๋ณด ๋…ธ๋“œ๋“ค๋งŒ ๋”ฐ๋กœ ์„ค์ •ํ•ด์„œ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ ์„ฑ๋Šฅ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ๋“ค์€ ์„ค์ •๊ฐ’์„ node.master: false๋กœ ํ•˜์—ฌ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์˜ ์—ญํ• ์„ ํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•œ๋‹ค.
 
์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋งˆ์Šคํ„ฐ ํ›„๋ณด๋ฅผ 1๊ฐœ๋งŒ ์„ค์ •ํ•˜๋ฉด ์•ˆ ๋˜๊ณ , ์ตœ์†Œ 3๊ฐœ ์ด์ƒ์˜ ํ™€์ˆ˜๊ฐœ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
(์ง์ˆ˜๊ฐœ์ผ ๊ฒฝ์šฐ, ๋„คํŠธ์›Œํฌ ๋‹จ์ ˆ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋ถ„๋ฆฌ๋˜๊ณ  ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ๋™์ž‘ํ•˜๋ฉด, ์ถ”ํ›„ ๋‹ค์‹œ ํ•ฉ์ณ์กŒ์„ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ณ  ๋ฌด๊ฒฐ์„ฑ์ด ์œ ์ง€๋  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ Split Brain์ด๋ผ๊ณ  ํ•œ๋‹ค.)
 
7.0 ๋ถ€ํ„ฐ node.master: true์ธ ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์Šค์Šค๋กœ minimum_master_nodes ๋…ธ๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ๋˜์—ˆ๋‹ค.
์‚ฌ์šฉ์ž๋Š” ์ตœ์ดˆ ๋งˆ์Šคํ„ฐ ํ›„๋ณด๋กœ ์„ ์ถœํ•  cluster.initial_master_nodes: [ ] ๊ฐ’๋งŒ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.
 
 

๋ฐ์ดํ„ฐ ๋…ธ๋“œ (Data Node)

 
๋ฐ์ดํ„ฐ ๋…ธ๋“œ๋Š” ์‹ค์ œ๋กœ ์ƒ‰์ธ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ์ด๋‹ค.
 
ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์™€ ๋ฐ์ดํ„ฐ ๋…ธ๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์„ค์ • ํ•  ๋•Œ ๋งˆ์Šคํ„ฐ ํ›„๋ณด ๋…ธ๋“œ๋“ค์€ node.data: false๋กœ ์„ค์ •ํ•˜์—ฌ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ ์—ญํ• ๋งŒ ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋Š” ์ €์žฅํ•˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ๋งŒ ํ•˜๊ฒŒ ๋˜๊ณ , ๋ฐ์ดํ„ฐ ๋…ธ๋“œ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
 
 
 
 

2๏ธโƒฃ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋ฐ ์ €์žฅ

 

์ƒ‰์ธ(indexing)์ด๋ž€?

 
๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์›๋ณธ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰์–ด ํ† ํฐ๋“ค๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์ด๋‹ค.
 
 

์ธ๋ฑ์Šค(index)๋ž€?

 
์ƒ‰์ธ ๊ณผ์ •์„ ๊ฑฐ์นœ ๊ฒฐ๊ณผ๋ฌผ ๋˜๋Š” ์ƒ‰์ธ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๋Š” ์ €์žฅ์†Œ์ด๋‹ค.
๋˜ํ•œ Elasticsearch์—์„œ ๋„ํ๋จผํŠธ๋“ค์˜ ๋…ผ๋ฆฌ์ ์ธ ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ๋‹จ์œ„์ด๊ธฐ๋„ ํ•˜๋‹ค.
์ฆ‰, ๋„ํ๋จผํŠธ๋ฅผ ๋ชจ์•„๋†“์€ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.
 
*๋„ํ๋จผํŠธ(document): ์ƒ‰์ธํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ์ •๋ณด ๋‹จ์œ„(๋‹จ์ผ ๋ฐ์ดํ„ฐ ๋‹จ์œ„)์ด๋ฉฐ, JSON ํ˜•์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง
 
 

์ƒค๋“œ(shard)๋ž€?

 
์ƒ‰์ธ์€ ๋ฐฉ๋Œ€ํ•œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹จ์ผ ๋…ธ๋“œ์˜ ํ•˜๋“œ์›จ์–ด ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž Elasticsearch์—์„œ ์ƒ‰์ธ์„ ์ƒค๋“œ(shard)๋ผ๋Š” ์กฐ๊ฐ์œผ๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค.
 
 

๋งคํ•‘(Mapping)์ด๋ž€?

 
Elasticsearch๋Š” ๋™์  ๋งคํ•‘์„ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ์ •์˜ํ•˜์ง€ ์•Š์•„๋„ ์ธ๋ฑ์Šค์— ๋„ํ๋จผํŠธ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋งคํ•‘์ด ์ƒ์„ฑ๋œ๋‹ค.
์ฃผ๋กœ, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋งคํ•‘์„ ์ •์˜ํ•œ๋‹ค.
 

PUT <์ธ๋ฑ์Šค๋ช…>
{
  "mappings": {
    "properties": {
      "<ํ•„๋“œ๋ช…>":{
        "type": "<ํ•„๋“œ ํƒ€์ž…>"
        โ€ฆ <ํ•„๋“œ ์„ค์ •>
      }
      โ€ฆ
    }
  }
}

 
 

์—ญ ์ธ๋ฑ์Šค(inverted index)๋ž€?

 
Elasticsearch๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์—ญ ์ธ๋ฑ์Šค(inverted index)๋ผ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ์ €์žฅํ•œ๋‹ค.
์ถ”์ถœ๋œ ๊ฐ ํ‚ค์›Œ๋“œ๋ฅผ ํ…€(term)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ํ•ด๋‹น ํ…€์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋„ํ๋จผํŠธ๋“ค์˜ id๋ฅผ ๋ฐ”๋กœ ์–ป์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
๋ฐ์ดํ„ฐ๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ์—ญ ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” id์˜ ๋ฐฐ์—ด๊ฐ’์ด ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ†ต RDBMS์— ๋น„ํ•ด ๋น ๋ฅธ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
 
 
 
 

3๏ธโƒฃ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋ฐ ์งˆ์˜

 

DSL(Domain Specific Language)์ด๋ž€?

Elasticsearch๋Š” ๊ฒ€์ƒ‰์„ ์œ„ํ•œ Query DSL ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์ฟผ๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
๋ง๊ทธ๋Œ€๋กœ, Elasticsearch์—์„œ๋Š” ๋„๋ฉ”์ธ ํŠนํ™” ์–ธ์–ด๋กœ์„œ JSON์— ๊ธฐ๋ฐ˜ํ•œ ์งˆ์˜์–ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
์ฆ‰, Elasticsearch์˜ Query DSL์€ ๋ชจ๋‘ ์•„๋ž˜์™€ ๊ฐ™์ด JSON ํ˜•์‹์œผ๋กœ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
 

GET my_index/_search
{
  "query": {
    "match": {
      "message": "dog"
    }
  }
}

 
 
 
 

๐Ÿ“’ ์ฐธ๊ณ ์ž๋ฃŒ

 
๊ณต์‹๋ฌธ์„œ ์œ„์ฃผ๋กœ ์ฐธ๊ณ ํ–ˆ๋‹ค.
 
https://www.elastic.co/guide/kr/elasticsearch/reference/current/gs-basic-concepts.html
 
https://www.elastic.co/kr/what-is/elasticsearch
 
https://esbook.kimjmin.net/
 
https://12bme.tistory.com/589
 
 
 
 

โœ๏ธ ๊ณต๋ถ€ํ•˜๋ฉฐ ๋А๋‚€์ 

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