[Elasticsearch] ์บ์‹œ ๊ตฌ์กฐ

[์›๋ณธ ๋งํฌ]

Elasticsearch๋Š” ๊ณ ์„ฑ๋Šฅ ๊ฒ€์ƒ‰ ๋ฐ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” DB ์‹œ์Šคํ…œ์ด๋‹ค.

๊ฐœ๋–ก๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ๋„ฃ์–ด๋„ ์ฐฐ๋–ก๊ฐ™์ด ๋น ๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋ฑ‰์–ด์ฃผ๋‹ˆ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด ๊ณ ์„ฑ๋Šฅ ๋™์ž‘์˜ ์ƒ๋‹น ๋ถ€๋ถ„์€ ์บ์‹ฑ ์ „๋žต์—์„œ ๋‚˜์˜จ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” Elasticsearch๊ฐ€ ์บ์‹ฑ ์ „๋žต์„ ์‚ฌ์šฉํ•ด์„œ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฒ•. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์บ์‹ฑ์„ ์ž˜ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณด๊ฒ ๋‹ค.

์ธ๋ฑ์Šค ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋„ ์–ผ๋งˆ๊ฐ„ ์•Œ๊ณ  ๊ฐ€๋ฉด ์ข‹๋‹ค.
๊ด€๋ จ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/223640540316




1. OS ํŽ˜์ด์ง€ ์บ์‹œ

๋Œ€๋ถ€๋ถ„์˜ DB๊ฐ€ ๊ทธ๋ ‡๋“ฏ, Elasticsearch๋„ ๋””์Šคํฌ์—์„œ ํŒŒ์ผ์„ ์ฝ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ๋ณ‘๋ชฉ ์ง€์  ์ค‘ ํ•˜๋‚˜๋‹ค.

๊ทธ๋ž˜์„œ Elasticsearch๋Š” ํŽ˜์ด์ง€ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜๋ณต์ ์ธ ์ฝ๊ธฐ ํŒจํ„ด์„ ์ตœ์ ํ™”ํ•œ๋‹ค.
ํŒŒ์ผ์„ ์ฒ˜์Œ ์ฝ์„ ๋•Œ๋Š” ๋‹น์—ฐํžˆ ๋””์Šคํฌ์—์„œ ๊ฐ€์ ธ์˜ค์ง€๋งŒ, ๋‘๋ฒˆ์งธ ์ฝ๊ธฐ๋ถ€ํ„ฐ๋Š” ๋””์Šคํฌ์— ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋†จ๋˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŽ˜์ด์ง€ ์บ์‹œ์˜ ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋Š” "dirty" ๋งˆํฌ๊ฐ€ ๋ถ™๊ณ  ํ•ด์ œ๋œ๋‹ค.

ํŠนํžˆ๋‚˜ Elasticsearch, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ Lucene์˜ ์ตœ์†Œ ์ €์žฅ ๋‹จ์œ„์ธ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ "๋ถˆ๋ณ€"ํ˜•์ด๋ž€ ๊ฒƒ๋„ ์ด๋Ÿฌํ•œ ์ตœ์ ํ™” ๊ตฌ์กฐ์™€ ๊ถํ•ฉ์ด ๋งค์šฐ ์ž˜ ๋งž๋Š” ํŽธ์ด๋‹ค.
์„ธ๊ทธ๋จผํŠธ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€” ์ผ์ด ์—†์œผ๋‹ˆ ์บ์‹œ๋ฅผ ๋งŒ๋ฃŒ์‹œํ‚ค๊ณ  ๊ฐฑ์‹ ํ•˜๋Š” ๋™์ž‘์˜ ๊ตฌํ˜„์— ์œ ๋ฆฌํ•˜๋‹ค.



๊ทธ๋ž˜์„œ

๊ทธ๋ž˜์„œ Elasticsearch๋Š” ํŽ˜์ด์ง€ ์บ์‹œ์— ๋งŽ์€ ๋ถ€๋ถ„์„ ์˜์กดํ•˜๊ณ , ํŽ˜์ด์ง€ ์บ์‹œ๋ฅผ ์œ„ํ•œ ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„‰๋„‰ํ•˜๊ฒŒ ์žก์•„์ค˜์•ผ ํ•œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ดด๋ฌผ๊ฐ™์ด ๋งŽ์ด ์žก์•„๋จน๋Š” ์ด์œ ๋„ ์—ฌ๊ธฐ์— ์žˆ๋‹ค...

๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” "์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ ˆ๋ฐ˜ ์ด์ƒ์„" ํŽ˜์ด์ง€ ์บ์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์—ฌ์œ ์žˆ๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.




2. Shard Request ์บ์‹œ

์ด๊ฑด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์กฐ๊ธˆ ๋ณต์žกํ•œ ํŽธ์ด๋‹ค.

