๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
AWS

OpenSearch ์ตœ์ ํ™”: ์ƒค๋“œ ๊ตฌ์„ฑ ๋ฐ JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ฐ€์ด๋“œ

by SecuOf 2025. 5. 31.

์ถœ์ฒ˜: https://d2908q01vomqb2.cloudfront.net/2a459380709e2fe4ac2dae5733c73225ff6cfee1/2024/04/26/Picture2-3.jpg

๐Ÿ“Œ ๊ฐœ์š”

OpenSearch(Elasticsearch ํฌํ•จ)๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ตœ์ ํ™” ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ƒค๋“œ(shard) ๊ตฌ์„ฑ๊ณผ JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์„ฑ๋Šฅ์— ์ง์ ‘์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

๋ณธ ๊ธ€์—์„œ๋Š” OpenSearch์˜ ์ƒค๋“œ ์„ค์ •๊ณผ JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์‹ค์งˆ์ ์ธ ๊ฐ€์ด๋“œ๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ ์šฉ์–ด ์ •๋ฆฌ

๋จผ์ € ๊ธฐ๋ณธ์ ์ธ ์šฉ์–ด๋ถ€ํ„ฐ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • Index (์ธ๋ฑ์Šค): ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋…ผ๋ฆฌ์  ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
  • Shard (์ƒค๋“œ): ์ธ๋ฑ์Šค๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋‚˜๋ˆˆ ๋ฐ์ดํ„ฐ ๋‹จ์œ„๋กœ, ๋ณต์ œ๋ณธ(replica)์ด ์•„๋‹Œ ์‹ค์ œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
  • Primary Shard (ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ): CRUD(Create, Read, Update, Delete)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹ค์ œ ์ƒค๋“œ์ž…๋‹ˆ๋‹ค.
  • Replica Shard (๋ ˆํ”Œ๋ฆฌ์นด ์ƒค๋“œ): ์žฅ์•  ๋ณต๊ตฌ ๋ฐ ์ฝ๊ธฐ ๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ์œ„ํ•ด ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ํ•ซ๋…ธ๋“œ(Hot Node): ํŠน์ • ๋…ธ๋“œ์— ๋งŽ์€ ์ƒค๋“œ๊ฐ€ ๋ชฐ๋ ค ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋Š” ๋…ธ๋“œ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ OpenSearch ๋ฐ Elasticsearch ์ƒค๋“œ ๊ถŒ์žฅ์‚ฌํ•ญ

๐Ÿ”น ์ƒค๋“œ ํฌ๊ธฐ ๋ฐ ๊ฐœ์ˆ˜ ๊ถŒ์žฅ์‚ฌํ•ญ

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒค๋“œ๋‹น ํฌ๊ธฐ๋Š” 10~50GB๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฒ€์ƒ‰ ์ง€์—ฐ์‹œ๊ฐ„ ๊ฐ์†Œ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋ฉด ์ƒค๋“œ๋‹น 10~30GB
    • ์“ฐ๊ธฐ ์ž‘์—… ์ค‘์‹ฌ(๋กœ๊ทธ ๋ถ„์„ ๋“ฑ)์ด๋ผ๋ฉด ์ƒค๋“œ๋‹น 30~50GB
  • ๋‹จ์ผ ์ธ๋ฑ์Šค๋Š” ์ตœ๋Œ€ 1024๊ฐœ์˜ ์ƒค๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•œ ์ƒค๋“œ์˜ ๋ฌธ์„œ ์ˆ˜๋Š” 2์–ต ๊ฐœ ์ดํ•˜๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ์ „์ฒด ์ƒค๋“œ๋‹น ๋ฌธ์„œ ์ˆ˜๋Š” ์•ฝ 20์–ต ๊ฐœ๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”น ์ƒค๋“œ ๊ฐœ์ˆ˜ ์„ค์ • ๊ณต์‹

์ƒค๋“œ ๊ฐœ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

  • Primary ์ƒค๋“œ ๊ฐœ์ˆ˜ × (Replica ๊ฐœ์ˆ˜ + 1)

์˜ˆ๋ฅผ ๋“ค์–ด, Primary ์ƒค๋“œ๊ฐ€ 3๊ฐœ, Replica๊ฐ€ 2๊ฐœ์ธ ๊ฒฝ์šฐ ์ด ์ƒค๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(Primary 3) × (Replica 2 + 1) = ์ด 9๊ฐœ์˜ ์ƒค๋“œ

๐Ÿ”น ์ƒค๋“œ ๊ฐœ์ˆ˜์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ์˜ํ–ฅ

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

๐Ÿ”น ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ ํž™ ์„ค์ •

  • ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋Š” 3000๊ฐœ ์ธ๋ฑ์Šค๋‹น ์ตœ์†Œ 1GB ํž™ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ถŒ์žฅ์‚ฌํ•ญ

๐Ÿ”น JVM ํž™ ์‚ฌ์ด์ฆˆ ์„ค์ •

