[Elasticsearch] Shard
Elasticsearch๋ ์ํ ํ์ฅ์ ์ํ ์ค๋ฉ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ค.
ํ๋์ ์ธ๋ฑ์ค๋ ์ฌ๋ฌ๊ฐ์ ๋
ธ๋์ ๋ถ์ฐ ๋ฐฐ์น๋ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฐ๊ฐ์ ๋ณต์ ๋ ํํฐ์
์ ์ค๋(Shard)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์กฐ๊ธ ํผ๋์ค๋ฌ์ธ ์ ์๋๋ฐ, Elasticsearch์ ์ค๋๋ ๋ณต์ ์ ํํฐ์
์ด ํผ์ฌ๋ ๊ฐ๋
์ด๋ค.
์ด๋ฅผ ํตํด์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถํ ์ ์ฅํจ๊ณผ ๋์์ ๋ด๊ตฌ์ฑ์ ์ ์งํ๋ค.
Shard์ ์ข ๋ฅ
Shard์๋ 2๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
ํ๋๋ Primary Shard๊ณ , ๋๋ฒ์งธ๋ Replica Shard๋ค. ๋ณดํต ์ค๋๋ผ๊ณ ํ๋ฉด Primary ์ค๋๋ฅผ ๋งํ๋๋ฐ, ์ฉ์ด๊ฐ ์ข ์ ๋งคํด๊ฐ์ง๊ณ ๋ฌธ๋งฅ์ ์ ์ฝ์ด์ผ ํ ์ ์๋ค.
- Primary ์ค๋
Primary ์ค๋๋ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ํํฐ์
๋จ์๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
๋ง์ฝ idx_items๋ผ๋ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๊ณ , Primary ์ค๋ ์๋ฅผ 2๊ฐ๋ก ์ ํ๋ค๋ฉด ์ด๋ฐ ์์ด ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ Primary ์ค๋๋ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
๊ทธ๋ฌ๋๊น ์ ์ธ๋ฑ์ค์ 100๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด, ๊ฐ๊ฐ์ ์ค๋๊ฐ ์ฝ 50๊ฐ์ฉ์ ๋ถํ ํด์ ์ ์ฅํ๋ ๊ฒ์ด๋ค.
์ด๋ฅผ ํตํด์ ๋ฐ์ดํฐ๊ฐ ๋งค์ฐ ์ปค์ง๋๋ผ๋ ๋ถํ ํด์ ์ ์ฅํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ธ๋ฑ์ค ์์ฑ์ Shard์ ๊ธฐ๋ณธ๊ฐ์ 7 ์ด์ ์์๋ 5๊ฐ, 7 ๋ฒ์ ๋ถํฐ๋ 1๊ฐ๋ค.
์ค๋ ๊ตฌ์ฑ์ ์์ฑ ์์ ์๋ง ๊ฐ๋ฅํ๋ค.
- Replica ์ค๋
Replica ์ค๋๋ Primary ์ค๋์ ๋ฐ์ดํฐ ์ ์ค์ ๋ง๊ธฐ ์ํ ์๋ฐฉ์ฑ
์ด์, ์ฝ๊ธฐ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํ read-only replica๋ค.
๊ฐ Primary ์ค๋์ ๋ฐ์ดํฐ๋ฅผ ๋์ผํ๊ฒ ๋ณต์ ํ๋ ๋ณต์ ๋ณธ์ด๋ฉฐ, ์์ค์ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ณธ ๋ฐ์ดํฐ์ ๋ค๋ฅธ ๋ ธ๋์ ์ ์ฅํ๋ค. ๊ตฌ์กฐ๋ ๋์ถฉ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
๊ทธ๋์ ๋ง์ฝ primary ์ค๋๊ฐ 5๊ฐ์ ๋ ํ๋ฆฌ์นด๊ฐ 1๊ฐ๋ผ๋ฉด, ๊ฐ primary ์ค๋์ ๋ ํ๋ฆฌ์นด๊ฐ ํ๋์ฉ ๋ถ์ด์ ์ด ์ค๋๋ 10๊ฐ๊ฐ ๋๋ค.
๋
ธ๋์ ์ฅ์ ๊ฐ ๋์ ์๋ณธ Primary ์ค๋๊ฐ ์คํจํ๋ค๋ฉด Replica๊ฐ Primary๋ก ์น๊ฒฉ๋๊ณ , ๋ค๋ฅธ ๋
ธ๋์ ๋๋ค๋ฅธ Replica๋ฅผ ์์ฑํ๋ค.
์ ์ด์ ์ฅ์ ๋์์ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋
ธ๋๊ฐ 1๊ฐ์ธ ๋จ์ผ ๋
ธ๋ ํด๋ฌ์คํฐ๋ผ๋ฉด, replica๋ฅผ ๋ง๋ค์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ replica๋ ์ฅ์ ๋ณต๊ตฌ์ฉ์ผ๋ก๋ง ์ฐ์ด๋๊ฑด ์๋๊ณ , ์ฝ๊ธฐ์๋ ํ์ฉ๋๋ค.
Replica๋ Primary ์ค๋์๋ ๋ค๋ฅด๊ฒ ์ธ๋ฑ์ค ์์ฑ ์ดํ์๋ ๋์ ์ผ๋ก ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค.
์ค๋์ ๊ฒ์
Primary ์ค๋๋ ๋จ์ผ ๋ฐ์ดํฐ๋ฅผ ์ชผ๊ฐ์ ์ ์ฅํ๋ ๊ฐ๋
์ด๋ผ๊ณ ํ์๋ค.
๊ทธ๋ฌ๋ฉด ๋น์ฐํ ๊ฒ์ํ ๋๋ ์ชผ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ณํฉํ๋ ์์
์ด ์ถ๊ฐ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์ด๋ ๊ฒ 3๊ฐ์ ์ค๋๊ฐ ์๋ค๋ฉด

