개발

Elasticsearch #3

동고킴 2020. 6. 7. 17:47
반응형

스크립트

  • 많은 도큐먼트를 처리해야 할 때, 스크립트를 이용해 도큐먼트를 수정하면 네트워크 트래픽이 줄어들고 성능이 향상된다. (스크립트를 사용하지 않으면 도큐먼트를 열고 필드를 변경한 후 돌려줘야 한다.)
  • 스크립트는 여러 방법으로 스크립트를 읽을 수 있다.
  • 동적 스크립트는 보안상의 이유로 기본값인 '사용 안 함'으로 설정되어 있다. 자바스크립트나 파이썬 같은 동적 스크립트 언어를 사용하려면 '사용'으로 바꿔야 한다. elasticsearch.yml 파일에서 script.disable_dynamic 값을 true로 변경하고 클러스터를 재식해야 한다.
  • 가장 안전한 방법은 config/scripts 폴더에 해당 스크립트를 파일로 제공하는 것이다. 엘라스틱서치는 주기적으로(default 60초) 폴더를 스캔한다. 스크립트 언어는 자동으로 파일 확장에 의해 탐지되고 스크립트 이름은 파일 이름에 존재한다.

리퍼(river)

외부 원본 데이터에서 데이터를 읽어 클러스터에 저장하는 서비스(MoggonDB, RabbitMQ, Redis, JDBS, 트위치 등)
리버는 프로토타이핑으로 하기에 좋은 도구이지만 이슈가 발생하면 엘라스틱서치 클러스터가 불안정해질 수 있다. 따라서 분리된 애플리케이션에서 데이터를 수신하는 것이 모범 사례다. Logstash가 그 중 하나이다.

  • 장점
    • 클러스터 시작 또는 노드 실패로 다른 노드로 마이그레이션될 때, 엘라스틱서치가 자동 재시작을 관리한다.
    • 플러그인으로 쉽게 배포 가능
  • 단점
    • 리버의 실패 또는 오작동으로 인해 노드 또는 클러스터가 멈출 수 있다.
    • 리퍼 실행 시 리버의 부하를 조정할 수 있는 기능이 없어서 일부노드가 높은 오버헤드에 걸려 전체적인 성능을 줄일 수 있다.
    • 리버를 변경하려면 클러스터 재시작을 해야한다.
    • 다중 노드 환경에서 리버를 디버깅하기가 어렵다.

클러스터와 노드 모니터링

클러스터 레벨에서 일어날 수 있는 이슈들

  • 노드 오버헤드 : 노드가 너무 많은 샤드를 관리하느라 전체 클러스터에 병목이 생김
  • 노드 셧다운
  • 샤드 재배치 : 특정 샤드의 온라인 상태를 얻을 수 없으면 샤드 재배치 관련 문제나 변질이 발생한다.
  • 매우 큰 샤드 : 샤드가 너무 크면 루씬에서 세그먼트 병합이 많이 일어나기 때문에 색인 성능이 떨어진다.
  • 비어있는 색인과 샤드 : 모든 샤드에 많은 쓰레드가 동작하기 때문에 데이터가 없는 색인과 샤드는 메모리와 자원을 소비한다. 많은 색인과 샤드를 사용하지 않는다면 클러스터 성능은 떨어진다.

클러스터 Health check

curl -X GET "localhost:9200/_cluster/health?pretty"

status

  • green
  • yellow : 노드 또는 샤드의 손실을 의미하지만 클러스터 기능에는 손상이 없음을 의미한다. 주로 여러 복제본의 누락을 의미하며 동작 중인 개별 샤드의 복사본인 최소한 하나는 있다. 읽기, 쓰기 기능이 동작하고 있음을 의미한다.
  • red : 주요 샤드의 손실을 의미한다. 색인의 상태가 빨간색이라 저장할 수 없어서 결과가 완성된 것이 아닐 수 있으며, 결과를 부분적으로 리턴한다. 다운된 노드를 재시작하고 필요하다면 복제본을 생성해야 한다.

노드 통계

curl -X GET "localhost:9200/_nodes"
curl -X GET "localhost:9200/_nodes/name1,name2"
curl -X GET "localhost:9200/_nodes/name1,name2/jvm,os,..."

스냅샷

Repository 설정

path.repo: ["/tmp/es/backup"]
# 생성
curl -X PUT "localhost:9200/_snapshot/backup?pretty" -H "Content-Type: application/json" -d "{ "type": "fs", "settings": { "location": "/tmp/es/backup", "compress": true } }"

# 확인
curl -X GET "localhost:9200/_snapshot/backup?pretty"

# 삭제
curl -X DELETE "localhost:9200/_snapshot/backup?pretty"

# 검증
curl -X POST "localhost:9200/_snapshot/backup/_verify?pretty"

스탭샷 만들기

curl -X PUT "localhost:9200/_snapshot/backup/snap_01?wait_for_completion=true"
{
    "indices": "accounts-*",
    "ignore_unavailable": true,
    "include_global_state": false,
    "metadata": {
        "taken_by": "kimchy",
        "taken_because": "backup before upgrading"
    }
}

스냅샷 조회

curl -X GET "localhost:9200/_snapshot/bakcup/_all?pretty"

스냅샷 복수

curl -X POST "localhost:9200/_snapshot/bakcup/snap_01/_resotre"
{
    "indices": "accounts-*",
    "ignore_unavailable": true,
    "include_global_state": true,
    "rename_pattern": "account-(.+)",
    "rename_replacement": "resotred_account-$1"
}

Java Client

  • JVM 언어 기반의 애플리케이션은 엘라스틱서치와 통합할 수 있는 네이티브 프로토콜을 사용할 수 있다.
  • 네이티브 프로코톨은 엘라스틱서치와 통신할 수 있는 가장 빠른 프로토콜이다.
  • 그 이유는 바이너리 특성, 데이터를 빠르게 변환하는 네이티브 직렬화/역직렬화, 비동기 통신 방식, 홉감소(Rest 호출은 두번의 연결을 해 데이터 노드와 직접 통신하는데, 네이티브 클라이언트는 데이터 노드에 바로 연결할 수 있다.) 같은 요인들 때문이다.
  • 단, 새로운 버전이 나올때마다 네이티브 프로토콜이 진화하기 때문에 버전 간 호환성을 보장하지 않는다.

Elasticsearch with Spring

  • 스프링에서 지원하는 Spring Data Elasticsearch 사용
  • 엘라스틱서치에서 지원하는 Rest Client
  • 엘라스틱서치에서 지원하는 Tranport Client (deperated)

Index 주요 매개변수

  • routing : 색인에 사용할 샤드를 제어한다.
  • refresh : 도큐먼트를 색인한 후 새로고침을 강제한다. 이 옵션을 이용하면 도큐먼트를 색인한 후에 색인된 도큐먼트를 바로 검색할 수 있다.

Plugin

다양한 플러그인을 제공한다.

반응형

'개발' 카테고리의 다른 글

[백준 11505] 구간 곱 구하기  (0) 2021.01.16
Elasticsearch #4  (0) 2020.06.07
Elasticsearch #2  (0) 2020.06.07
Elasticsearch #1  (0) 2020.06.07
리눅스 포트 확인  (0) 2020.06.06