클러스터 운영 중 일부 데이터 노드들의 디스크 수명이 다 되어 교체가 필요한 상황. (현재 하나의 노드에 디스크 3대를 꽂아 사용중이다.)

평소와 같이 교체하려던 중 난감한 상황에 맞닥뜨렸다.

 

디스크 수급 문제로 인해 기존 디스크의 1/2 사이즈인 디스크로밖에 교체를 할 수 없다!

...

Elasticsearch는 모든 노드가 동일한 양의 디스크를 가지고 있다고 가정하므로 각 노드의 디스크 용량이 다를 시 문제가 발생할 수 있다.

교체가 필요한 노드는 총 32대의 데이터 노드 중 9대...

 

이 문제를 해결할 수 있는 방법을 강구해보았다.

 

 

1. shard allocation 옵션 적용

참고: https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-cluster.html#disk-based-shard-allocation

 

cluster.routing.allocation.disk.watermark.low, high 옵션을 조정해 노드의 디스크 사용량이 초과될 경우 적재된 샤드의 노드 이동 및 신규 샤드 할당 제한한다.

덧붙여 cluster.routing.allocation 아래의 옵션을 조정해 샤드 리밸런싱 및 복구 수 제한을 두어 또 샤드의 이동으로 인해 발생할 수 있는 부하를 최대한 줄인다.

 

가장 간단하고 빠르게 적용할 수 있는 방법이다.

그러나!

아무리 줄이고 제한을 둔다고 해도 샤드 리밸런싱 자체가 노드와 클러스터에 큰 부하를 일으킬 수 있는 작업이고, 더욱이 대용량 데이터를 다룰 경우 그 부담이 매우 크다.

 

따라서 위 방법은 사용하지 않는 것으로 결정.

 

 

 

2. shard allocation filtering 적용

참고: https://www.elastic.co/guide/en/elasticsearch/reference/current/shard-allocation-filtering.html#shard-allocation-filtering

 

shard allocation filtering을 사용하면 특정 인덱스의 샤드 할당 위치를 제어할 수 있다.

기존 디스크를 사용하는 25대의 노드와 절반 사이즈의 디스크를 사용하는 9대의 노드를 두고 현재 적재되고 있는 인덱스 별로 디스크 노드 타입을 지정해 분리 적재할 수 있다.

따라서 클러스터의 디스크 용량을 효율적으로 관리할 수도 있고 데이터 일관성을 유지할 수 있어 관리하기도 편하다.

 

해볼만한 방법이다.

그러나...

 

무엇보다 유연성이 제한된다는 점이 마음에 걸렸다.

각 인덱스들이 전체 데이터 노드에 고루 분산되지 않고 나뉘어 저장될 경우 샤드의 리밸런싱에 제한이 있을 뿐 아니라 일부 노드에 부하가 집중될 수 있는 가능성이 커진다.

특정 인덱스의 데이터가 급증하거나 쿼리량이 급증할 경우, 혹은 노드가 다운될 경우 등의 상황에 전체 데이터 노드가 부하를 나눠 받는게 아니라 디스크 타입 별 노드 그룹에 영향을 미치니 말이다.

또한 데이터 특성 상 중요도가 높고 자주 사용되는 인덱스 타입들은 사이즈가 작아 구성 상 9대의 노드에만 분배할 수 있었기에 더욱 부담스러웠다.

 

 

3. Hot - Warm 아키텍쳐 적용

참고: https://www.elastic.co/kr/blog/implementing-hot-warm-cold-in-elasticsearch-with-index-lifecycle-management

 

인덱스의 사용빈도(즉, disk의 I/O 빈도)에 따라 tier를 나눠서 보관하는 방법.

자주 사용되는 인덱스는 성능이 좋은 Hot 노드에 저장하여 사용하고, 간혈적으로 사용하는 인덱스는 비교적 성능이 낮은 Warm 노드에 저장하여 구성할 수 있다.

