관리 메뉴

피터의 개발이야기

[Elasticsearch] ElasticSearch 기본 정리 본문

DevOps/Elasticsearch

[Elasticsearch] ElasticSearch 기본 정리

기록하는 백앤드개발자 2024. 9. 23. 10:10
반응형

ㅁ 들어가며

ㅇ 회사 팀 회의에서 ElasticSearch의 실시간 조회에 대한 이야기를 나누었다. 

ㅇ 기존에 경험했던 내용을 설명하는 단계에서 기본 개념과 용어가 잘 생각이 나지 않아 다시 종합적으로 공부가 필요했다.

ㅇ 이번 글은 ElasticSearch 기본 개념 정리에 대해서 정리하였다.

ㅁ ElasticSearch 소개

ElasticSearch는 분산형 검색 및 분석 엔진으로, REST API를 통해 모든 기능을 제공한다. 대량의 데이터를 빠르게 저장, 검색, 분석할 수 있는 강력한 도구이다. 쿠버네티스 환경에서 분산된 로그를 수집하여 통합적인 로그 점검을 위해 사용한 적이 있다. 

관련글:

[Elasticsearch] EFK(Elasticsearch, Fluentd, kibana)란

[Elasticsearch] EFK 설치(minikube)-1
[Elasticsearch] EFK 설치(minikube)-2

 

ㅁ 주요 개념

인덱스와 도큐먼트

ElasticSearch에서 가장 중요한 개념은 인덱스와 도큐먼트다.

 - 인덱스: 도큐먼트를 저장하는 논리적 단위. 관계형 DB의 테이블과 유사하다.

 - 도큐먼트: 실제 데이터를 저장하는 기본 단위. JSON 형태로 저장된다.

인덱스 내에는 여러 도큐먼트가 포함되며, 같은 인덱스도큐먼트들은 동일한 스키마를 갖는다. 모든 도큐먼트는 반드시 하나의 인덱스에 속해야 한다.

 

 index와 indices의 차이

indices는 언어적으로는 index의 복수형을 뜻하고, index의 물리적인 의미로 저장소 단위 개념이다.

  관련글: [Elasticsearch] index vs indices

샤드와 레플리카

ElasticSearch는 분산 시스템으로 설계되어 있어, 데이터를 여러 노드에 분산 저장한다.

 - 샤드: 인덱스를 여러 조각으로 나눈 것. 데이터를 분산 저장하고 병렬 처리를 가능하게 한다.

 - 레플리카: 샤드복제본. 데이터 안정성과 검색 성능을 높이고 가용성을 가능하게 한다.

 

 

ㅁ ElasticSearch 사용하기

REST API

ㅇ ElasticSearch의 모든 기능은 REST API를 통해 사용할 수 있다. 주로 HTTP 메소드(GET, POST, PUT, DELETE)를 사용해 데이터를 조작한다.

키바나 Dev Tools

ㅇ 키바나의 Dev Tools 콘솔을 통해 ElasticSearch API를 쉽게 사용할 수 있다. 자동 완성 기능을 제공해 API 사용법을 쉽게 익힐 수 있다.

ㅇ cat API

cat API는 ElasticSearch의 현재 상태를 빠르게 확인할 수 있는 도구다. 예를 들어, GET _cat/indices?v를 통해 현재 인덱스 목록을 확인할 수 있다.

 

 

ㅁ 인덱스 관리

PUT test-index

ㅇ 인덱스 생성

 

GET test-index

ㅇ 인덱스 확인

 

DELETE test-index

ㅇ 인덱스 삭제

 

ㅁ 도큐먼트 CRUD

도큐먼트 생성 (Create)

PUT test-index/_doc/1
{
  "name": "Hong",
  "age": 27,
  "gender": "male"
}

 

도큐먼트 읽기 (Read)

GET test-index/_doc/1

ㅇ ID로 조회

 

GET test-index/_search

ㅇ 검색

 

도큐먼트 수정 (Update)

PUT test-index/_doc/1
{
  "name": "Change",
  "age": 34,
  "gender": "male"
}

ㅇ 전체 수정

PUT test-index/_update/1
{
  "doc": {
    "name": "Hong"
  }
}

ㅇ 부분 수정

 

도큐먼트 삭제 (Delete)

DELETE test-index/_doc/2

 

ㅁ 다이내믹 매핑

  ElasticSearch도큐먼트의 필드와 값을 보고 자동으로 데이터 타입을 지정하는 다이내믹 매핑 기능을 제공한다. 예를 들어, 숫자는 long 타입으로, 문자열은 text 타입으로 자동 지정된다.

 

