Infra/Elasticsearch

[Elasticsearch] Ubuntu, Docker-compose를 이용한 Elasticsearch 환경 구성

DuL2 2022. 10. 12. 16:21

Ubuntu Docker 를 이용한 Elasticsearch 환경 구성

 당신의 신문 프로젝트를 진행하면서 최초에는 Docker에 Elasticsearch 및 kibana 컨테이너를 올려 환경을 구성하려 했었고, docker-compose를 통하여 구글 클라우드 플랫폼에 e3.medium(2 core, 4gb ram)의 환경으로 es node 3개 및 kibana를 올렸습니다. 다만, 미숙한 실력과 운영상의 문제가 있다고 판단하였고, 빠른 프로젝트 진행을 위해 직접 ES를 설치하여 진행하는 방식으로 선택했습니다.

 

 또한, 이 문서 마지막에서 보이듯 작은 인스턴스에 많은 양의 node를 올림으로서 Elasticsearch 사에서 추천하는 최소 권장 사양을 하드웨어 스펙이 제공하지 못하므로 서비스의 원활한 운영이 힘들다고 판단했습니다. 예로는 다음과 같습니다.

  • 최소 권장 사양인 jvm heap memory 는 1gb로 각 노드마다 주었지만, jvm에 할당하는 메모리 값만큼 os에도 주어야 합니다. 즉, idle 상태로 80%에 해당하는 메모리를 사용했습니다. 그로 인해 Bulk Insert 시 병목 현상이 생겼고, socket timeout이 빈번하게 발생하였습니다.

  • 이 현상을 경험함으로써 서비스 구현을 위한 최소한의 메모리 보장은 해주어야 프로젝트를 완료한 후에도 서비스의 정상 작동이 가능하다고 판단하고 서버의 Scale upScale out을 고려하게 되었습니다.

 

다음 문서는 Docker부터 Docker-Compose까지의 설치 및 서비스 실행까지의 과정을 정리한 문서입니다.

Ubuntu 환경 Docker 설치

Docker를 설치하기 위하여 인스턴스 GCP 18.04 ubuntu Compute Engine 생성.

본인은 e3.medium 2 core 4gb ram 옵션으로 생성했음.

Docker 설치

  1. APT 패키지 최신으로 업데이트
sudo apt-get update

  1. Debian용 Docker 필수 패키지 설치.

한번에 여러가지 패키지 설치

sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common

  1. 키 링에 GPG 키 추가.
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

GPG란?
GNU Privacy Guard의 약어로 RSA 알고리즘을 통한 우편 암호화 도구

  1. 키 지문이 일치하는지 확인
    sudo apt-key fingerprint 0EBFCD88

  1. 저장소 운영 체제 목록에 추가
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"

 

Err 에러가 뜰 경우
debian이 아닌 ubuntu 사용해보기
https://download.docker.com/linux/ubuntu

  1. APT 패키지 색인이 최신 상태인지 확인
    sudo apt-get update
  1. Docker 엔진 설치
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Install On Ubuntu

  1. Docker 실행 테스트
 sudo service docker start
 sudo docker run hello-world

  1. docker 실행 확인 방법
sudo systemctl status docker

sudo 없이 docker 쓰기

ubuntu 계정을 쓸 때 docker group에 포함시키면 sudo 없이 사용할 수 있다.

  1. 현재 유저에서 group정보 확인하는 법
groups ubuntu #유저명
  1. 현재 계정 docker group 포함 시키기
sudo usermod -aG docker ${USER}
  1. root 계정 접속 했다가 다시 ubuntu로 접속하기
sudo su - # 루트 계정으로 접속
su - ubuntu # 다시 원래 계정으로 로그인
  1. group 체크
groups ubuntu 

 

Docker Compose 설치

  1. 도커 컴포츠 최신버전 설치
sudo curl -L "https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

최신버전 확인은 아래 github에서

https://github.com/docker/compose/releases

version에 v까지 넣지 않아서 생긴 오류..
몇 시간을 고생함...
1.24.0 버전 1점대는 v를 안붙이더라..

  1. 컴포즈 권한 설정

  1. docker-compose 버전 확인