์ฌ์ฉ์๋ ์ผ๋จ ๋ ธ๋ ํ๋๋ฅผ ๊ณจ๋ผ์ query๋ฅผ ๋ ๋ฆฌ๊ฒ ๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์์ฒญ์ ๋ฐ์ ๋
ธ๋๊ฐ ์ด ์์ ์์ coordinating node๊ฐ ๋๋ค.
์ต์ข
์ฟผ๋ฆฌ์ ์๋ฃ๋ฅผ ๋ชจ๋ ์ฑ
์์ง๋ ๊ฒ์ด๋ค.
coordinating node๊ฐ ๋ Node 1 ์ค๋๋ ๋ฐ์ดํฐ๊ฐ ๋ถํ ์ ์ฅ๋ ๋ชจ๋ ์ค๋๋ฅผ ์ฐพ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋๋ฆฐ๋ค.
์ฟผ๋ฆฌ๋ฅผ ๋๋ฆฌ๋ ๋์์ Primary Shard, Replica ๋๋ค ๋ ์ ์๋ค.
์๋ฌดํผ coordinator๋ ๊ทธ ๋ถ๋ถ ๊ฒ์ ๊ฒฐ๊ณผ๋ค์ ๋ชจ๋ ๋ฐ์๋ค๊ฐ ์ต์ข
๋ณํฉ๊น์ง ๊ฑฐ์น๊ณ , ์ต์ข
๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋๋ ค์ฃผ๋ ํ์๊น์ง๋ฅผ ์ ๋ถ ์ฑ
์์ ธ์ ํํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ฐํ ์ด ๋ถ๋ถ์๋ ์ค๋ฒํค๋๊ฐ ์กด์ฌํ๋ค.
์ด๋ฐ ๋ถํ๋ฅผ ์ํ์ง ์๋๋ค๋ฉด ํํฐ์
๋ง๋ค ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๊ณ ๊ด๋ฆฌํด์ผ ํ๋ค.
์ค๋ฉ ์ ๋ต: ์ค๋์ ๊ฐ์์ ํฌ๊ธฐ
์ค๋๋ฅผ ๊ณผํ๊ฒ ์ชผ๊ฐ๋ ๊ฒ์ ์ข์ง ์๋ค. ๊ทผ๋ฐ ๊ทธ๋ ๋ค๊ณ ํด์ ์ค๋๋ฅผ ๋๋ฌด ์ ๊ฒ ์ก์์ ๊ฐ๋ณ ์ค๋๋ค์ด ์ปค์ง๋ค๋ฉด ๊ทธ ๋ํ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค. ์ด๊ฒ๋ ๊ฒฐ๊ตญ ์ํฉ์ ๋ณด๊ณ ์กฐ์ ํด์ผ ํ๋ ๋ฌธ์ ๋ค.
์๋ฅผ ๋ค์ด, 50GB ๋จ์ผ์ค๋๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ด 50MB 1000์ค๋๋ฅผ ๊ฒ์ํ๋ ๊ฒ๋ณด๋ค ์ ์ฒด์ ์ธ ์ปดํจํ
๋น์ฉ์ด ์ ๊ฒ ๋ค์ง๋ง, ๋ณ๋ ฌ์ฒ๋ฆฌ์ ํ๊ณ๊ฐ ์์ด์ ์ต์ข
์ฒ๋ฆฌ ์๋ ์์ฒด๋ ๋ ๋๋ฆด ์๋ ์๋ค.
์ด๊ฒ ์ฐธ ๋ณต์กํ ๋ฌธ์ ๋ค. ๊ฐ๋ณ ์ค๋ ํฌ๊ธฐ๋ฅผ ๋๋ฌด ํฌ๊ฒ ์ ์งํ๋ฉด ์ ๋ฐ์ ์ธ ๊ฒ์ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆด ์ ์๋๋ฐ๋ค ์ฅ์ ๋์์ด ์ด๋ ค์์ง๊ณ , ๋๋ฌด ์๊ณ ๋ง๊ฒ ์ ์งํด๋ ๊ฒ์ ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์๋ค.
์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋๋ ์ค๋๋น ํฌ๊ธฐ๋ ์ต๋ 10GB~50GB ์ ๋๋ค. ๊ฒฝํ์ ์ผ๋ก๋ 20GB~40GB ์ ๋๊ฐ ์ ์ ํ๋ค๋๊ฒ ์ค๋ก ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ ๊ณ ๋ คํด์ผ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ 1GB๋น ์ต๋ ์ค๋๋ 20๊ฐ ์ ๋๋ฅผ ๊ถ์ฅํ๋ค.
์ค๋ฉ ์ ๋ต: Replica
Replica๋ ์ฅ์ ๋์์ฉ์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ ํ์ง๋ง, ์ฝ๊ธฐ ์ฑ๋ฅ์ ๋ณ๋ ฌ์ ์ผ๋ก ๋๋ฆฌ๋ ๋ฐ์๋ ๊ต์ฅํ ์ ์ฉํ๋ค.
ํ์ง๋ง Replica๊ฐ ๋ง๋ค๋๊ฑด ๊ทธ๋งํผ write์ ๋ฐ๋ฅธ ๋ณต์ ์ฐ์ฐ์ด ๋ง์์ง๋ค๋ ๊ฒ์ด๋, write ๋ถํ๋ฅผ ์ฆ๊ฐ์ํจ๋ค๋ ๋ง์ด๊ธฐ๋ ํ๋ค.
๊ทธ๋์ ์ผ๋ฐ์ ์ผ๋ก replica ์๋ 1๊ฐ๋ฅผ ์ฌ์ฉํ๋, ์ฐ๊ธฐ์ ๋นํด์ ์ฝ๊ธฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ์ ๋ํด์๋ 2~3 ์ ๋๋ฅผ ์ฃผ๊ธฐ๋ ํ๋ค.
์ฐธ์กฐ
https://esbook.kimjmin.net/03-cluster/3.2-index-and-shards
https://j.blaszyk.me/tech-blog/exploring-apache-lucene-scale/
https://danawalab.github.io/elastic/2020/07/21/Elasticsearch-Index-Shard-How.html
https://stackoverflow.com/questions/15694724/shards-and-replicas-in-elasticsearch
https://opster.com/guides/elasticsearch/capacity-planning/elasticsearch-number-of-shards/
https://discuss.elastic.co/t/too-big-a-shard-vs-too-many-shards/75889/6