현재 운영중인 클러스터에 적용한다면 총 32대의 노드 중 25대의 기존 디스크를 가진 노드들을 Hot 노드로, 나머지 9대의 노드를 Warm 노드로 구성한 뒤 Hot노드로 적재된 인덱스들 중 자주 사용하지 않는 오래된 인덱스들은 Warm노드로 이동시키는 정책을 설정할 수 있다.

 

가장 합리적인 방법이라고 생각했다.

샤드 필터링과 마찬가지로 디스크 사용량을 효율적으로 관리할 수 있는데다가 

무엇보다 인덱스 타입 별로 구분하는 것이 아닌 최신 데이터와 오래된 데이터를 분리하는 것이기 때문에 부하 또한 골고루 분산될 수 있기 때문이다.

더욱이 현재 적재되는 인덱스들은 daily 단위로 관리되고 있기 때문에 이동시킬 데이터를 구분하기도 쉬웠고 해당 정책을 비교적 간단히 적용할 수 있었다.

 

한가지 마음에 걸리는 건 hot노드에서 warm 노드로 인덱스가 이동할 때 클러스터에 부하가 있지 않을까 했던 것.

그러나 전체 인덱스 대비 1/8 규모의 인덱스만 이동하고 데이터 적재량과 사용량이 아주 드문 새벽 시간대에 이동 작업을 진행하므로 크게 무리는 없겠다는 판단이 섰고 진행했다.

 

적용 과정

1. elasticsearch.yml 파일을 이용해 노드 속성 warm노드로 변경 (노드 재시작 필요)

node.attr.box_type: warm
  • v7.10 이후 node.roles에 data_hot, data_warm 등 속성 지정이 가능하나 현재 노드에 box_type 속성으로 지정되어있어 해당 옵션으로 적용

 

2. ILM에 warm phase 추가

PUT _ilm/policy/index-policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "8d",
        "actions": {
          "allocate": {
            "require": {
              "box_type": "warm"
            }
          }
        }
      },
      "delete": {
        "min_age": "10d",
        "actions": {
          "delete": {
            "delete_searchable_snapshot": true
          }
        }
      }
    }
  }
}
  • hot노드에 적재된 인덱스들이 8일이 지나면 warm 노드로 이동하며 10일이 지나면 클러스터에서 제거된다.
  • 각 노드 타입 별 디스크 사이즈와 인덱스 별 사이즈를 계산하여 적절한 이동 주기를 계산한 후 적용하였다.

 

 

3. 인덱스 템플릿에 ILM 추가

PUT _template/index_template
{
  "index_patterns": ["test-*"], 
  "settings": {
    "index.lifecycle.name": "index-policy"
  }
}
  • 이미 인덱스 템플릿을 이용해 인덱스들을 관리하고 있다면 해당 과정은 적용하지 않아도 된다 (ilm정책 자동 업데이트)
  • 롤오버 작업이 포함된 ILM정책의 경우 템플릿에 rollover_alias 추가 및 앨리어스에 is_write_index 설정이 필요하다

 

4. 적재된 인덱스에 ilm 적용해 warm노드 임의 이동 (필요 시)

PUT test-2024-03-10/_settings
{
  "index.lifecycle.name": "index-policy" 
}
  • 기존 인덱스에 ILM이 적용되지 않았을 경우 적용한다.

 

(인덱스 warm노드 임의 이동)

PUT test-2024-03-10/_settings
{
  "settings": {
    "index.routing.allocation.require.box_type": "warm"
  }
}
  • ILM을 적용하지 않고 임의로 warm노드로 이동할 수도 있다. (이동만 한다. 삭제는 알아서...)

 

결과

 

전체 노드의 disk 사용량을 60% 이하로 유지하며 클러스터 부하 없이 안정적으로 유지 중이다!

 

 

간단 회고

내키진 않지만 플랫폼에서 권장하지 않는 구성을 해야만 할 때가 있다.

