웹사이트 검색

Ubuntu 14.04에서 프로덕션 Elasticsearch 클러스터를 설정하는 방법


소개

Elasticsearch는 실시간 분산 검색 및 데이터 분석에 사용되는 인기 있는 오픈 소스 검색 서버입니다. 개발 이외의 용도로 사용될 때 Elasticsearch는 최고의 성능, 안정성 및 확장성을 위해 여러 서버에 클러스터로 배포되어야 합니다.

이 튜토리얼은 클라우드 서버 환경에서 Ubuntu 14.04에 프로덕션 Elasticsearch 클러스터를 설치하고 구성하는 방법을 보여줍니다.

Elasticsearch 클러스터를 수동으로 설정하는 것이 학습에 유용하지만 모든 클러스터 설정에서 구성 관리 도구를 사용하는 것이 좋습니다. Ansible을 사용하여 Elasticsearch 클러스터를 배포하려면 Ansible을 사용하여 프로덕션 Elasticsearch 클러스터를 설정하는 방법 자습서를 따르십시오.

전제 조건

Elasticsearch 클러스터에는 최소 3개의 마스터 적격 노드가 있어야 하므로 이 자습서를 완료하려면 최소 3개의 Ubuntu 14.04 서버가 있어야 합니다. 전용 마스터 및 데이터 노드를 사용하려면 마스터 노드용 서버 3개 이상과 데이터 노드용 추가 서버가 필요합니다.

대신 CentOS를 사용하려면 CentOS 7에서 프로덕션 Elasticsearch 클러스터를 설정하는 방법 튜토리얼을 확인하십시오.

가정

이 튜토리얼에서는 서버가 Ansible 및 Tinc VPN을 사용하여 서버 인프라를 보호하는 방법에 설명된 것과 같은 VPN을 사용하고 있다고 가정합니다. 이렇게 하면 서버가 사용하는 물리적 네트워크에 관계없이 사설 네트워크 기능이 제공됩니다.

공유 개인 네트워크를 사용하는 경우 VPN을 사용하여 무단 액세스로부터 Elasticsearch를 보호해야 합니다. Elasticsearch에는 HTTP 인터페이스에 보안 기능이 내장되어 있지 않기 때문에 각 서버는 동일한 사설 네트워크에 있어야 합니다. 개인 네트워크는 신뢰하지 않는 컴퓨터와 공유해서는 안 됩니다.

서버의 VPN IP 주소를 vpn_ip라고 합니다. 또한 위에 링크된 자습서에 설명된 대로 모두 "tun0\이라는 VPN 인터페이스가 있다고 가정합니다.

자바 8 설치

Elasticsearch에는 Java가 필요하므로 지금 설치하겠습니다. Elasticsearch에서 권장하는 최신 버전의 Oracle Java 8을 설치하겠습니다. 그러나 해당 경로로 이동하기로 결정한 경우 OpenJDK에서 제대로 작동해야 합니다.

모든 Elasticsearch 서버에서 이 단계를 완료하십시오.

apt에 Oracle Java PPA를 추가합니다.

  1. sudo add-apt-repository -y ppa:webupd8team/java

적절한 패키지 데이터베이스를 업데이트하십시오.

  1. sudo apt-get update

다음 명령을 사용하여 안정적인 최신 버전의 Oracle Java 8을 설치하고 표시되는 라이선스 계약에 동의합니다.

  1. sudo apt-get -y install oracle-java8-installer

모든 Elasticsearch 서버에서 이 단계를 반복해야 합니다.

이제 Java 8이 설치되었으므로 ElasticSearch를 설치해 보겠습니다.

Elasticsearch 설치

Elastic의 패키지 소스 목록을 추가하여 패키지 관리자와 함께 Elasticsearch를 설치할 수 있습니다. 모든 Elasticsearch 서버에서 이 단계를 완료하십시오.

다음 명령을 실행하여 Elasticsearch 공개 GPG 키를 apt로 가져옵니다.

  1. wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

