[Elasticsearch] 도커 컴포즈를 사용하여 엘라스틱 사용
이번 포스팅은 도커 컨테이너를 사용하여
엘라스틱 서버를 구성하고 사용하는 포스팅으로
공식문서를 기반으로 작성되었습니다.
[ 엘라스틱 스택 관련 도커 이미지는 아래를 참고 ]
[ Single node 엘라스틱 ]
엘라스틱 이미지 다운
엘라스틱 최신 버전 이미지를 pull
$ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.7.1
엘라스틱 도커 실행
엘라스틱 6.x 버전과 달리 7.x 버전에서는 싱글 노드로 실행 시 추가 옵션을 지정해야 함
"discovery.type=single-node"로 지정해줘야 bootstrap fail 없이 실행할 수 있음
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.7.1
도커 실행 확인
위 명령어 실행 시 아래와 같은 로그들이 출력되면서 엘라스틱이 실행
엘라스틱 접속 확인
실제 localhost:9200에 접속하면 아래와 같이 엘라스틱 클러스터가 실행된 것을 확인 가능
[ Multi node 엘라스틱 ]
3개의 노드를 가진 엘라스틱 클러스터를 도커 위에 띄우고, 실행시키기 위해 docker compose 파일 생성
Docker Compose 용어 정리
1. version
- 파일 규격 버전
- 규격에 따라 지원 내용이 다르기 때문에 자세한 내용은 아래 링크 참고
- docs.docker.com/compose/compose-file/compose-versioning/
2. services
- 컨테이너 정의 (=container)
3. image
- 베이스로 사용할 도커 이미지
4. environment
-e 옵션에 해당하는 내용으로 엘라스틱 환경 설정
> node.name : 노드 이름
> cluster.name : 클러스터명 (클러스터명을 기준으로 노드가 join 한다)
> discovery.seed_hosts: 디스커버리 설정, 클러스터를 구성할 노드에 대한 정의
> cluster.initial_master_node : 마스터로 선출될 후보 노드 초기 세팅 (node.name 참조)
> bootstrap.memory_lock : 엘라스틱이 사용할 메모리 Lock
> ES_JAVA_OPTS : jvm이 사용 가능한 힙 사이즈 결정
5. ulimits
- 프로세스 자원 한도 설정
> memlock : 메모리 내 주소 공간의 최대 크기 (soft: 기본 적용 값, hard: soft에서 최대로 늘릴 한도)
6. volumes
- 공유 볼륨 설정
7. port
- 공유할 포트 설정 (로컬 포트:컨테이너 포트)
8. networks
하나의 네트워크로 통신하기 위해 현재 elastic으로 모두 지정
> driver : bridge, host, container, none 이렇게 4개가 존재함 (default는 bridge)
docker-compose.yml 파일
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.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.7.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.7.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
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
> 위 컴포즈 파일은 3개의 노드를 가진 엘라스터 클러스터를 구성한다. es01은 localhost:9200을 listen 하고 있고, es02와 es03은 도커 네트워크를 통해 es01과 커뮤니케이션을 한다.
> 이 구성은 모든 네트워크 인터페이스에서 9200 포트를 열어줘야 한다. 이것을 리눅스에서 조정하는 방법은 iptables로 직접 조정해야 한다. 이것은 엘라스틱 클러스터는 공개적으로 접속이 가능하고, 잠재적으로 firewall 세팅을 무시하는 것을 의미한다. 만약 9200 포트를 오픈하고 싶지 않다면 reverse proxy를 사용하면 된다. docker-compose.yml 파일에서 9200:9200 이 부분을 127.0.0.1:9200:9200로 변경해주면, 오직 호스트 머신만 엘라스틱에 접근할 수 있다.
> 도커를 재시작해도 데이터가 유지되도록 하기 위해 data01, data02, data03이라는 이름을 가진 공유 볼륨에 노드의 데이터를 저장한다. 그 폴더들이 로컬에 존재하지 않을 경우 doker-compose는 클러스터 생성 시 함께 생성해준다.
도커 컴포즈 실행
$ docker-compose up
> 도커 엔진에 적어도 4 GIB 이상의 메모리가 할당된다
> 위 명령어 실행 시 아래와 같은 로그를 확인
클러스터 실행 확인
$ curl -X GET "localhost:9200/_cat/nodes?v&pretty"
> 위 curl 명령어를 사용하여 현재 노드의 상태를 확인할 수 있다
클러스터 종료
$ docker-compose down
# data volumes도 함께 삭제하고 싶은 경우
$ docker-compose down -v
> 클러스터 종료 시에는 위 명령어를 사용
> data volumes (공유 볼륨)의 데이터도 삭제하고 싶을 경우 -v 옵션을 추가로 설정한다
Trouble Shooting
"Bootstrap checks failed : max virtual memory areas vm.max_map_count [65530] is too low,
increase to at least [262144]"
> 가상 메모리가 너무 작아서 최소한 262144로 늘려야 한다는 에러
해결방안 1. 영구적으로 변경
$ vi /etc/sysctl.conf
vm.max_map_count=262144
해결방안 2. 임시 적용
sysctl -w vm.max_map_count=262144
해결 방안 2개 중에 하나를 적용 한 뒤, docker-compose up을 다시 한다.
Question & Answer
Q. 도커 컴포즈를 중단해도 공유 볼륨에 데이터가 저장되어서, 데이터가 보존된다고 하는데 로컬 어디에 저장되어 있는가?
A. 도커의 볼륨 저장소에 존재 (/var/lib/docker/volumes)
Process..
1) 생성된 도커 컨테이너 확인
$ docker inspect [컨테이너이름:es01 or es02 or es03]
2) 출력된 정보 중 Mounts 확인
> 여기서 Source는 로컬에 저장되는 경로
> Destination은 도커 컨테이너 속 데이터 경로
3) 실제로 보존하는지 확인
- "index_test" Index 및 Document 생성
curl -X POST "localhost:9200/index_test/_doc/?pretty" -H 'Content-Type: application/json' -d'
{
"user" : "testuser",
"post_date" : "2020-06-17T14:12:12",
"message" : "trying out Elasticsearch"
}
'
- 도커 컴포즈 종료 및 재 실행
$ docker-compose down
$ docker-compose up
- 재 시작 후 데이터 확인
# 인덱스 확인
curl -X GET "localhost:9200/index_test?pretty"
- 데이터 보존 확인 완료
[ Multi node 엘라스틱 with 키바나]
위에서 생성한 docker-compose.yml을 기반으로 kibana 컨테이너 구성 추가
docker-compose.yml (Full)
version: '2.2'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.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.7.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
ports:
- 9201:9201
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.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
ports:
- 9202:9202
networks:
- elastic
kib01:
image: docker.elastic.co/kibana/kibana:7.7.1
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
docker-compose.yml (Only Kibana)
version: '2.2'
services:
kib01:
image: docker.elastic.co/kibana/kibana:7.7.1
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- elastic
> image : 키바나 공식 이미지 사용 (엘라스틱과 버전 동일)
> ports : 포트 포워딩을 위한 포트 지정 (기본 포트 5601)
> environments : 엘라스틱에 연결하기 위한 URL과 HOST 지정
> networks : 다른 엘라스틱 컨테이너와 동일 한 네트워크 설정
도커 컴포즈 실행 및 노드 확인
$ docker-compose up
$ curl -X GET "localhost:9200/_cat/nodes?v&pretty"
키바나 접속
http://localhost:5601
> 로컬 호스트의 키바나 기본 포트인 5601로 접속
< 키바나 접속 화면 >
< 엘라스틱 생성된 인덱스 확인>