ㅁ 벌크 연산

여러 작업을 한 번에 처리하는 벌크 연산을 통해 효율적으로 데이터를 처리할 수 있다.

POST _bulk
{"index":{"_index":"test","_id":"1"}}
{"field1":"value1"}
{"create":{"_index":"test","_id":"2"}}
{"field1":"value2"}
{"update":{"_index":"test","_id":"1"}}
{"doc":{"field2":"value2"}}
{"delete":{"_index":"test","_id":"2"}}

 

ㅁ 검색과 쿼리

 ElasticSearch는 강력한 검색 기능을 제공한다. Query DSL을 사용해 복잡한 검색 쿼리를 작성할 수 있다.

 

기본 검색

GET test-index/_search
{
  "query": {
    "match": {
      "name": "Hong"
    }
  }
}

 

복합 쿼리

GET test-index/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "name": "Hong" } },
        { "range": { "age": { "gte": 20 } } }
      ]
    }
  }
}

 

애그리게이션

ElasticSearch는 데이터 집계와 분석을 위한 강력한 애그리게이션 기능을 제공한다.

GET test-index/_search
{
  "aggs": {
    "average_age": {
      "avg": {
        "field": "age"
      }
    }
  }
}

 

매핑

인덱스의 필드와 데이터 타입을 정의하는 매핑은 데이터의 구조를 명확히 하고 검색 성능을 최적화하는 데 중요하다.

PUT test-index
{
  "mappings": {
    "properties": {
      "name": { "type": "text" },
      "age": { "type": "integer" },
      "email": { "type": "keyword" }
    }
  }
}

 

ㅁ 분석기

ㅇ ElasticSearch는 텍스트를 토큰으로 분리하고 처리하는 분석기를 제공한다.

ㅇ ElasticSearch는 장문의 문자열을 역인데싱하여 양질의 결과를 얻을 수 있다. 

역인데싱
장문의 문자열을 분석해 작은 단위로 쪼개어 인덱싱하는 기술

ㅇ 기본 분석기 외에도 사용자 정의 분석기를 만들 수 있다.

PUT test-index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  }
}

 

ㅁ 클러스터와 노드

ElasticSearch는 여러 노드로 구성된 클러스터 형태로 운영된다. 각 노드는 데이터를 저장하고 검색 요청을 처리한다.

  • 마스터 노드: 클러스터 전체를 관리
  • 데이터 노드: 실제 데이터를 저장하고 검색/색인 작업 수행
  • 클라이언트 노드: 사용자의 요청을 받아 적절한 데이터 노드로 전달

 

ㅁ 성능 최적화

ElasticSearch의 성능을 최적화하기 위해 다음과 같은 방법을 사용할 수 있다:

  1. 적절한 샤드 수 설정
  2. 캐시 활용
  3. 필드 데이터 타입 최적화
  4. 벌크 연산 사용
  5. 인덱스 새로고침 주기 조정

 

ㅁ 모니터링과 관리

ElasticSearch 클러스터의 건강 상태와 성능을 모니터링하고 관리하는 것이 중요하다. 키바나의 모니터링 도구를 활용하거나 ElasticSearch의 API를 직접 사용해 클러스터 상태를 확인할 수 있다.

GET _cluster/health
GET _nodes/stats

 

관련글: [Elasticsearch] Elasticsearch DISK IO 병목현상 및 재기동
 ㄴ Elasticsearch data의 모니터링 이유 설명
   - elasticsearch data의 CPU와 메모리 사용량이 제일 높았다.
   - 모든 컨테이너들의 로그를 처리하고 있어서 트래픽이 높아지면 elasticsearch의 부하도 함께 증가하기 때문에 모니터링이 필요했다.
   - 특히 data의 데이터 저장을 위해 disk IO가 많이 상승할 때가 있어서 평상 시에 중점적으로 모니터링을 하고 있었다.

 

ㅁ 마무리

  ElasticSearch는 강력하고 유연한 검색 및 분석 엔진이다. 기본 개념을 이해하고 적절히 활용하면 대규모 데이터를 효율적으로 처리하고 분석할 수 있다. REST API를 통한 간편한 사용법, 분산 아키텍처를 통한 확장성, 실시간 검색과 분석 기능은 ElasticSearch의 큰 장점이다. 다만, 데이터의 일관성이나 트랜잭션 처리가 중요한 경우에는 관계형 데이터베이스와 함께 사용하는 것이 좋다.

 

ㅁ 함께 보면 좋은 사이트

ElasticSearch - 기본 개념

Elasticsearch 기능 목록

반응형
Comments