이번 이슈의 경우 그런 어려운 상황을 극복함과 동시에 현재 운영중인 클러스터의 안정성을 더 높였다는 성취감이 있어 더욱 뿌듯했다. (그래프가 생각했던 것 보다 더 이쁘기도 하다 ^_^)

'Elasticsearch' 카테고리의 다른 글

nested list field size 집계  (1) 2023.12.23
keyword list 필드 string으로 합치기  (1) 2023.12.23
NGram analyzer  (0) 2023.12.14
Elasticsearh Enrich processor  (1) 2023.10.28
ElasticSearch(oss) vs OpenSearch  (0) 2023.10.28

list 형태로 적재된 nested field의 전체 size 구하기

 

POST products/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "must": [
              {
                "nested": {
                  "path": "products",
                  "query": {
                    "exists": {
                      "field": "products"
                    }
                  }
                }
              }
            ] 
          }
        }
      ]
    }
  },
  "aggs": {
    "agg_hour": {
      "date_histogram": {
        "field": "time",
        "calendar_interval": "1h",
        "time_zone": "Asia/Seoul",
        "min_doc_count": 1
      },
      "aggs": {
        "products_agg": {
          "sum": {
            "script": {
              "inline": "params._source.products.size()"
            }
          }
        }
      }
    }
  }
}

 

products 인덱스에 nested list 형태로 적재되어있는 products 필드의 길이를 계산하여 시간대 별로 합산하여 집계

  • query 옵션으로 products 필드가 존재하는 문서만 집계 대상에 포함
  • aggs 옵션에 sum 메트릭 이용하여 products의 size의 합 집계
  • date_histogram 이용해 시간대 별 집계 적용

 

 

 

 

 

'Elasticsearch' 카테고리의 다른 글

Elasticsearch 디스크 불균등 이슈 해결하기  (0) 2024.03.10
keyword list 필드 string으로 합치기  (1) 2023.12.23
NGram analyzer  (0) 2023.12.14
Elasticsearh Enrich processor  (1) 2023.10.28
ElasticSearch(oss) vs OpenSearch  (0) 2023.10.28

keyword list형태의 필드를 하나의 string 으로 합쳐 재색인

  • reindex 및 script 사용

 

 

POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "keywords"
  },
  "dest": {
    "index": "keywords_to_string"
  },
  "script": {
    "source": """
       if (ctx._source.kwd != null) {
          StringBuilder combinedValues = new StringBuilder();
          for (item in ctx._source.kwd) {
            combinedValues.append(item);
            combinedValues.append(" ");
          }
          
          ctx._source.str = combinedValues.toString().trim();
          ctx._source.remove('kwd');
        }
      """,
    "lang": "painless"
  }
}

keywords 인덱스에 keyword list 형태로 적재되어있는 kwd 필드를 하나의 string으로 합쳐서 keywords_to_string 인덱스의 str 필드로 적재

  • script 옵션 이용해 string 생성 코드 작성
  • 스페이스(" ")로 구분자 적용
  • 기존 kwd 필드 제거 필요할 경우 remove 이용해 제거

'Elasticsearch' 카테고리의 다른 글

Elasticsearch 디스크 불균등 이슈 해결하기  (0) 2024.03.10
nested list field size 집계  (1) 2023.12.23
NGram analyzer  (0) 2023.12.14
Elasticsearh Enrich processor  (1) 2023.10.28
ElasticSearch(oss) vs OpenSearch  (0) 2023.10.28

NGram 

Elasticsearch에서는 빠른 검색을 위해 검색에 사용될 텀들을 미리 분리해 역인덱스(inverted index)에 저장함.

텀이 아닌 단어의 일부만 가지고 검색이 필요할 경우 검색 텀의 일부만 미리 분리해서 저장할 수 있는데, 이렇게 단어의 일부를 나눈 부위를 NGram이라고 함 (unigram - 1글자, bigram - 2글자 등) ("type": "nGram")

 

