티스토리 뷰

SW 개발

CentOS 7, Elasticsearch 6 설치하기

지단로보트 2019. 8. 10. 13:29

개요

  • Elasticsearch는 풀텍스트 검색엔진이다. Elasticsearch 저장소를 적절히 이용하면 애플리케이션에서 굉장히 빠른 속도의 텍스트 검색을 실현할 수 있다. 광범위한 쓰임새 덕에 오픈 소스 로그 관제 솔루션인 Graylog의 경우 전용 로그 저장소로 사용하기도 한다.

Elasticsearch 6 설치

  • 아래는 CentOS 7Elasticsearch 6를 설치하는 방법이다.
### 운영체제 업데이트
$ sudo yum -y update

### Zulu OpenJDK 8 설치
$ sudo rpm --import http://repos.azulsystems.com/RPM-GPG-KEY-azulsystems
$ sudo curl -o /etc/yum.repos.d/zulu.repo http://repos.azulsystems.com/rhel/zulu.repo
$ sudo yum -y install zulu-8
$ sudo bash -c 'echo "export JAVA_HOME=/usr/lib/jvm/zulu-8" >> /etc/environment'
$ sudo bash -c 'echo "export JRE_HOME=/usr/lib/jvm/zulu-8/jre" >> /etc/environment'

### Elasticsearch 6 설치
$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
$ sudo touch /etc/yum.repos.d/elasticsearc-6.repo
$ sudo bash -c 'echo "[elasticsearch-6.x]" >> /etc/yum.repos.d/elasticsearc-6.repo'
$ sudo bash -c 'echo "name=Elasticsearch repository for 6.x packages" >> /etc/yum.repos.d/elasticsearc-6.repo'
$ sudo bash -c 'echo "baseurl=https://artifacts.elastic.co/packages/6.x/yum" >> /etc/yum.repos.d/elasticsearc-6.repo'
$ sudo bash -c 'echo "gpgcheck=1" >> /etc/yum.repos.d/elasticsearc-6.repo'
$ sudo bash -c 'echo "gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch" >> /etc/yum.repos.d/elasticsearc-6.repo'
$ sudo bash -c 'echo "enabled=1" >> /etc/yum.repos.d/elasticsearc-6.repo'
$ sudo bash -c 'echo "autorefresh=1" >> /etc/yum.repos.d/elasticsearc-6.repo'
$ sudo bash -c 'echo "type=rpm-md" >> /etc/yum.repos.d/elasticsearc-6.repo'
$ sudo yum -y install elasticsearch

### 환경 설정
$ sudo vi /etc/elasticsearch/elasticsearch.yml
### 내부망에 연결된 모든 노드로부터의 원격 접속을 허용
### 개발 및 테스트 환경에서만 사용, 운영 환경에서는 보안 문제로 비추천
network.host: 0.0.0.0
### Graylog 로그 저장소로 사용할 경우 설정
cluster.name: graylog

### Elasticsearch 6 방화벽 개방
$ sudo firewall-cmd --permanent --add-port=9200/tcp
$ sudo firewall-cmd --permanent --add-port=9300/tcp
$ sudo firewall-cmd --reload

### Elasticsearch 6 실행
$ sudo systemctl daemon-reload
$ sudo systemctl enable elasticsearch
$ sudo systemctl start elasticsearch

Elasticsearch 6 실행 확인

### 서비스 포트 상태 확인
$ nmap -p 9200 localhost
PORT     STATE SERVICE
9200/tcp open  wap-wsp

