본문으로 바로가기

Elasticsearch 설치

category Back-end 2019.03.14 00:09

설치 방법

아래 내용은 CentOS 6 기준

1. Docker 설치

sudo yum install docker-io

설치 후 docker가 실행 중인지 확인

service docker status

실행중이 아니면 다음 명령어로 실행

service docker start

docker 컨테이너 로그 관리
컨테이너에서 표준 출력으로 표시하는 로그는 컨테이너 로그로 관리되며 docker logs 명령어로 확인할 수 있음
컨테이너 로그는 아래 경로에 기록되며 로그 크기가 계속 커질수 있으니 logrotate 설정을 추가해 줌
/var/lib/docker/containers/{container_id}/{container_id}.log

logrotate 설정

vi /etc/logrotate.d/docker-containers

1 2 3 4 5 6 7 8 9 10 /var/lib/docker/containers/*/*.log { rotate 5 daily compress dateext missingok notifempty delaycompress copytruncate }

2. elasticsearch 폴더 및 설정 파일 생성

elasticsearch 폴더 생성

cd /home/madosa/app
mkdir elasticsearch
cd elasticsearch
mkdir config data logs

config 폴더에 설정 파일 생성

cd config
touch elasticsearch.yml jvm.options log4j2.properties  

그룹 변경

그룹은 0(root)으로 변경

cd  /home/madosa/app/elasticsearch
sudo chgrp -R 0 ./*

공식 문서에는 컨테이너 내부에서 사용하는 elasticsearch 유저의 uid:gid가 1000:1000 이며 호스트 폴더나 파일의 그룹을 1000번이나 0번으로 변경하라고 나와 있으나 1000번으로 변경하면 권한 오류 발생

설정 파일 내용 

vi elasticsearch.yml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 cluster.name: 클러스터 이름 설정 node.name: ${HOSTNAME} bootstrap.memory_lock: true # docker network를 bridge 방식으로 사용하는 경우 publish 호스트는 서버 IP로 지정 network.host: _eth0_, _local_ network.publish_host: 10.30.0.20 # discovery 방식은 multicast와 unicast 지원, 기본값 unicast discovery.zen.ping.unicast.hosts:  - 10.30.0.20 # - 추가되는 노드 IP # 노드가 여러개인 경우 설정(total number of master-eligible nodes / 2 + 1) #discovery.zen.minimum_master_nodes: 2 # CentOS 6 버전 커널에서 지원하지 않아서 비활성화 bootstrap.system_call_filter: false

노드가 추가되는 경우 discovery.zen.ping.unicast.hosts, discovery.zen.minimum_master_nodes 설정을 변경
Loopback 으로 호스트를 지정하면 개발모드로 동작하며 Bootstrap 체크를 통과하지 않아도 됨(기본값)
운영 시에는 bind 또는 publish 호스트를 지정하게 되면 Bootstrap 체크를 반드시 통과해야 됨

vi jvm.options

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 ## JVM configuration ################################################################ ## IMPORTANT: JVM heap size ################################################################ ## ## You should always set the min and max JVM heap ## size to the same value. For example, to set ## the heap to 4 GB, set: ## ## -Xms4g ## -Xmx4g ## ## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html ## for more information ## ################################################################ # Xms represents the initial size of total heap space # Xmx represents the maximum size of total heap space -Xms1g -Xmx1g ################################################################ ## Expert settings ################################################################ ## ## All settings below this section are considered ## expert settings. Don't tamper with them unless ## you understand what you are doing ## ################################################################ ## GC configuration -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly ## optimizations # pre-touch memory pages used by the JVM during initialization -XX:+AlwaysPreTouch ## basic # explicitly set the stack size -Xss1m # set to headless, just in case -Djava.awt.headless=true # ensure UTF-8 encoding by default (e.g. filenames) -Dfile.encoding=UTF-8 # use our provided JNA always versus the system one -Djna.nosys=true # turn off a JDK optimization that throws away stack traces for common # exceptions because stack traces are important for debugging -XX:-OmitStackTraceInFastThrow # flags to configure Netty -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 # log4j 2 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=${ES_TMPDIR} ## heap dumps # generate a heap dump when an allocation from the Java heap fails # heap dumps are created in the working directory of the JVM -XX:+HeapDumpOnOutOfMemoryError # specify an alternative path for heap dumps # ensure the directory exists and has sufficient space -XX:HeapDumpPath=/var/lib/elasticsearch ## JDK 8 GC logging 8:-XX:+PrintGCDetails 8:-XX:+PrintGCDateStamps 8:-XX:+PrintTenuringDistribution 8:-XX:+PrintGCApplicationStoppedTime 8:-Xloggc:/var/log/elasticsearch/gc.log 8:-XX:+UseGCLogFileRotation 8:-XX:NumberOfGCLogFiles=32 8:-XX:GCLogFileSize=64m # JDK 9+ GC logging 9-:-Xlog:gc*,gc+age=trace,safepoint:file=/var/log/elasticsearch/gc.log:utctime,pid,tags:filecount=32,filesize=64m # due to internationalization enhancements in JDK 9 Elasticsearch need to set the provider to COMPAT otherwise # time/date parsing will break in an incompatible way for some date patterns and locals 9-:-Djava.locale.providers=COMPAT

vi log4j2.properties

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 status = error # log action execution errors for easier debugging logger.action.name = org.elasticsearch.action logger.action.level = debug appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%m%n appender.rolling.type = RollingFile appender.rolling.name = rolling appender.rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}.log appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n appender.rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}-%d{yyyy-MM-dd}-%i.log.gz appender.rolling.policies.type = Policies appender.rolling.policies.time.type = TimeBasedTriggeringPolicy appender.rolling.policies.time.interval = 1 appender.rolling.policies.time.modulate = true appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size = 128MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.fileIndex = nomax appender.rolling.strategy.action.type = Delete appender.rolling.strategy.action.basepath = ${sys:es.logs.base_path} appender.rolling.strategy.action.condition.type = IfFileName appender.rolling.strategy.action.condition.glob = ${sys:es.logs.cluster_name}-* appender.rolling.strategy.action.condition.nested_condition.type = IfAccumulatedFileSize appender.rolling.strategy.action.condition.nested_condition.exceeds = 2GB rootLogger.level = info rootLogger.appenderRef.console.ref = console rootLogger.appenderRef.rolling.ref = rolling appender.deprecation_rolling.type = RollingFile appender.deprecation_rolling.name = deprecation_rolling appender.deprecation_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation.log appender.deprecation_rolling.layout.type = PatternLayout appender.deprecation_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c{1.}] %marker%.-10000m%n appender.deprecation_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_deprecation-%i.log.gz appender.deprecation_rolling.policies.type = Policies appender.deprecation_rolling.policies.size.type = SizeBasedTriggeringPolicy appender.deprecation_rolling.policies.size.size = 1GB appender.deprecation_rolling.strategy.type = DefaultRolloverStrategy appender.deprecation_rolling.strategy.max = 4 logger.deprecation.name = org.elasticsearch.deprecation logger.deprecation.level = warn logger.deprecation.appenderRef.deprecation_rolling.ref = deprecation_rolling logger.deprecation.additivity = false appender.index_search_slowlog_rolling.type = RollingFile appender.index_search_slowlog_rolling.name = index_search_slowlog_rolling appender.index_search_slowlog_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_search_slowlog.log appender.index_search_slowlog_rolling.layout.type = PatternLayout appender.index_search_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n appender.index_search_slowlog_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_search_slowlog-%d{yyyy-MM-dd}.log appender.index_search_slowlog_rolling.policies.type = Policies appender.index_search_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy appender.index_search_slowlog_rolling.policies.time.interval = 1 appender.index_search_slowlog_rolling.policies.time.modulate = true logger.index_search_slowlog_rolling.name = index.search.slowlog logger.index_search_slowlog_rolling.level = trace logger.index_search_slowlog_rolling.appenderRef.index_search_slowlog_rolling.ref = index_search_slowlog_rolling logger.index_search_slowlog_rolling.additivity = false appender.index_indexing_slowlog_rolling.type = RollingFile appender.index_indexing_slowlog_rolling.name = index_indexing_slowlog_rolling appender.index_indexing_slowlog_rolling.fileName = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_indexing_slowlog.log appender.index_indexing_slowlog_rolling.layout.type = PatternLayout appender.index_indexing_slowlog_rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %marker%.-10000m%n appender.index_indexing_slowlog_rolling.filePattern = ${sys:es.logs.base_path}${sys:file.separator}${sys:es.logs.cluster_name}_index_indexing_slowlog-%d{yyyy-MM-dd}.log appender.index_indexing_slowlog_rolling.policies.type = Policies appender.index_indexing_slowlog_rolling.policies.time.type = TimeBasedTriggeringPolicy appender.index_indexing_slowlog_rolling.policies.time.interval = 1 appender.index_indexing_slowlog_rolling.policies.time.modulate = true logger.index_indexing_slowlog.name = index.indexing.slowlog.index logger.index_indexing_slowlog.level = trace logger.index_indexing_slowlog.appenderRef.index_indexing_slowlog_rolling.ref = index_indexing_slowlog_rolling logger.index_indexing_slowlog.additivity = false

서버 설정 추가

sudo vi /etc/sysctl.conf

1 2 ... vm.max_map_count=262144

바로 적용

sysctl -w vm.max_map_count=262144

기타 ulimit 설정은 컨테이너 생성 시 적용

3. ES 노드 컨테이너 생성

sudo docker create --ulimit nofile=65536:65536 --ulimit nproc=4096:4096 -p 9200:9200 -p 9300:9300 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" --ulimit memlock=-1:-1 -v /home/madosa/app/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/madosa/app/elasticsearch/config/jvm.options:/usr/share/elasticsearch/config/jvm.options -v /home/madosa/app/elasticsearch/config/log4j2.properties:/usr/share/elasticsearch/config/log4j2.properties -v /home/madosa/app/elasticsearch/data:/usr/share/elasticsearch/data -v /home/madosa/app/elasticsearch/logs:/usr/share/elasticsearch/logs -h es_oss_node1 --name es_oss_node1 docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4

4. ES 컨테이너 실행

sudo docker start es_oss_node1

로그 확인

sudo docker logs -f es_oss_node1
또는
tail -f  /home/madosa/app/elasticsearch/logs/클러스터이름.log

5. kibana 폴더 및 설정 파일 생성

kibana 폴더 생성

cd /home/madosa/app
mkdir kibana
cd kibana
mkdir config

설정 파일에 다음 내용 입력

cd config
vi kibana.yml

1 2 3 4 5 6 7 --- # Default Kibana configuration from kibana-docker. server.name: kibana server.host: "0" elasticsearch.url: http://10.30.0.20:9200

6. Kibana 컨테이너 생성

sudo docker create -m=1g -p 5601:5601 -v /home/madosa/app/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml -h kibana_oss --name kibana_oss docker.elastic.co/kibana/kibana-oss:6.2.4

7. Kibana 컨테이너 실행

sudo docker start kibana_oss 

로그 확인

docker logs -f kibana_oss

 

참고사항

노드 역할

Master-eligible : 마스터가 될 수 있는 노드, 클러스터 컨트롤

Data: 데이터 보유 및 데이터 관련 작업 수행

Ingest: 인덱싱 전 문서 변환 등을 수행하는 ingest pipeline 적용

Tribe: 클러스터 간 검색 및 작업

Coordinating node

검색 등 요청 시 데이터를 보유중인 노드에 작업을 전달하고 결과를 모으는 역할
Kibana에서 운영 환경의 클러스터 노드에 작업 분산 하기 위해서는 kibana가 설치된 서버에 Coordinating only node를  설정해서 사용

노드 통신

HTTP : 클라이언트와 REST 통신(port : 9200)

Transport : 노드 간 통신(port : 9300)

라이센스

https://www.elastic.co/subscriptions

X-Pack 기능에 대한 라이센스로 보면 될 것 같음

모니터링 및 보안 관련 기능 제공

기본 라이센스는 무료지만 매년 갱신 필요하며 제공 기능이 많지 않음


댓글을 달아 주세요

대마도사 블로그
블로그 이미지 대마도사 님의 블로그
MENU
VISITOR 오늘15 / 전체12,225