Elasticsearch?

대량의 데이터를 NRT ( Near Real Time )으로 저장, 검색, 분석 할 수 있는 루씬 기반 Java 오픈소스 분산 검색 엔진

특징

Scale Out

Shard를 이용하여 수평적으로 늘어날 수 있다.

HA

Replica를 통해 데이터 안전성 보장

Schema Free

Json을 통해 데이터 검색

Restful

CRUD 작업을 HTTP Restful API를 통해 수행

Inverted Index

텍스트를 파싱하여 검색어 사전 생성

  • 속도가 빠르다.

요소별 역할

Node

Master

  • ES의 Instance 단위
    • Instance는 각자의 역할 존재
  • Node.roles를 이용하여 적절한 역할을 사용하는 것이 좋다.
    1. Tribe Node
      1. Cluster간 연결을 해주는 역할
        1. 요청에 따라 서로 다른 Cluster에 데이터를 분리해서 보냄
    2. Remote-eligible Node
      1. remote cluster clinet 역할
        1. 원격 cluster과 연결시켜주는 역할
      2. cross cluster를 remote client로 사용 가능한 노드
        1. croess cluster : 원격 cluster간 백업/검색 등을 하는 작업
    3. Machine Learning Node
      1. ML역할
        1. ES로 ML작업 시 필요

Data

  • Data를 적재/연산하는 Node
    • node.data=true를 설정에 삽입해주면 된다.
    • 부하 분배를 위해 Master과 분리하는 것을 권장
  • Content Datan Node
    • CRUD, 집계 등의 기능을 가짐
      • 기본적인 Data
이름 압축 성능 비고
Hot Data Node 4 1 사용 빈도가 많고 및 성능이 우선이기 때문에 SSD 권장
Warm Data Node 3 2 Hot보다 적은 빈도로 조회하는 노드, HDD권장
Cold Data Node 2 3 읽기 빈도가 적은 인덱스, 읽기 전용
Frozen Data Node 1 4 Shared_cache 옵션만으로 마운트 된 검색 가능한 Snapshot 을 저장

Ingest

  • Text 변환 및 전처리 담당.
  • Ingest pipeline을 Text에 적용하여 인덱싱 하기 전에 사용
    • indexing 이전에 Document를 변환하는 작업
  • Master Node에서 수행하는 Ingest를 대신 수행
    • Master Node의 부하 분산
    • 색인 작업이 많을경우 사용

Coordinating Only

  • Client와 통신만 하는 역할
    • Load Balancing 수행
    • 만약 Coordinate Node가 없으면 Datanode가 해당 역할 수행
    • 너무 많으면 서버에 부하
    • 발생
      • Coordinating Only 또한 Master Node가 알림을 기다리기 때문
    1. client의 cluster관련 요청을 Master Node에 전달
    2. client의 Data관련 요청을 data Node에 전달

Server

물리적 서버에는 N개이 Node를 사용할 수 있다.

  • Server 기준 Port
  • Node - Client
    • Port범위 : 9200 ~9299
    • 순차적으로 부여
  • Node - Node
    • Port 범위 : 9300 ~ 9399
    • 순차적으로 부여
  • Cluster 묶기
    • cluster.name을 동일한 이름으로 묶어준다
      • 이름이 다르면 같은 Network여도 논리적으로 분리됨
    • Cluster : 1개의 시스템이라고 보면됨.
      • 데이터가 공유되는 서버의 묶음

Index

  • Document의 집단
  • Index는 색인과 명칭과 혼동될 수 있어 Indices라고도 부른다.
  • 주로 REST API를 통해 CRUD 작업 수행
  • 실질적으로 Index는 Shard를 가리키는 논리적 Namespace
  • index는 1+N개의 Shard로 구성
  • Mapping 및 State 정보를 Cluster State에 저장
    • Mapping : Index 내부의 Document가 어떻게 저장될지 정의하는 것
      • Index별 설정 가능
    • cluster State : 정보를 추적하는 내부 데이터 구조
      • 분산된 Node간 데이터 일관성을 위해 Single-Thread로 업데이트
      • Single-Thread이기 때문에 규모가 커지면 성능 저하

Shard

  • Cluster 내의 데이터를 분산 저장하기 위한 단위
  • Lucine Index( Inverted Index / 역색인 )이다.
    • Inverted Index : Key : value 가 아닌 value : key
    • 속도 / 메모리 측면에서 좋다
      • Update 시 reindex을 해야해서 Cost가 증가한다.
  • Index는 N개의 Primary/Replica Shard로 구성된다.
    • Replica : Failover을 위해 사용하는 것이 좋다
      • 너무 많아지면 성능 저하됨
      • replica 또한 write를 하기 때문
  • Shard 추가 시 Reindex를 해줘야한다.
    • segment가 정렬되어 있기 때문
  • 설정
    • Failover을 위해 50GB 이상의 Shard는 권장하지 않는다.
    • Heap은 최대 32GB를 권장
      • System Memory / 2를 권장한다.
      • 32GB를 넘기면 32bit -> 64bit으로 변경되기 때문
    • Heap 1GB당 최대 20개의 Shard를 넘기지 않는 것이 좋다.
    • Shard가 작으면 작은 Segment가 생성된다.
    • 용양 및 설정 출처

Segment

  • 문서의 빠른 검색을 위해 설계된 자료구조
  • N개의 Segment로 Shard를 구성한다.
  • 데이터 색인 시 메모리상에 존재하다, Segment에 기록하여 검색 가능한 Segment 생성
  • Shard에서 검색 시 Segment를 순차 검색 후 결과를 Shard에 전달
    • segment가 많아지면 검색 속도 저하
    • 순차 검색 및 오버헤드 발생
  • update/delete 시 삭제 표기 후 다른 포인터 지칭
    • 데이터는 지연 삭제
  • 특정 주기/ 용양 임계치에 다다르면 데이터 정리 및 병합
    • 이 과정에 실질적 데이터 삭제
    • Merge은 새로운 Segment를 생성하는 것
      • 많은 Resource 소요
      • 부하가 적을 때 수행하는 것을 권장
        • Optimize API를 사용하여 수행

개인적으로 공부한 내용 포스팅 중
잘못된 정보는 지적해주시면 좋겠습니다!

+ Recent posts