프롬프트가 계속 표시된다면 사용자의 비밀번호를 기다리고 있는 것일 수 있습니다( sudo 명령을 승인하기 위해). 이 경우 비밀번호를 입력하십시오.

Elasticsearch 소스 목록을 생성합니다.

  1. echo "deb http://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list

적절한 패키지 데이터베이스를 업데이트하십시오.

  1. sudo apt-get update

다음 명령으로 Elasticsearch를 설치합니다.

  1. sudo apt-get -y install elasticsearch

모든 Elasticsearch 서버에서 이 단계를 반복해야 합니다.

이제 Elasticsearch가 설치되었지만 사용하기 전에 구성해야 합니다.

Elasticsearch 클러스터 구성

이제 Elasticsearch 구성을 편집할 차례입니다. 모든 Elasticsearch 서버에서 다음 단계를 완료하십시오.

편집을 위해 Elasticsearch 구성 파일을 엽니다.

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

다음 섹션에서는 구성을 수정해야 하는 방법을 설명합니다.

VPN IP 주소 또는 인터페이스에 바인딩

Elasticsearch 인스턴스에 대한 외부 액세스를 제한하여 외부인이 HTTP API를 통해 데이터에 액세스하거나 Elasticsearch 클러스터를 종료할 수 없도록 해야 합니다. 즉, 사설 네트워크(VPN)의 서버에만 액세스할 수 있도록 Elasticsearch를 구성해야 합니다. 이렇게 하려면 VPN IP 주소 vpn_ip 또는 인터페이스 "tun0\에 바인딩하도록 각 노드를 구성해야 합니다.

network.host를 지정하는 줄을 찾아 주석을 제거하고 해당 값을 해당 서버의 VPN IP 주소(예: node01의 경우 10.0.0.1) 또는 인터페이스 이름으로 바꿉니다. 모든 서버에서 VPN 인터페이스의 이름이 "tun0\이기 때문에 모든 서버를 같은 줄로 구성할 수 있습니다.

network.host: [_tun0_, _local_]

모든 루프백 장치에서도 수신 대기하도록 Elasticsearch를 구성하는 "_local_” 추가에 유의하십시오. 이렇게 하면 localhost에 요청을 보내 각 서버에서 로컬로 Elasticsearch HTTP API를 사용할 수 있습니다. 이것을 포함하지 않으면 Elasticsearch는 VPN IP 주소에 대한 요청에만 응답합니다.

경고: Elasticsearch에는 보안 기능이 내장되어 있지 않기 때문에 이를 제어하거나 신뢰하지 않는 서버에 액세스할 수 있는 IP 주소로 설정하지 않는 것이 매우 중요합니다. Elasticsearch를 공용 또는 공유 사설 네트워크 IP 주소에 바인딩하지 마십시오!

클러스터 이름 설정

다음으로 Elasticsearch 노드가 클러스터에 가입하고 구성할 수 있도록 클러스터 이름을 설정합니다. 네트워크 내에서 고유한 설명이 포함된 이름을 사용하는 것이 좋습니다.

cluster.name을 지정하는 줄을 찾아 주석 처리를 제거하고 해당 값을 원하는 클러스터 이름으로 바꿉니다. 이 자습서에서는 클러스터 이름을 "production\으로 지정합니다.

cluster.name: production

노드 이름 설정

다음으로 각 노드의 이름을 설정합니다. 클러스터 내에서 고유한 설명이 포함된 이름이어야 합니다.

node.name을 지정하는 줄을 찾아 주석 처리를 제거하고 해당 값을 원하는 노드 이름으로 바꿉니다. 이 튜토리얼에서는 &#36 {HOSTNAME} 환경 변수를 사용하여 각 노드 이름을 서버의 호스트 이름으로 설정합니다.

node.name: ${HOSTNAME}

원하는 경우 노드 이름을 수동으로 지정할 수 있지만 고유한 이름을 지정해야 합니다. 노드 이름을 임의로 지정해도 괜찮다면 node.name을 주석 처리된 상태로 둘 수도 있습니다.