์ •ํ™•ํžˆ ๋งํ•˜๋ฉด ์ง‘๊ณ„๋กœ ์ธํ•ด์„œ ๋‚˜์˜จ ์ตœ์ข… ๊ฒฐ๊ณผ๋งŒ์„ ์บ์‹œํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฐ ์ธ๋ฑ์Šค๋ณ„๋กœ ๋‚˜์˜จ ์ค‘๊ฐ„ ๊ฒฐ๊ด๊ฐ’ ์ž์ฒด๋ฅผ ์บ์‹ฑํ•ด์„œ ์ผ๋ถ€ ์ธ๋ฑ์Šค๋งŒ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋„ ๋ถ€๋ถ„์ ์œผ๋กœ ์บ์‹œ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ฒŒ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์‚ฌ๋ก€๋Š” ์•„๋‹ˆ๋‹ค.
ํ•œ๋ฒˆ ํ‚ค๋ฐ”๋‚˜๋กœ ๋ฉ”ํŠธ๋ฆญ์ด๋‚˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

๊ทธ๋Ÿผ ์‹œ๊ฐ„๋Œ€๋ณ„๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค๊ณ  appendํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

์ฒ˜์Œ์— ์ด ์ƒํƒœ๋กœ๋Š” ๋‹น์—ฐํžˆ ๊ฑฐ์˜ ์บ์‹ฑ์ด ์ž˜ ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์‹œ๊ฐ„์ด ์ข€ ์ง€๋‚˜์„œ, ์˜›๋‚  ๋ฐ์ดํ„ฐ๊ฐ€ ์ข€ ์ง€์›Œ์ง€๊ณ , ๋์— ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์–ด๋–จ ๊ฒƒ ๊ฐ™์€๊ฐ€?

์™ผ์ชฝ์ด ๊ณผ๊ฑฐ๊ณ  ์˜ค๋ฅธ์ชฝ์ด ๋ฏธ๋ž˜๋‹ค.

์ด๋Ÿฌ๋ฉด ์ตœ์ข…์ ์ธ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ ํ˜•ํƒœ๋กœ๋งŒ ์บ์‹œ๋ฅผ ์ ์šฉํ•˜๋ฉด ์บ์‹œ๊ฐ€ ๊ธˆ๋ฐฉ ๋‚ ๋ผ๊ฐˆ ๊ฒƒ์ด๋‹ค.

์—ฌ๊ธฐ์„œ์˜ ์•„์ด๋””์–ด๋Š”, ๊ฐ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ๋ณ„๋„๋กœ ์บ์‹ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ์ €๊ธฐ์„œ logs-000002, logs-000003, logs-000004๋Š” ๋ณ€๊ฒฝ๋œ ๊ฒƒ์ด ์—†์œผ๋‹ˆ๊นŒ ์บ์‹œํ•ด๋†“๊ณ  ๊ทธ๋Œ€๋กœ ์žฌํ™œ์šฉํ•˜๊ณ , logs-000001, logs-000005๋งŒ ์บ์‹œ ์—†์ด ์‹ ๊ทœ๋กœ ๊ฐ€์ ธ์™€์„œ ์ง‘๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด ์บ์‹œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ตœ๋Œ€ 1% ์ •๋„๋ฅผ ์ ์œ ํ•œ๋‹ค.




3. Query ์บ์‹œ

Elasticsearch๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ ๋ฆฐ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ์ ๊ทน์ ์ธ ์บ์‹ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
์ตœ์ ํ™”๋ฅผ ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์•Œ์•„์•ผ ํ•  ๋ถ€๋ถ„์ด๋‹ค.



bitset ์บ์‹œ

Bitset์€ [0,0,1,0,1,1...] ๊ฐ™์€ ์ˆœ์ˆ˜ํ•œ ๋น„ํŠธ ์‹œํ€€์Šค๋ฅผ ๋งํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, {gt:5000} ๊ฐ™์€ ํ•„ํ„ฐ์‹์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค๋ฉด, ํ•ด๋‹น ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ๋ฐ์ดํ„ฐ์—๋งŒ 1์„ ๊ธฐ๋กํ•˜๊ณ , ๋ถ€ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฉด 0์„ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ปฌ๋Ÿผ์— ๋น„ํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์  ํฌ๊ธฐ๊ฐ€ ์ž‘๊ฒŒ ์ €์žฅ๋œ๋‹ค.



์œ ์—ฐํ•œ ์บ์‹œ ๊ตฌ์กฐ

Elasticsearch์˜ ์บ์‹œ๋Š” query์™€ result๊ฐ€ 1:1๋กœ ๋งคํ•‘๋˜๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋‹ค.
"์„œ๋กœ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ ๊ฐ„์—๋„" ๊ฐ™์€ bitset ์บ์‹œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋Ÿฐ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๊ฐ€ 2๊ฐœ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "message": "hello"
                    }
                }
            ],
            "filter": [
                {
                    "range": {
                        "created_at": {
                            "gte": "2021-02-01",
                            "lt": "2021-03-01"
                        }
                    }
                }
            ]
        }
    }
}
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "message": "world"
                    }
                }
            ],
            "filter": [
                {
                    "range": {
                        "created_at": {
                            "gte": "2021-02-01",
                            "lt": "2021-03-01"
                        }
                    }
                }
            ]
        }
    }
}

