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 up과 Scale out을 고려하게 되었습니다.
다음 문서는 Docker부터 Docker-Compose까지의 설치 및 서비스 실행까지의 과정을 정리한 문서입니다.
Ubuntu 환경 Docker 설치
Docker를 설치하기 위하여 인스턴스 GCP 18.04 ubuntu Compute Engine 생성.
본인은 e3.medium 2 core 4gb ram 옵션으로 생성했음.
Docker 설치
- APT 패키지 최신으로 업데이트
sudo apt-get update
- Debian용 Docker 필수 패키지 설치.
한번에 여러가지 패키지 설치
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg2 \
software-properties-common
- 키 링에 GPG 키 추가.
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
GPG란?
GNU Privacy Guard의 약어로 RSA 알고리즘을 통한 우편 암호화 도구
- 키 지문이 일치하는지 확인
sudo apt-key fingerprint 0EBFCD88
- 저장소 운영 체제 목록에 추가
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
- APT 패키지 색인이 최신 상태인지 확인
sudo apt-get update
- Docker 엔진 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
- Docker 실행 테스트
sudo service docker start
sudo docker run hello-world
- docker 실행 확인 방법
sudo systemctl status docker
sudo 없이 docker 쓰기
ubuntu 계정을 쓸 때 docker group에 포함시키면 sudo 없이 사용할 수 있다.
- 현재 유저에서 group정보 확인하는 법
groups ubuntu #유저명
- 현재 계정 docker group 포함 시키기
sudo usermod -aG docker ${USER}
- root 계정 접속 했다가 다시 ubuntu로 접속하기
sudo su - # 루트 계정으로 접속
su - ubuntu # 다시 원래 계정으로 로그인
- group 체크
groups ubuntu
Docker Compose 설치
- 도커 컴포츠 최신버전 설치
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를 안붙이더라..
- 컴포즈 권한 설정
- docker-compose 버전 확인
docker-compose --version
docker-compose -v
shared memory 용량 넓히기
본인은 e3.medium 서버이므로 4기가 램 메모리 중 절반인 2gb만 /dev/shm 을 사용하고 있음.
사이즈 오류가 생길까봐 하는 설정.
- 도커 컴포즈 shm_size 설정
df -h
- vi docker-compose.yml 작성
web:
build:
context: .
dockerfile: Dockerfile
shm_size: '30gb'
Docker compose와 함께 Elastic사용
- docker-compose.yml 작성
docker-compose.yml 파일은 실행할 docker 컨테이너의 옵션을 미리 정리해둔 파일이라고 볼 수 있다.
- version: compose version임. docker engine 버전에 따라 적절하게 해줘야함. 본인은 가장 최신 버전 사용
3
으로만 적으면 3.x대의 최신 버전을 쓰겠다는 뜻- Compose file versions and upgrading
- 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
- GCP 9200 port 열음
- docker compose 실행
docker-compose up
- 클러스터 실행 확인
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
정보 확인
'Infra > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 엘라스틱서치 운영 준비 (0) | 2022.10.13 |
---|---|
[Elasticsearch] 엘라스틱서치 설치 (0) | 2022.10.12 |
[Elasticsearch] 엘라스틱서치의 기본 (0) | 2022.10.11 |
[Elasticsearch] 엘라스틱서치의 역사 (0) | 2022.10.10 |