OpenSearch๋Š” JVM ํž™์„ ์ธ์Šคํ„ด์Šค RAM์˜ 50%๋กœ ์ œํ•œํ•˜์—ฌ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, c6g.large.search ์ธ์Šคํ„ด์Šค์˜ ๊ฒฝ์šฐ:

  • ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ: 8GB
  • JVM ํž™ ํฌ๊ธฐ: 4GB(50%)

๐Ÿ”น JVM ํž™ ์‚ฌ์ด์ฆˆ๋ฅผ 50%๋กœ ์ œํ•œํ•˜๋Š” ์ด์œ 

๋‹ค์Œ์˜ ์ด์œ ๋กœ JVM ํž™ ์‚ฌ์ด์ฆˆ๋ฅผ ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ์˜ 50%๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • OS Page Cache ํ™•๋ณด: Lucene ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•จ
  • GC ์•ˆ์ •์„ฑ ํ™•๋ณด: ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Garbage Collection)์˜ ํšจ์œจ์„ฑ ์ฆ๊ฐ€
  • CompressedOops ์ตœ์ ํ™” ์œ ์ง€: JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์  ํ™œ์šฉ
  • ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ ํ™•๋ณด: ์‹œ์Šคํ…œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์•ˆ์ •์„ฑ ํ–ฅ์ƒ

๐Ÿ“Œ OpenSearch ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

  • ํ•œ ๋…ธ๋“œ์˜ JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ 1GiB๋‹น ๊ถŒ์žฅ ์ƒค๋“œ ๊ฐœ์ˆ˜:
    • OpenSearch 2.17 ์ด์ƒ: 2.15๊ฐœ/GB (์ตœ๋Œ€ 4000๊ฐœ)
    • ์ผ๋ฐ˜์ ์ธ ํ™˜๊ฒฝ์—์„œ๋Š” ์ตœ๋Œ€ 25๊ฐœ ์ดํ•˜๋กœ ์„ค์ • ๊ถŒ์žฅ
  • ์ƒค๋“œ๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€ํ•˜๊ฐ€ ๋†’์•„์ง€๊ณ , ์ด๋Š” ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ถˆํ•„์š”ํ•œ ์ƒค๋“œ๋ฅผ ์ค„์ด๊ณ , ์ƒค๋“œ ํฌ๊ธฐ๋ฅผ ์ ์ ˆํžˆ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ๋ก€ ๋ถ„์„

๊ธฐ์กด์— ์šด์˜์ค‘์ธ OpenSearch Data Node๋Š” ํ˜„์žฌ ์•„๋ž˜์™€ ๊ฐ™์€ ์„ค์ • ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

  • ๋…ธ๋“œ ํƒ€์ž…: c6g.large.search (JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ 4GB)
  • ์ตœ๋Œ€ ์ƒค๋“œ ์ˆ˜ ์„ค์ •(max_shards_per_node): 1000๊ฐœ

๐Ÿ”น ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ ๋ถ„์„ ๊ฒฐ๋ก 

  • ํ˜„์žฌ ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ ๋…ธ๋“œ์— ์ธ๋ฑ์Šค ๋Œ€๋น„ ์ƒค๋“œ ์ˆ˜๊ฐ€ ๋งŽ์•„ ์ž์› ์†Œ๋ชจ๊ฐ€ ํฐ ํŽธ์ž…๋‹ˆ๋‹ค.
  • ์ธ์Šคํ„ด์Šค ํƒ€์ž…(c6g.large)์„ ๊ณ ๋ คํ•  ๋•Œ, ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒค๋“œ๋ฅผ 3๊ฐœ ์ด์ƒ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒค๋“œ ์ˆ˜๋ฅผ ํ˜„์žฌ ์ƒํƒœ์—์„œ ์œ ์ง€ํ•œ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ์†Œ 12GB ์ด์ƒ์˜ ์ธ์Šคํ„ด์Šค๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ ํ˜„์žฌ ์ƒํƒœ์—์„œ JVM Pressure ํ˜„์ƒ์€ ๊ด€์ฐฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ถ”๊ฐ€ ์ •๋ณด ๋ฐ API ์˜ˆ์‹œ

๐Ÿ”น ํด๋Ÿฌ์Šคํ„ฐ ํ• ๋‹น ์ •๋ณด ํ™•์ธ

GET /_cat/allocation
GET /_cat/allocation/{node_id}

๐Ÿ”น ์ƒค๋“œ ๋ฐ ๋ ˆํ”Œ๋ฆฌ์นด ๊ฐœ์ˆ˜ ์„ค์ • ์˜ˆ์‹œ

PUT /movie
{
    "settings": {
        "index": {
            "number_of_shards": 4,   // Primary ์ƒค๋“œ ์ˆ˜ (์ผ๋ฐ˜์ ์œผ๋กœ Node ์ˆ˜ * n)
            "number_of_replicas": 1  // Replica ์ƒค๋“œ ์ˆ˜
        }
    }
}

๐Ÿ“Œ ๊ฒฐ๋ก 

ํšจ์œจ์ ์ธ OpenSearch ๊ด€๋ฆฌ์˜ ํ•ต์‹ฌ์€ ์ƒค๋“œ ์ˆ˜ ๊ด€๋ฆฌ์™€ JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒ์žฅ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ฐธ๊ณ ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.


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