ex. "spring" 이라는 단어를 bigram으로 처리할 경우 "sp", "pr", "ri", "in", "ng" 총 5개의 토큰이 추출되며, ngram 토큰 필터 사용 시 2글자로 추출된 텀들이 모두 검색 토큰으로 저장됨 -> "pr" 검색 시 spring이 포함된 도큐먼트들 매치

 

Edge NGram 

 텀 앞쪽의 ngram 만 저장하기 위해서는 Edge NGram 토큰필터를 이용 ("type": "edgeNGram")

 

ex. edgeNGram의 옵션을 "min_gram": 1, "max_gram": 4 으로 설정하고 "spring" 분석 시 "s", "sp", "spr", "spri" 토큰 생성

 

Shingle

문자가 아닌 단어 단위로 구성된 묶음 ("type": "shingle" )

 

ex. "spring blooms bright flowers"를 Shingle 토큰 필터를 적용해 2단어씩 분리할 경우 "spring blooms", "bloom bright", "bright flowers" 3개의 shingle 생성

 

 

 

 

NGram Analyzer 적용

ex.

"컴퓨터프로그래밍_노래방카페_휴대폰어플_커피숍카페" 문자열을 "_" 구분자로 나눈 후 ngram 토큰 필터 적용해 분석하기

 

PUT ngram_test
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "ngram_analyzer": {
            "type": "custom",
            "tokenizer": "underscore_tokenizer",
            "filter": "bigram_filter"
          }
        },
        "filter": {
          "bigram_filter": {
            "type": "ngram",
            "min_gram": 2,
            "max_gram": 2
          }
        }, 
        "tokenizer": {
          "underscore_tokenizer": {
            "type": "pattern",
            "pattern": "_"
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "analyzer": "ngram_analyzer"
      }
    }
  }
}
  • ngram_analyzer: underscore_tokenizer와 bigram_filter로 구성
    • underscore_tokenizer: "_"를 구분자로 토큰 추출
    • bigram_filter: 토큰들을 2글자씩 추출해 검색 토큰으로 저장

 

분석 및 결과

GET ngram_test/_analyze
{
  "analyzer": "ngram_analyzer",
  "text": "컴퓨터프로그래밍_노래방카페_휴대폰어플_커피숍카페"
}


{
  "tokens": [
    {
      "token": "컴퓨",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    },
    {
      "token": "퓨터",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    },
    {
      "token": "터프",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    },
    {
      "token": "프로",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    },
    {
      "token": "로그",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    },
    {
      "token": "그래",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    },
    {
      "token": "래밍",
      "start_offset": 0,
      "end_offset": 8,
      "type": "word",
      "position": 0
    },
    {
      "token": "노래",
      "start_offset": 9,
      "end_offset": 14,
      "type": "word",
      "position": 1
    },
    {
      "token": "래방",
      "start_offset": 9,
      "end_offset": 14,
      "type": "word",
      "position": 1
    },
    {
      "token": "방카",
      "start_offset": 9,
      "end_offset": 14,
      "type": "word",
      "position": 1
    },
    {
      "token": "카페",
      "start_offset": 9,
      "end_offset": 14,
      "type": "word",
      "position": 1
    },
    {
      "token": "휴대",
      "start_offset": 15,
      "end_offset": 20,
      "type": "word",
      "position": 2
    },
    {
      "token": "대폰",
      "start_offset": 15,
      "end_offset": 20,
      "type": "word",
      "position": 2
    },
    {
      "token": "폰어",
      "start_offset": 15,
      "end_offset": 20,
      "type": "word",
      "position": 2
    },
    {
      "token": "어플",
      "start_offset": 15,
      "end_offset": 20,
      "type": "word",
      "position": 2
    },
    {
      "token": "커피",
      "start_offset": 21,
      "end_offset": 26,
      "type": "word",
      "position": 3
    },
    {
      "token": "피숍",
      "start_offset": 21,
      "end_offset": 26,
      "type": "word",
      "position": 3
    },
    {
      "token": "숍카",
      "start_offset": 21,
      "end_offset": 26,
      "type": "word",
      "position": 3
    },
    {
      "token": "카페",
      "start_offset": 21,
      "end_offset": 26,
      "type": "word",
      "position": 3
    }
  ]
}

 

 