$ curl -X GET http://localhost:9200
{
  "name" : "hknorBD",
  "cluster_name" : "graylog",
  "cluster_uuid" : "pyGNtEQnTtO33KsOVgYPaQ",
  "version" : {
    "number" : "6.8.2",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "b506955",
    "build_date" : "2019-07-24T15:24:41.545295Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

인스턴스 최적화

  • ElasticsearchCPU보다 RAM 할당량이 중요한 저장소이다. 어떤 설정도 하지 않을 경우 최대 1GB 크기의 힙 영역을 사용한다. 공식 문서에서는 전체 시스템 메모리의 50%를 이 크기에 할당하라고 권장하고 있다. 운영 환경에서는 대개 2 Core, 64GB RAM 이상의 노드에 32GB를 힙 영역에 할당하는 것을 권장하는 편이다. [관련 링크]
### Elasticsearch의 JVM 옵션을 설정
$ sudo nano /etc/elasticsearch/jvm.options
-Xms2g
-Xmx2g

### Elasticsearch 6 재시작
$ sudo systemctl restart elasticsearch

데이터 디렉토리 변경

  • 각 노드가 가진 인덱스 및 샤드 데이터는 기본 값으로 /var/lib/elasticsearch 디렉토리에 저장되며 변경을 원한 경우 path.data를 변경하여 수정할 수 있다. [관련 링크]
### 현재 데이터 디렉토리 확인
$ curl -X GET "http://localhost:9200/_nodes/settings?pretty=true"

### 새 데이터 디렉토리 소유자 변경
$ sudo chown -R elasticsearch:elasticsearch /foo/bar

### 새 데이터 디렉토리 변경
$ sudo nano /etc/elasticsearch/elasticsearch.yml
path.data: /foo/bar

### Elasticsearch 6 재시작
$ sudo systemctl restart elasticsearch

트러블슈팅

  • 서비스 기동시 /var/log/elasticsearch 디렉토리에 올라오는 로그를 확인하면 아래와 같은 오류와 함께 기동이 되지 않는 현상이 발생할 수 있다.
[2] bootstrap checks failed
[1]: max number of threads [1024] for user [elasticsearch] is too low, increase to at least [4096]
[2]: system call filters failed to install; check the logs and fix your configuration or disable system call filters at your own risk
  • 아래와 같이 수정하면 정상 기동된다.
$ sudo vi /etc/security/limits.conf
elasticsearch hard nofile 65536
elasticsearch soft nofile 65536
elasticsearch hard nproc 65536
elasticsearch soft nproc 65536
  • 두번째 이슈로는 서비스 기동시 아래와 같은 경고가 발생할 수 있다.
[2019-10-01T17:23:45,615][WARN ][o.e.b.JNANatives         ] [unknown] unable to install syscall filter: 
java.lang.UnsupportedOperationException: seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER compiled in
    at org.elasticsearch.bootstrap.SystemCallFilter.linuxImpl(SystemCallFilter.java:329) ~[elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.SystemCallFilter.init(SystemCallFilter.java:617) ~[elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.JNANatives.tryInstallSystemCallFilter(JNANatives.java:260) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.Natives.tryInstallSystemCallFilter(Natives.java:113) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:108) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:170) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:333) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:159) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:150) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:124) [elasticsearch-cli-6.8.3.jar:6.8.3]
    at org.elasticsearch.cli.Command.main(Command.java:90) [elasticsearch-cli-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:116) [elasticsearch-6.8.3.jar:6.8.3]
    at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:93) [elasticsearch-6.8.3.jar:6.8.3]
  • 아래와 같이 수정하면 경고가 사라진다.
$ sudo vi /etc/elasticsearch/elasticsearch.yml
bootstrap.system_call_filter: false

트러블슈팅: 디스크 용량 부족

  • 데이터 저장시 아래와 같은 오류가 발생하는 경우가 있다.
{"type":"cluster_block_exception","reason":"blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];"}
  • 원인은 디스크의 용량 부족으로 인해 Elasticsearch에 의해 해당 인덱스가 읽기 전용으로 전환된 것이다. [관련 링크] 먼저 디스크 용량 확인 후 전체 디스크 용량의 5% 이상을 확보하도록 조치한다. 조치 후에는 읽기 전용으로 전환된 인덱스 정책을 아래와 같이 다시 해제한다.
### 읽기 전용으로 설정된 인덱스 정책을 쓰기 가능으로 재전환
$ curl -X PUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'
{"acknowledged":true}
댓글
댓글쓰기 폼