[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