검색 호스트 설정

다음으로 클러스터를 검색하고 구성하기 위해 연결할 노드의 초기 목록을 구성해야 합니다. 이는 유니캐스트 네트워크에서 필요합니다.

discovery.zen.ping.unicast.hosts를 지정하는 줄을 찾아 주석 처리를 제거합니다. 해당 값을 다른 모든 노드의 VPN IP 주소 또는 호스트 이름(VPN IP 주소로 확인됨)의 문자열 배열로 바꿉니다.

예를 들어 각각의 VPN IP 주소가 10.0.0.1node01, node02node03이 있는 경우 >, 10.0.0.210.0.0.3인 경우 다음 행을 사용할 수 있습니다.

discovery.zen.ping.unicast.hosts: ["10.0.0.1", "10.0.0.2", "10.0.0.3"]

또는 모든 서버가 DNS 또는 /etc/hosts를 통해 VPN IP 주소의 이름 기반 확인으로 구성된 경우 다음 행을 사용할 수 있습니다.

discovery.zen.ping.unicast.hosts: ["node01", "node02", "node03"]

참고: 필수 구성 요소 VPN 자습서의 Ansible Playbook은 각 VPN 서버의 인벤토리 호스트 이름(Ansible hosts 파일에 지정됨)을 확인하는 각 서버의 /etc/hosts 항목을 자동으로 생성합니다. VPN IP 주소.

저장 및 종료

이제 서버가 기본 Elasticsearch 클러스터를 형성하도록 구성되었습니다. 업데이트하고 싶은 설정이 더 있지만 클러스터가 작동하는지 확인한 후에 업데이트하겠습니다.

elasticsearch.yml을 저장하고 종료합니다.

Elasticsearch 시작

이제 Elasticsearch를 시작합니다.

  1. sudo service elasticsearch restart

그런 다음 이 명령을 실행하여 부팅 시 Elasticsearch를 시작합니다.

  1. sudo update-rc.d elasticsearch defaults 95 10

모든 Elasticsearch 서버에서 이 단계(Elasticsearch 클러스터 구성)를 반복해야 합니다.

클러스터 상태 확인

모든 것이 올바르게 구성되었으면 Elasticsearch 클러스터가 실행 중이어야 합니다. 계속 진행하기 전에 제대로 작동하는지 확인합시다. Elasticsearch 노드에서 Elasticsearch를 쿼리하여 그렇게 할 수 있습니다.

Elasticsearch 서버에서 다음 명령을 실행하여 클러스터 상태를 출력합니다.

  1. curl -XGET 'http://localhost:9200/_cluster/state?pretty'

"production\이라는 클러스터가 실행 중임을 나타내는 출력이 표시되어야 합니다. 또한 구성한 모든 노드가 구성원임을 나타내야 합니다.