๋‘˜์€ ์ตœ์ข…์ ์œผ๋กœ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅผ ๊ฒƒ์ด๋‹ค.

์ฒซ๋ฒˆ์งธ๋Š” 2021-02-01 <= created_at < 2021-03-01 ์ด๋ฉด์„œ message๊ฐ€ "hello"์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
๋‘๋ฒˆ์งธ๋Š” 2021-02-01 <= created_at < 2021-03-01 ์ด๋ฉด์„œ message๊ฐ€ "world"์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์ด ์•„๋งˆ ์™„์ „ํžˆ ๋‹ค๋ฅผ ๊ฒƒ์ด๋‚˜, ๊ทธ๋Ÿผ์—๋„ created_at์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์€ ๋™์ผํ•˜๋‹ค.

Elasticsearch์˜ bitset ์บ์‹œ๋Š” ์ด๋Ÿฐ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์œ ์—ฐํ•˜๋‹ค. ์ € created_at bitset๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ตœ์ดˆ ๋กœ๋“œํ•œ ๋‹ค์Œ์— message ํ•„ํ„ฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๊ณ , bitset๋ผ๋ฆฌ OR ์••์ถ•์„ ํ•ด์„œ ๋น ๋ฅด๊ฒŒ ๋””์Šคํฌ ์•ก์„ธ์Šค๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.



bool์„ ์‚ฌ์šฉํ•˜๋ผ

elastcisearch๋Š” ํ•„ํ„ฐ์— ๋Œ€ํ•ด์„œ and๋‚˜ or, not์ ˆ ๋“ฑ์„ ์ง์ ‘์ ์œผ๋กœ ๊ฑธ ์ˆ˜ ์žˆ๋Š” ๋…ผ๋ฆฌ์‹์„ ์ง€์›ํ•œ๋‹ค.

{
    "filter": {
        "or": [
            {
                "and": [
                    {
                        "range": {
                            "end": {
                                "gte": 201407292300
                            }
                        }
                    },
                    {
                        "term": {
                            "condtion1": false
                        }
                    }
                ]
            }
        ]
    }
}

์ด๋Ÿฐ ์‹์œผ๋กœ ๋ง์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ํ˜•ํƒœ๋Š” Elasticsearch์˜ ์บ์‹œ๋ฅผ ํƒ€์ง€ ๋ชปํ•œ๋‹ค.
์บ์‹œ๋ฅผ ํ†ตํ•œ ์ตœ์ ํ™”๋ฅผ ์›ํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ์กฐ๊ฑด์ ˆ์ด bool ์ ˆ ์•ˆ์— ํฌํ•จ๋˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

{
    "query": {
        "bool": {
            "should": [
                {
                    "bool": {
                        "must": [
                            {
                                "range": {
                                    "end": {
                                        "gte": 201407292300
                                    }
                                }
                            },
                            {
                                "term": {
                                    "condtion1": false
                                }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

๊ทธ๋ž˜์•ผ ์ƒ์ˆ ํ–ˆ๋˜ bitset ๊ธฐ๋ฐ˜์˜ query ์บ์‹œ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋‹ค.



์ฟผ๋ฆฌ ์บ์‹œ ์˜ต์…˜

์ฟผ๋ฆฌ ์บ์‹œ ๊ด€๋ จ ์„ค์ •์—๋Š” 2๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค.

- indices.queries.cache.size
์ฟผ๋ฆฌ ์บ์‹œ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ์˜ต์…˜์ด๋‹ค.
๊ธฐ๋ณธ๊ฐ’์€ JVM ํž™ ํฌ๊ธฐ์˜ 10%๋‹ค.

- indices.queries.cache.count
์ด๊ฑด ๊ณต์‹ ๋ฌธ์„œ์—๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋ฐ, ์‹ค์ œ๋กœ ์กด์žฌ๋Š” ํ•˜๋Š” ์ „๋ฌธ๊ฐ€์šฉ? ์˜ต์…˜์ด๋‹ค.
์ฟผ๋ฆฌ ์บ์‹œ์˜ ์ตœ๋Œ€ ์ด ๊ฐœ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 10000์ด๋‹ค.



์ฐธ์กฐ
https://www.elastic.co/kr/blog/elasticsearch-caching-deep-dive-boosting-query-speed-one-cache-at-a-time
https://stackoverflow.com/questions/24893919/elasticsearch-performance-in-case-of-complex-filters-and-lot-of-records
https://www.elastic.co/guide/en/elasticsearch/reference/7.11/tune-for-search-speed.html#_give_memory_to_the_filesystem_cache_2
https://github.com/elastic/elasticsearch/issues/19799
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-cache.html