검색 예제 및 결과

GET ngram_test/_search
{
  "query": {
    "match": {
      "text": "노래"
    }
  }
}



{
  ...
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.4249156,
    "hits": [
      {
        "_index": "ngram_test",
        "_id": "2m8UaIwBamOI6MTqQUbR",
        "_score": 0.4249156,
        "_source": {
          "text": "컴퓨터프로그래밍_노래방카페_휴대폰어플_커피숍카페"
        }
      }
    ]
  }
}

 

 

 

 

 

wildcard 쿼리와의 비교

 

Elasticsearch는 RDBMS의 LIKE 검색 처럼 사용하는 wildcard 쿼리나 regexp (정규식) 쿼리도 지원을 하지만, 이런 쿼리들은 메모리 소모가 많고 느리기 때문에 Elasticsearch의 장점을 활용하지 못함

 

wildcard 쿼리는 term level 쿼리이기 때문에 inverted index의 term(token) 목록 중 쿼리에서 질의한 keyword 검색

  • token기준으로 wildcard 에서 못찾는 document 검색 가능
  • ngram이 반응 속도 더 빠름
  • token 의 갯수가 많아지기 때문에 inverted index 사이즈 증가

Elasticsearch Enrich processor

Elasticsearch 7.5부터 이미 인덱싱되어 있는 인덱스들의 데이터를 새로 인덱싱되는 데이터에 원하는대로 추가하는 Enrich 작업 가능

주요 활용 사례

  • IP address를 통해서 연관된 디바이스나 서비스 정보들 추가
  • 상품 주문 데이터의 Product ID를 통해서 상세 제품 정보 데이터 추가
  • 이메일 주소를 통해서 상세 컨택 포인트 정보 추가
  • GPS의 정보를 통해서 우편 번호 정보 추가

 

주의 사항

  • Enrich processor가 여러 작업을 수행하며 수집 파이프라인의 속도에 영향을 줄 수 있으므로, 프로덕션 환경에 배포하기 전 테스트 실행해 벤치마킹할 것을 권장
  • 실시간 데이터를 추가하는 데는 수집 프로세서를 사용하지 않는 것이 좋으며, 수집 프로세서는 자주 변경되지 않는 참조 데이터에서 가장 잘 동작

 

 

Ingest node

elasticsearch에 데이터를 인덱싱하기 전에 다양한 전처리를 할 수 있는 메커니즘을 제공하는 노드 타입으로써

Enrich processor 설정 시 해당 노드 타입에서 프로세스 실행

 

모든 노드 타입의 default가 ingest 가능으로 설정되어 있으며, elasticsearch.yml 파일에서 disable 가능

node.ingest: false

 

 

Ingest Pipeline

다양한 프로세서(Processors)로 파이프라인(Ingest Pipline)을 구성해서 순차적으로 데이터를 처리한 후 es에 인덱싱

  • 데이터의 전처리 위해 전처리 processor가 지정된 pipeline 정의
  • elasticsearch 7.8부터 ingest data를 쉽게 관리하기 위해 kibana의 management에 Ingest Node Pipelines 추가됨
    • 모든 데이터 파이프라인을 하나의 테이블에서 볼 수 있음
    • JSON 에디터를 이용해 파이프라인 생성, 삭제, 편집 가능

 

How the enrich processor works

