Elasticsearch 설치

개요

Lucene은 인덱스 사이즈가 크고 압축 효율이 낮으며 시스템이 무겁고 느리다는 단점이 있지만 그럼에도 불구하고 es, solr등 좋은 엔진을 기반으로 성공적으로 안착.

  1. es의 분산 시스템 scale-out 확장 구조
  2. 다양한 생태계(구글/네이버/카카오가 갖지 못한 오픈소스의 장점)
  3. REST를 넘어(solr도 REST는 지원) Query DSL 지원, 5.0부터 Aggregation API 대폭 강화.
  4. Kibana 엔진 운영 및 시각화, Logstash 데이터 파이프라인 표준화, 전체 플랫폼 아키텍처 설계에 큰 기여를 한다.
    • 로그스태시의 진면목은 인덱싱 성능을 최적화하기 위한 배치 처리와 병렬 처리가 가능하며, 영속적인 큐를 사용해 현재 처리 중인 이벤트의 최소 1회 전송 보장, 유동적인 처리 방식으로 수집 데이터양이 급증하는 부하 상황에서도 안정성을 보장한다. (p42, 엘라스틱 스택 개발부터 운영까지)

구글이나 빙 수준의 hyper-scale이 아닌 이상 편의 기능이 뛰어난 es가 좋은 선택이다. 이외 C++로 구현하고 속도가 빠른 Typesense, SaaS만 제공되는 Angolia, Rust로 구현했지만 멀티 노드가 아직 지원되지 않는 MeiliSearch가 있다.

설치

설치 표준화를 위해 docker를 기준으로 설치한다.

  • elasticsearch의 Dockerfile
    ubuntu 20.04 기반
  • kibana의 Dockerfile
    centos 8 기반. es는 apt, kibana는 yum 이므로 유의
  • enterprise search는 오픈소스가 아니다. dockerfile도 공개되어 있지 않음. 컨테이너 내부에는 jruby와 rails로 구성한 흔적이 있다.

docker-compose로 es, kibana, ent search를 모두 구동하면 편리하다. Elasticsearch는 한 번 더 wrapping 해서 설정과 플러그인을 관리하도록 한다.

version: '3'

services:
  elasticsearch:
    image: elasticsearch
    environment:
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms1200m -Xmx1200m  # Heap size is important to start properly.
      # - xpack.security.enabled=false  # Disable security warning message.
      - xpack.security.enabled=true
      - xpack.security.authc.api_key.enabled=true
      - ELASTIC_PASSWORD=XXXX2f3d94
    volumes:
      - ~/elastic-data:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic

  enterprisesearch:
    image: docker.elastic.co/enterprise-search/enterprise-search:7.16.2
    depends_on:
      - elasticsearch
    environment:
      - JAVA_OPTS=-Xms512m -Xmx512m  # Heap size is important to start properly.
      - elasticsearch.username=elastic
      - elasticsearch.password=XXXX2f3d94
      - elasticsearch.host=http://elasticsearch:9200
      - allow_es_settings_modification=true
      - secret_management.encryption_keys=[XXXX2f3d948018d651fc4061727840cbf_64BIT]
      - ent_search.external_url=http://XX.compute.amazonaws.com:3002
    ports:
      - 3002:3002
    networks:
      - elastic

  kibana:
    image: docker.elastic.co/kibana/kibana:7.16.2
    depends_on:
      - elasticsearch
      - enterprisesearch
    ports:
      - 5601:5601
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
      - ENTERPRISESEARCH_HOST=http://enterprisesearch:3002
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=XXXX2f3d94
    networks:
      - elastic