Cluster State:
{ "cluster_name" : "production", "version" : 36, "state_uuid" : "MIkS5sk7TQCl31beb45kfQ", "master_node" : "k6k2UObVQ0S-IFoRLmDcvA", "blocks" : { }, "nodes" : { "Jx_YC2sTQY6ayACU43_i3Q" : { "name" : "node02", "transport_address" : "10.0.0.2:9300", "attributes" : { } }, "k6k2UObVQ0S-IFoRLmDcvA" : { "name" : "node01", "transport_address" : "10.0.0.1:9300", "attributes" : { } }, "kQgZZUXATkSpduZxNwHfYQ" : { "name" : "node03", "transport_address" : "10.0.0.3:9300", "attributes" : { } } }, ...

이와 유사한 출력이 표시되면 Elasticsearch 클러스터가 실행 중인 것입니다! 누락된 노드가 있으면 계속 진행하기 전에 해당 노드의 구성을 검토하십시오.

다음으로 Elasticsearch 클러스터에 대해 고려해야 할 몇 가지 구성 설정을 살펴보겠습니다.

메모리 잠금 활성화

Elastic은 성능과 안정성에 부정적인 영향을 미치기 때문에 어떤 대가를 치르더라도 Elasticsearch 프로세스를 교체하지 않을 것을 권장합니다. 과도한 스와핑을 피하는 한 가지 방법은 필요한 메모리를 잠그도록 Elasticsearch를 구성하는 것입니다.

모든 Elasticsearch 서버에서 이 단계를 완료하십시오.

Elasticsearch 구성을 편집합니다.

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

bootstrap.mlockall을 지정하는 줄을 찾아 주석 처리를 제거합니다.

bootstrap.mlockall: true

저장 및 종료.

다음으로 편집을 위해 /etc/default/elasticsearch 파일을 엽니다.

  1. sudo vi /etc/default/elasticsearch

먼저 ES_HEAP_SIZE를 찾아 주석 처리를 해제하고 사용 가능한 메모리의 약 50%로 설정합니다. 예를 들어, 여유 공간이 약 4GB인 경우 이를 2GB(2g)로 설정해야 합니다.

ES_HEAP_SIZE=2g

그런 다음 MAX_LOCKED_MEMORY=unlimited를 찾아 주석 처리를 해제합니다. 완료되면 다음과 같이 표시됩니다.

MAX_LOCKED_MEMORY=unlimited

저장 및 종료.

이제 Elasticsearch를 다시 시작하여 변경 사항을 적용합니다.

  1. sudo service elasticsearch restart

모든 Elasticsearch 서버에서 이 단계를 반복해야 합니다.

Mlockall 상태 확인

mlockall이 모든 Elasticsearch 노드에서 작동하는지 확인하려면 아무 노드에서나 다음 명령을 실행하십시오.

  1. curl http://localhost:9200/_nodes/process?pretty

각 노드에는 \mlockall\ : true라는 줄이 있어야 하며 이는 메모리 잠금이 활성화되어 작동 중임을 나타냅니다.

Nodes process output:
... "nodes" : { "kQgZZUXATkSpduZxNwHfYQ" : { "name" : "es03", "transport_address" : "10.0.0.3:9300", "host" : "10.0.0.3", "ip" : "10.0.0.3", "version" : "2.2.0", "build" : "8ff36d1", "http_address" : "10.0.0.3:9200", "process" : { "refresh_interval_in_millis" : 1000, "id" : 1650, "mlockall" : true } ...

노드에 대해 mlockall이 거짓이면 노드의 설정을 검토하고 Elasticsearch를 다시 시작하십시오. Elasticsearch가 시작되지 않는 일반적인 이유는 ES_HEAP_SIZE가 너무 높게 설정되었기 때문입니다.

열린 파일 설명자 제한 구성(선택 사항)

기본적으로 Elasticsearch 노드에는 64k의 "열린 파일 설명자 제한\이 있어야 합니다. 이 섹션에서는 이를 확인하는 방법과 원하는 경우 늘리는 방법을 보여줍니다.

최대 열린 파일 확인 방법

먼저 Elasticsearch 프로세스의 프로세스 ID(PID)를 찾습니다. 이를 수행하는 쉬운 방법은 ps 명령을 사용하여 elasticsearch 사용자에 속하는 모든 프로세스를 나열하는 것입니다.

  1. ps -u elasticsearch

다음과 같은 출력이 표시되어야 합니다. 첫 번째 열의 숫자는 Elasticsearch(java) 프로세스의 PID입니다.

Output:
PID TTY TIME CMD 11708 ? 00:00:10 java

그런 다음 이 명령을 실행하여 Elasticsearch 프로세스에 대한 열린 파일 제한을 표시합니다(강조 표시된 숫자를 이전 단계의 고유한 PID로 바꿉니다).

  1. cat /proc/11708/limits | grep 'Max open files'
Output
Max open files 65535 65535 files

두 번째 및 세 번째 열의 숫자는 각각 소프트 및 하드 제한을 64k(65535)로 나타냅니다. 이것은 많은 설정에 적합하지만 이 설정을 늘리는 것이 좋습니다.

최대 파일 설명자 제한을 늘리는 방법

Elasticsearch에서 열린 파일 디스크립터의 최대 수를 늘리려면 단일 설정을 변경하기만 하면 됩니다.

편집을 위해 /etc/default/elasticsearch 파일을 엽니다.

  1. sudo vi /etc/default/elasticsearch

MAX_OPEN_FILES를 찾아 주석 처리를 해제하고 원하는 제한으로 설정합니다. 예를 들어 설명자를 128k로 제한하려면 131070으로 변경합니다.

MAX_OPEN_FILES=131070

저장 및 종료.

이제 Elasticsearch를 다시 시작하여 변경 사항을 적용합니다.

  1. sudo service elasticsearch restart

그런 다음 이전 하위 섹션에 따라 제한이 증가했는지 확인하십시오.

더 높은 파일 설명자 제한이 필요한 Elasticsearch 서버에서 이 단계를 반복해야 합니다.

전용 마스터 및 데이터 노드 구성(선택 사항)

Elasticsearch 노드에는 마스터와 데이터라는 두 가지 일반적인 유형이 있습니다. 마스터 노드는 인덱스 관리 및 특정 데이터 샤드를 저장해야 하는 데이터 노드 결정과 같은 클러스터 전체 작업을 수행합니다. 데이터 노드는 인덱싱된 문서의 샤드를 보유하고 CRUD, 검색 및 집계 작업을 처리합니다. 일반적으로 데이터 노드는 상당한 양의 CPU, 메모리 및 I/O를 사용합니다.

기본적으로 모든 Elasticsearch 노드는 "마스터 적격\ 데이터 노드로 구성됩니다. 즉, 데이터를 저장하고 리소스 집약적인 작업을 수행하며 마스터 노드로 선택될 가능성이 있습니다. 소규모 클러스터의 경우, 그러나 대규모 Elasticsearch 클러스터는 집약적인 데이터 노드 작업으로 인해 마스터 노드의 안정성이 손상되지 않도록 전용 마스터 노드로 구성해야 합니다.

전용 마스터 노드 구성 방법

전용 마스터 노드를 구성하기 전에 클러스터에 마스터 적격 노드가 3개 이상 있는지 확인하십시오. 이는 네트워크 장애 시 데이터 불일치를 유발할 수 있는 분할 브레인 상황을 피하는 데 중요합니다.

전용 마스터 노드를 구성하려면 노드의 Elasticsearch 구성을 편집합니다.

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

다음 두 줄을 추가합니다.

node.master: true 
node.data: false

첫 번째 줄인 node.master: true는 노드가 마스터 자격이 있으며 실제로는 기본 설정임을 지정합니다. 두 번째 줄인 node.data: false는 노드가 데이터 노드가 되는 것을 제한합니다.

저장 및 종료.

이제 Elasticsearch 노드를 다시 시작하여 변경 사항을 적용합니다.

  1. sudo service elasticsearch restart

다른 전용 마스터 노드에서 이 단계를 반복해야 합니다.

curl -XGET http://localhost:9200/_cluster/state?pretty 명령을 사용하여 클러스터를 쿼리하여 전용 마스터 노드로 구성된 노드를 확인할 수 있습니다. data: falsemaster: true가 있는 모든 노드는 전용 마스터 노드입니다.

전용 데이터 노드를 구성하는 방법

전용 데이터 노드(마스터 자격이 없는 데이터 노드)를 구성하려면 노드의 Elasticsearch 구성을 편집합니다.

  1. sudo vi /etc/elasticsearch/elasticsearch.yml

다음 두 줄을 추가합니다.

node.master: false 
node.data: true

첫 번째 줄인 node.master: false는 노드가 마스터 자격이 없음을 지정합니다. 두 번째 줄인 node.data: true는 노드가 데이터 노드가 되도록 허용하는 기본 설정입니다.

저장 및 종료.

이제 Elasticsearch 노드를 다시 시작하여 변경 사항을 적용합니다.

  1. sudo service elasticsearch restart

다른 전용 데이터 노드에서 이 단계를 반복해야 합니다.

curl -XGET http://localhost:9200/_cluster/state?pretty 명령으로 클러스터를 쿼리하여 어떤 노드가 전용 데이터 노드로 구성되었는지 확인할 수 있습니다. master: false를 나열하고 data: false를 나열하지 않는 노드는 전용 데이터 노드입니다.

최소 마스터 노드 구성

Elasticsearch 클러스터를 실행할 때 클러스터가 정상적으로 작동하기 위해 실행해야 하는 마스터 적격 노드의 최소 수를 설정하는 것이 중요합니다. 이를 쿼럼이라고도 합니다. 이는 하나 이상의 노드가 클러스터의 나머지 부분에 대한 연결이 끊어지는 경우 데이터 일관성을 보장하여 "스플릿 브레인(split-brain)\ 상황을 방지합니다.

클러스터에 있어야 하는 최소 마스터 노드 수를 계산하려면 n/2 + 1을 계산합니다. 여기서 n은 클러스터에 있는 "마스터 적격\ 노드의 총 수입니다. 건강한 클러스터, 그런 다음 결과를 가장 가까운 정수로 반올림합니다. 예를 들어 3노드 클러스터의 경우 쿼럼은 2입니다.

참고: 마스터에 적합한 모든 데이터 노드(기본 설정)를 포함하여 쿼럼 계산에 마스터에 적합한 모든 노드를 포함해야 합니다.

최소 마스터 노드 설정은 Elasticsearch HTTP API를 통해 동적으로 설정할 수 있습니다. 이렇게 하려면 아무 노드에서나 다음 명령을 실행합니다(강조 표시된 숫자를 쿼럼으로 바꿉니다).

  1. curl -XPUT localhost:9200/_cluster/settings?pretty -d '{
  2. "persistent" : {
  3. "discovery.zen.minimum_master_nodes" : 2
  4. }
  5. }'
Output:
{ "acknowledged" : true, "persistent" : { "discovery" : { "zen" : { "minimum_master_nodes" : "2" } } }, "transient" : { } }

참고: 이 명령은 "영구\ 설정입니다. 즉, 최소 마스터 노드 설정이 전체 클러스터 재시작 후에도 유지되고 Elasticsearch 구성 파일을 재정의합니다. 또한 이 설정은 discovery.zen.minimum_master_nodes: 로 지정할 수 있습니다. 아직 동적으로 설정하지 않은 경우 /etc/elasticsearch.yml의 2.

나중에 이 설정을 확인하려면 다음 명령을 실행할 수 있습니다.

  1. curl -XGET localhost:9200/_cluster/settings?pretty

Elasticsearch에 액세스하는 방법

노드 중 하나에서 VPN IP 주소로 요청을 보내거나 튜토리얼에서 설명한 것처럼 노드 중 하나에서 localhost로 요청을 보내 Elasticsearch HTTP API에 액세스할 수 있습니다.

Elasticsearch 클러스터는 모든 노드의 VPN IP 주소를 통해 클라이언트 서버에 액세스할 수 있습니다. 즉, 클라이언트 서버도 VPN의 일부여야 합니다.

Kibana 또는 Logstash와 같이 클러스터에 연결해야 하는 다른 소프트웨어가 있는 경우 일반적으로 애플리케이션에 하나 이상의 Elasticsearch 노드의 VPN IP 주소를 제공하여 연결을 구성할 수 있습니다.

결론

Elasticsearch 클러스터는 정상 상태로 실행되고 몇 가지 기본 최적화로 구성되어야 합니다!

Elasticsearch에는 인덱스, 샤드 및 복제 설정과 같이 여기에서 다루지 않은 다른 많은 구성 옵션이 있습니다. 나중에 공식 문서와 함께 구성을 다시 방문하여 클러스터가 요구 사항을 충족하도록 구성되었는지 확인하는 것이 좋습니다.