Ingest pipeline이 인덱싱 전의 데이터 변환

  • Ingest pipeline의 정의된 processor들의 인덱싱 되는 데이터들을 대상으로한 변환 작업이 끝나면 target 인덱스에 해당 document 추가됨
  • 대부분 processor들 해당 문서의 변환 작업만 수행하지만, enrich processor는 들어오는 문서들에 새로운 데이터를 추가하는 작업 수행 

 

 

Enrich Pipeline 구성

 

1. prerequisites 확인

security 사용 시 권한/롤 설정 필요

  1. read index privileges for any indices used
  2. The enrich_user built-in roleAdd enrich data

 

2. Source Index 생성

source index의 document는 incoming 문서에 추가하려는 enrich data가 포함되어야 하며, 
문서 및 인덱스 API를 사용해 source index 관리 가능 (일반 인덱스와 동일)

 

3. Enrich Policy 생성

source 인덱스를 대상으로 Enrich Policy 정의 및 생성

PUT /_enrich/policy/my-policy
{
  "match": {
    "indices": "users",
    "match_field": "email",
    "enrich_fields": ["first_name", "last_name", "city", "zip", "state"]
  }
}
  • policy type : enrich policy 정의
    • geo_match: geo_shape_query를 기반 (지리 정보 관련된 incoming 문서에 적용 시 사용)
    • match: term 쿼리 기반
    • rangeMatch: range 쿼리 기반 (숫자, 날짜, IP주소 관련 incoming 문서 매치 시 사용)
  • indices: 같은 match_field를 공유하는 source index 여러개 정의 가능
  • match_field: incoming 문서에 사용될 source 인덱스의 필드
  • enrich_field: incoming 문서에 추가될 필드 정의. source 인덱스에 반드시 존재해야 함
  • query (optional): enrich index에서 매칭 시 필터링 쿼리 정의 (default: match_all

 

주의사항

생성된 enrich policy는 업데이트나 변경 불가하므로, 변경 필요 시 아래 작업 수행

  1. 신규 enrich policy 생성 및 실행
  2. 사용 중인 enrich processor의 기존 enrich policy를 신규 policy로 대체 
  3. delete api 사용해 기존 enrich policy 삭제

 

 

4. Enrich Policy 실행

enrich policy를 execute API로 실행해 enrich 인덱스 생성

PUT /_enrich/policy/my-policy/_execute

 

enrich 인덱스에는 source 인덱스에 있는 문서가 포함되며, enrich 인덱스는 항상 .enrich-*로 시작하고 읽기 전용이며 강제 병합(force merge) 됨

 

 

5. enrich processor 정의 및 ingest pipeline에 추가

PUT _ingest/pipeline/my_pipeline_id
{
  "description" : "describe pipeline",
  "processors" : [
    {
      "enrich" : {
        "policy_name": "enrich-policy",
        "field" : "enrich_field",
        "target_field": "enrich_target_field",
        "max_matches": "1"
      }
    }
  ]
}
  • enrich processor
    • policy_name: 위에서 정의한 enrich policy
    • field: 새로 인덱싱되는 data에서 매칭될 필드 정의
    • target_field: enrich data가 포함될 필드 이름 정의. 해당 필드에 enrich data가 json array 형식으로 추가
    • max_matches: target_field에 추가될 json array 길이 제한 

 

6. Ingest and enrich documents.

Index template에 위에서 생성한 pipeline 추가해 적용

PUT _template/index_template
{
  "settings" : {
    "index": {
      "default_pipeline": "my_pipeline_id",
       ...
    }
  }
}

 

 

 

 

참고 문서 : https://www.elastic.co/guide/en/elasticsearch/reference/7.x/enrich-setup.html#create-enrich-source-index

 

'Elasticsearch' 카테고리의 다른 글

Elasticsearch 디스크 불균등 이슈 해결하기  (0) 2024.03.10
nested list field size 집계  (1) 2023.12.23
keyword list 필드 string으로 합치기  (1) 2023.12.23
NGram analyzer  (0) 2023.12.14
ElasticSearch(oss) vs OpenSearch  (0) 2023.10.28

Apache 라이센스 버전의 기능 배포판인 Elasticsearch OSS 버전과 Opensearch 비교

 

항목 ElasticSearch(oss) OpenSearch
보안
  • 클러스터에 존재하는 사용자 계정에 대한 엑세스 제어만 지원
  • LDAP, OpenID와 같은 중앙 집중식 사용자 관리 시스템 사용 가능 (Security plugin)
  • 보안 정보 및 이벤트 관리(SIEM) 솔루션 지원(Security Analytic Plugin)
라이센스
  • 오픈 소스 Apache License, 버전 2.0에서 ELv2 및 SSPL로 이동
  • Apache 라이선스 버전 2.0
기능(무료)  
  • Centralized user accounts / access control (중앙 집중식 사용자 계정/엑세스 제어)
  • Cross-cluster replication (클러스터 간 복제)
  • IP filtering (IP 필터링)
  • Configurable retention period (보존 기간 설정)
  • Anomaly detection (이상 감지)
  • Tableau connector (Tableau 커넥터)
  • JDBC driver (JDBC 드라이버)
  • ODBC driver (ODBC 드라이버) 
  • Machine learning features such as regression and classification (머신 러닝 기능)
문서
  • 광범위 (블로그, 가이드, 비디오, 웨비나, 토론 포럼, Slack, 유튜브 등...)
  • 다소 부족 (플러그인 제외 Elasticsearch 문서 7.10 참조 가능)
커뮤니티
  • 사용자 pull requests,issue 오픈, 피드백 등 요청 가능
  • 사용자의 컨트리뷰션 허용하나 Elastic 직원이 변경 사항 커밋
대시보드
  • Canvas, Lens (프리젠테이션 모드, 드래그 앤 드롭 시각화)
  • Kibana Maps (지형 공간 데이터 시각화 및 분석 용이)
  • Elasticsearch 7.10.2 버전 모든 시각화 기능 사용 가능
  • 클러스터 중단 없이 확장 기능 추가 가능 
머신러닝  
  • CPU 사용에 따라 기능 제한
  • K-Means, RCF(Random Cut Forest) 지원 (+ linear regression, localization)
로그 수집, 집계 툴킷
  • Beats, Logstash 데이터 수집 지원 (+Fluentd, FluentBit, OpenTelemetry Collector)
  • Apache Kafka와 연동
  • Beats, Logstash 데이터 수집 지원 (+Fluentd, FluentBit, OpenTelemetry Collector)
  • Data Prepper 지원 (데이터 수락, 필터링, 변환, 보강 및 라우팅 지원 Opensearch 프로젝트. 향후 메트릭 데이터 지원 예정)
  • Apache Kafka와 연동
플러그인
서비스 지원
  • Elastic ( +Dattell 등 예방적 유지보수 및 지원 서비스)
  • AWS (+Oracle, Dattell...)
요약
  • 프리미엄 제품에 특히 시각화를 위한 더 많은 기능 포함 (유료..)
  • 문서 및 자습서 라이브러리 풍부
  • 완전 무료
  • 전체 보안 기능 제품군 제공
  • 일부 문서 누락, 작은 커뮤니티

 

 

여유 자금이 있다면 ElasticSearch를 사용하는 것이 더 쉬운 접근 방식이 될 수 있으나, 예산 절약이 목적이라면 OpenSearch

참고 문서: https://dattell.com/data-architecture-blog/opensearch-vs-elasticsearch/

 

 

 

'Elasticsearch' 카테고리의 다른 글

Elasticsearch 디스크 불균등 이슈 해결하기  (0) 2024.03.10
nested list field size 집계  (1) 2023.12.23
keyword list 필드 string으로 합치기  (1) 2023.12.23
NGram analyzer  (0) 2023.12.14
Elasticsearh Enrich processor  (1) 2023.10.28

+ Recent posts