docker-compose --version
docker-compose -v

shared memory 용량 넓히기

본인은 e3.medium 서버이므로 4기가 램 메모리 중 절반인 2gb만 /dev/shm 을 사용하고 있음.

사이즈 오류가 생길까봐 하는 설정. 

  1. 도커 컴포즈 shm_size 설정
df -h

  1. vi docker-compose.yml 작성
web:
  build:
    context: .
    dockerfile: Dockerfile
  shm_size: '30gb'

Docker compose와 함께 Elastic사용

  1. docker-compose.yml 작성

docker-compose.yml 파일은 실행할 docker 컨테이너의 옵션을 미리 정리해둔 파일이라고 볼 수 있다.

  • version: compose version임. docker engine 버전에 따라 적절하게 해줘야함. 본인은 가장 최신 버전 사용
  • services: 실행하려는 항목을 정리
  • image: docker image file 정의
  • container_name: 컨테이너 이름 정의
  • environment: 환경 변수들을 정의할 수 있습니다.
    • 엘라스틱서치 클러스터링을 위한 노드 구성 변수들을 입력했습니다.
    • 추후 xPack을 활용한 시큐리티 관련 설정도 할 수 있습니다.

설정에 대한 설명.

  • 3개의 노드(es01, es02, es03)를 가진 엘라스틱서치 클러스터를 구성하며 kib01이라는 이름의 키바나가 존재한다.
  • es01은 localhost:9200을 바라보고 있으며 es02와 es03은 Docker 네트워크 elastic을 통해 bridge 옵션으로 커뮤니케이션을 한다.
  • 9200 포트를 열어 공개적으로 접속이 가능하며 firewall 세팅을 무시하는 상태이다.
  • 만약 9200 포트를 오픈하고 싶지 않다면 reverse proxy를 사용한다.
    • 9200:9200 부분을 -> 127.0.0.1:9200:9200으로 변경하면 호스트 머신만 접근 가능하게 변경할 수 있다.
  • 도커를 재시작해도 데이터가 유지되도록 하기 위해 data01~4를 공유 볼륨에 저장하며 폴더 존재하지 않는경우 자동으로 생성한다.
version: '3'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic
  kib01:
      image: docker.elastic.co/kibana/kibana:7.10.1
      container_name: kib01
#      depends_on: {"es01": {"condition": "service_healthy"}}
      ports:
        - 5601:5601
      environment:
#        SERVERNAME: localhost
        ELASTICSEARCH_URL: http://es01:9200
        ELASTICSEARCH_HOSTS: http://es01:9200
#        ELASTICSEARCH_USERNAME: kibana_system
#        ELASTICSEARCH_PASSWORD: CHANGEME
#      volumes:
#      - data04:/usr/share/elasticsearch/data
      networks:
        - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local
  data04:
    driver: local

networks:
  elastic:
    driver: bridge
  1. GCP 9200 port 열음

  1. docker compose 실행
docker-compose up

  1. 클러스터 실행 확인
curl -X GET "localhost:9200/_cat/nodes?v&pretty"

Docker-compose 켜진 상태에서 instance 점유율

메모리가 4gb 밖에 안되서 idle인데도 80%를 사용중.

 

url 설정 관련 간단 이슈 (트러블 슈팅)

기존에 kibana를 붙이기 위해서 docker-compose.yml 파일을 다음과 같이 설정하여 사용했는데 kibana가 es에 못붙는 현상이 생김.
기존 설정은 다음과 같음.

        ELASTICSEARCH_URL: https://es01:9200
        ELASTICSEARCH_HOSTS: https://es01:9200

SSL/TLS 설정을 안했기에 https로 접속이 불가능하여 생긴 것이었기에 다음과 같이 변경하였더니 잘 작동함. 실수로 설정해놓았던 것이 문제였음.

        ELASTICSEARCH_URL: http://es01:9200
        ELASTICSEARCH_HOSTS: http://es01:9200

docker volume 확인하기

docker inspect [컨테이너이름:es01 or es02 or es03]

데이터 중 Mounts 정보 확인