Elasticsearch를 올려놓은 서버가 swap 메모리를 풀로 다 쓰는 문제가 발생했다. 메모리가 부족할 경우 디스크의 일정 부분을 메모리처럼 사용하는 Swap 메모리는 성능저하를 일으킬 수 있다. 찾아보니 설정없이 Elasticsearch를 실행하면 swap 메모리를 사용하므로 swap off 설정을 진행하며 발생한 이슈 해결과정을 정리한다.


  1. bootstrap.memory_lock 설정 활성화

    $ vi {elasticsearch_path}/config/elasticsearch.yml 
    
    # 아래와 같이 수정한다.
    # ----------------------------------- Memory -----------------------------------
    #
    # Lock the memory on startup:
    #
    bootstrap.memory_lock: true
    #
    # Make sure that the heap size is set to about half the memory available
    # on the system and that the owner of the process is allowed to use this
    # limit.
    #
    # Elasticsearch performs poorly when the system is swapping the memory.
    #

bootstrap.memory_lock 설정을 활성화한 후 elasticsearch를 실행하였는데 아래와 같은 로그를 남기며 elasticsearch가 정상적으로 구동하지 않는 문제가 발생했다.

[2020-05-11T13:51:29,683][WARN ][o.e.b.JNANatives         ] [server] This can result in part of the JVM being swapped out.
[2020-05-11T13:51:29,683][WARN ][o.e.b.JNANatives         ] [server] Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536
[2020-05-11T13:51:29,683][WARN ][o.e.b.JNANatives         ] [server] These can be adjusted by modifying /etc/security/limits.conf, for example:
    # allow user 'user' mlockall
    user soft memlock unlimited
    user hard memlock unlimited
...
...
[2020-05-11T15:00:31,219][ERROR][o.e.b.Bootstrap          ] [server] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked
[2020-05-11T15:00:31,221][INFO ][o.e.n.Node               ] [server] stopping ...
[2020-05-11T15:00:31,272][INFO ][o.e.n.Node               ] [server] stopped
[2020-05-11T15:00:31,272][INFO ][o.e.n.Node               ] [server] closing ...
[2020-05-11T15:00:31,287][INFO ][o.e.n.Node               ] [server] closed

위와 같은 로그를 남기며 정상적으로 실행이 안된다. 이때 아래의 절차를 수행한다.

  1. user의 메모리 락 제한 없애기
    위의 로그에서 나온 allow user 'user' mlockall 에서 user 부분의 사용자 이름에 대해 메모리락 제한을 없애준다.

    $ sudo vi /etc/security/limits.conf
    
    #<domain>      <type>  <item>         <value>
    
    #ftp             hard    nproc           0
    #@student        -       maxlogins       4
    
    user            soft     memlock         unlimited
    user            hard     memlock         unlimited
    # 아래처럼 한 줄로 변경해도 가능하다.
    # user            -        memlock         unlimited 
    # End of file

해당 설정 후 elasticsearch를 실행했을 때 똑같은 에러가 발생하였다.
이러한 문제는 현재 로그인 세션에서는 limits.conf 설정값이 정상적으로 반영되지 않아서 똑같은 이슈가 발생하는 것이다.

$ ulimit -l
unlimited

위와 같은 결과가 나오지 않으면 해당 세션을 종료 후 다시 서버에 접속한다. 이후에 다시 ulimit 설정값을 확인 후 unlimited 값이 정상적으로 나오면 elasticsearch를 실행시킨다.

반응형

'Dev > ElasticSearch' 카테고리의 다른 글

[ElasticSearch] ElasticSearch 설치 및 config 확인  (0) 2017.08.16

참고

Elasticsearch는 JVM 기반으로 자바가 깔려 있어야 한다.