networks:
  elastic:
    driver: bridge
  • heap 사이즈를 늘려주지 않으면 macOS에서 ent search가 동작하지 않는다. 한동안 고생했다. 마찬가지로 es도 heap 사이즈를 조절하지 않으면 동작이 느려져서 동일하게 ent search가 접속을 못했다. 비슷한 질문이 딱 하나만 있고 다른 사례가 보이지 않는걸로 봐서 아마 macOS에서 리소스 제한(내 경우 1 CPU, 2G 메모리)으로 사용할 경우 발생하는 문제로 보인다.
    • seunjeon을 설치할 경우 512m에서 out of memory 발생. 최종적으로 1200m으로 설정.
  • xpack.security.enabled=false로 설정하면 Dev Tools에서 보안 경고가 뜨지 않는다.
    • 하지만 ent search는 인증을 거치지 않으면 콘솔의 Manage > Documents에서 로그인 창이 뜨고 보이지 않는다. kibana에서도 ent에 연결되지 않는다(추가 확인 필요).
    • 인증이 추가된 es는 유저 정보를 추가해야 한다.
      $ curl -u elastic:XXXX http://localhost:9200
      
  • ent search가 localhost로 redirect 되는 문제가 있어 다음과 같이 설정을 추가했으나 반영되지 않았다.
    ent_search.external_url: http://XX.compute.amazonaws.com:3002
    

    다른 설정과 동일하게 :=로 변경 후 반영됐다. 원래 반영이 되어야 하는데, 다른 설정과 달라서 인지 띄어쓰기 때문인지 원인 확인 필요.

백그라운드 구동과 로그 조회는 다음과 같이 했다.

docker-compose up -d

CID=`docker ps | grep enterprisesearch | awk '{print $1}'`
docker logs -f $CID | gnomon

시스템 및 비용

ent search가 es에 붙는데, 맥북에서 80초가 걸렸고, ec2 c6i.large에서 33초가 걸렸다. 약 3배 더 빠르다. 서울 리전에서 가격은 다음과 같다.

Type Instance Pricing
EC2 c6i.large(compute optimized) $0.096
EC2 m6g.large $0.094
OpenSearch m6g.large $0.156(사실상 OpenSearch 중에는 가장 저렴)
OpenSearch r6g.large(memory optimized) $0.203
Elastic Cloud 40 GB storage / 4 GB RAM / Up to 4.3 vCPU (2 zones, General purpose, AWS Seoul) $0.308(실제 청구금액, 사이트 상에는 $0.533로 표시되는데 사용하지 않아서 낮은 금액이 청구된건지 확인 필요)
Elastic Cloud 10 GB storage / 1 GB RAM (Autoscale) $0.057 / $0.191 (2 zones / Platinum default)

Elastic Cloud는 신용카드 없이 가능하며 가입하면 14일간 묻지도 않고 무료 생성 가능. AWS Marketplace에서 subscribe하면 비용이 AWS 계정으로 통합 청구도 가능하다. GCP는 리셀러 통한 구매는 되지 않는다며 subscribe 되지 않음.

Elastic이 Swiftype을 2017년에 인수하고 2018년 5월, 이를 기반으로 Elastic App Search을 출시했다. 그리고 Elastic Enterprise Search 제품군으로 통합됐다. 운영툴이 거의 동일하다. optimized relevance for search use cases, typo-tolerance, relevance tuning등을 제공한다. relevance score가 기존 es와 다르고, 파라미터를 보여주진 않는다. Site Search는 crawler가 포함되어 있고, Workspace Search는 slack, teams 같은 내부 자산을 검색한다.

분산환경

분산환경에서는 이론상 데이터의 크기가 무한대로 늘어날 수 있기 때문에 많은 고민이 필요하다. 분산환경, 정확도, 실시간성 세 가 지 요소가 CAP theorem처럼 동작한다.

색인

6.x 부터 멀티 타입 허용하지 않음. 인덱스는 단일 타입. 서로 다른 타입에서 동일 문서를 만들 수 있어 의도치 않은 검색 결과가 나타날 수 있기 때문.

네트워크

서로 통신하기 위해 사용자 정의 bridge 네트워크 생성. 컨테이너의 name server는 컨테이너 내에서 다음과 같이 조회할 수 있다.

$ cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

컨테이너에 docker inspect 5a21533841b9를 해보면 networks 정보 중에 host aliases가 보인다.

"Networks": {
    "dir-name_elastic": {
        "Aliases": [
            "dir-name_elasticsearch_1",
            "elasticsearch",
            "5a21533841b9"
        ],

Last Modified: 2022/01/20 12:43:53

is a collection of Papers I have written.
© 2000 - Sang-Kil Park Except where otherwise noted, content on this site is licensed under a CC BY 4.0.
This site design was brought from Distill.