설치하고자 하는 elasticsearch 버전에 맞는 java 버전이 다르므로 확인을 한 후(https://www.elastic.co/support/matrix) 아래의 과정을 진행하길 바란다.

본인의 환경은 java version "1.8.0_144" 와 현재 기준(2017-10-07) 최신 버전인 elasticsearch-5.6.2   kibana-5.6.2 버전을 다운받아 사용하였다.



Elasticsearch 홈페이지에서 본인의 Java 버전과 OS에 맞는 elasticsearch 다운로드 파일을 설치한다.(https://www.elastic.co/kr/downloads/elasticsearch)

압축 파일의 다운로드가 완료되면 압축을 풀어준다.


압축을 풀어주게 되면 아래와 같은 항복들이 폴더에 존재한다. 

이 중에서 config 폴더 내의 세가지 설정 파일들을 확인하려 한다.

먼저 jvm.options 파일의 내용을 확인해보면


위와 같다. 이 파일은 elasticsearch가 실행되는 자바 가상 머신의 환경을 설정해주는 파일이다. 자바 가상 머신의 환경에 따라서 elasticsearch의 성능이 많이 영향을 미치게 되는데 대표적으로 JVM이 필요로 하는 데이터를 올려놓는 메모리 공간의 크기를 나타내는 heap space size가 있다. Elasticsearch에서는 32GB 이하로 minimum 사이즈와 maximum 사이즈를 동일하게 설정하도록 권장한다. (자세한 설명은 https://www.elastic.co/blog/a-heap-of-trouble#fn5)


elasticsearch는 실행 로그를 log4j 2로 남긴다. 실행로그와 관련된 설정을 하기 위한 파일이 log4j2.properties 파일이다.

log4j2.properties 파일 내에서 ${sys:es.logs.base_path} 는 로그파일이 저장되는 경로를 의미하고 ${sys:es.logs.cluster_name} 은 클러스터의 이름이며 로그파일명의 앞부분에 해당되고  ${sys:es.logs.node_name}  은 노드의 이름이다. (https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html#logging)


마지막으로 elasticsearch.yml 파일에 elasticsearch의 주요 환경 설정이 있다.


처음 elasticsearch를 설치하였을 때는 모든 설정이 주석처리가 되어 있다. 

Cluster

- cluster.name은 elasticsearch의 시스템 전체를 구분지어 주는 이름이므로 주석을 지워주고 반드시 바꿔주는 것이 좋다. 이 때 콜론(:) 뒤에는 반드시 공백이 존재해야 한다.

Node

- 실행된 하나의 elasticsearch 프로세스를 한 노드라고 하고 각 노드들이 연결된 전체 시스템을 elasticsearch 클러스터라고 한다. 노드는 엘라스틱서치가 실행될 때 임의로 설정이 되는데 특정 이름으로 설정하고 싶으면 주석을 지워주고 콜론(")안에 설정하고자 하는 이름을 넣어주면 된다.

Paths

- 데이터의 저장 경로와 로그파일의 저장 경로를 설정해줄 수 있다. 위의 log4j2.properties 파일에서 사용되는 저장경로에 대한 설정이 가능하다.

Memory 

- bootstrap.memory_lock의 주석을 지우고 true로 사용하게 되면 JVM에서 elasticsearch가 점유하는 메모리를 고정시키게 된다. 앞의 jvm.options 파일에서 힙사이즈의 최대 최소를 동일하게 설정해주고 true 옵션 설정을 통해 elasticsearch에서 메모리가 부족하지 않도록 방지할 수 있으므로 이 옵션은 true로 설정되도록 추천된다. Elasticsearch가 설치된 시스템의 너무 많은 메모리를 차지하지 않도록 전체 시스템 메모리의 50%가 넘지 않도록 설정하는 것이 안정적이다.

Network

- Network 호스트를 지정해주지 않으면 기본적으로 localhost로 지정이 된다. Node가 localhost로 실행이 되면 개발자 모드로 실행이 되어 bootstrap을 확인하지 않고 실행이 빠르게 된다. Network 호스트를 설정을 해주게 되면 클러스터링 준비를 하여 시작단계에서 다양한 체크를 하게 되어 실행이 더 느려진다. Elasticsearch는 기본적으로 REST API를 사용하기 위해 9200~9299 범위의 HTTP 통신 포트를 사용하게 되고 같은 서버에서 새로운 엘라스틱 서치 노드를 실행하면 이전 노드의 포트번호에 1이 더해진 포트번호가 설정된다. 하나의 elasticserach 노드가 다른 노드와 바인딩 되어 데이터를 교환할 때는 9300~9399 범위의 HTTP 통신 포트를 사용한다.


Elasticsearch의 설치 및 환경 설정이 끝나면 Elasticsearch 파일을 설치한 폴더에서 bin/elasticsearch 명령어를 통해 Elasticsearch를 실행할 수 있다.


반응형

'Dev > ElasticSearch' 카테고리의 다른 글

[ElasticSearch] Swap off 설정  (0) 2020.05.12

+ Recent posts