웹사이트 검색

Ubuntu 14.04에서 Elasticsearch를 설치하고 구성하는 방법


소개

Elasticsearch는 데이터의 실시간 분산 검색 및 분석을 위한 플랫폼입니다. 그 인기는 사용 용이성, 강력한 기능 및 확장성 때문입니다.

Elasticsearch는 RESTful 작업을 지원합니다. 즉, HTTP URI(/collection/entry)와 함께 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 데이터를 조작할 수 있습니다. 직관적인 RESTful 접근 방식은 개발자와 사용자 모두에게 친숙하며 Elasticsearch가 인기 있는 이유 중 하나입니다.

Elasticsearch는 탄탄한 회사인 Elastic이 지원하는 무료 오픈 소스 소프트웨어입니다. 이 조합은 개인 테스트에서 기업 통합에 이르기까지 어디에서나 사용하기에 적합합니다.

이 기사에서는 Elasticsearch를 소개하고 이를 설치, 구성 및 사용하는 방법을 보여줍니다.

전제 조건

이 자습서를 따르기 전에 다음 전제 조건을 완료했는지 확인하십시오.

  • 우분투 14.04 물방울
  • 루트가 아닌 sudo 사용자. 자세한 내용은 Ubuntu 14.04의 초기 서버 설정을 확인하세요.

다른 언급이 없는 한 이 자습서에서 루트 권한이 필요한 모든 명령은 sudo 권한이 있는 비루트 사용자로 실행해야 합니다.

가정

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

DigitalOcean Private Networking과 같은 공유 사설 네트워크를 사용하는 경우 이 보안 기능은 동일한 지역의 동일한 팀 또는 계정에 있는 서버에 대해 이미 활성화되어 있습니다. 이는 HTTP 인터페이스에 보안 기능이 내장되어 있지 않기 때문에 Elasticsearch를 사용할 때 특히 중요합니다.

1단계 - 자바 설치

먼저 Elasticsearch가 Java 프로그래밍 언어로 작성되었기 때문에 Droplet에 JRE(Java Runtime Environment)가 필요합니다. Elasticsearch에는 Java 7 이상이 필요합니다. Elasticsearch는 Oracle JDK 버전 1.8.0_73을 권장하지만 JRE용 기본 Ubuntu OpenJDK 기본 패키지도 작동합니다.

이 단계에서는 두 버전을 설치하는 방법을 보여주므로 가장 적합한 버전을 결정할 수 있습니다.

OpenJDK 설치

JRE용 기본 Ubuntu OpenJDK 기본 패키지는 무료이며 잘 지원되며 Ubuntu APT 설치 관리자를 통해 자동으로 관리됩니다.

APT로 OpenJDK를 설치하기 전에 다음 명령을 실행하여 Ubuntu Droplet에 설치할 수 있는 패키지 목록을 업데이트하십시오.

  1. sudo apt-get update

그런 다음 다음 명령을 사용하여 OpenJDK를 설치할 수 있습니다.

  1. sudo apt-get install openjdk-7-jre

JRE가 설치되어 있고 사용할 수 있는지 확인하려면 다음 명령을 실행하십시오.

  1. java -version

결과는 다음과 같아야 합니다.

Output of java -version
java version "1.7.0_79" OpenJDK Runtime Environment (IcedTea 2.5.6) (7u79-2.5.6-0ubuntu1.14.04.1) OpenJDK 64-Bit Server VM (build 24.79-b02, mixed mode)

자바 8 설치

Elasticsearch를 사용하여 발전하고 더 나은 Java 성능과 호환성을 찾기 시작하면 Oracle의 독점 Java(Oracle JDK 8)를 설치하도록 선택할 수 있습니다.

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

마지막으로 설치되었는지 확인합니다.

  1. java -version

2단계 — Elasticsearch 다운로드 및 설치

Elasticsearch는 zip, tar.gz, deb 또는 rpm 패키지의 elastic.co에서 직접 다운로드할 수 있습니다. Ubuntu의 경우 Elasticsearch를 실행하는 데 필요한 모든 것을 설치하는 deb(Debian) 패키지를 사용하는 것이 가장 좋습니다.

이 글을 쓰는 시점에서 최신 Elasticsearch 버전은 1.7.2입니다. 다음 명령을 사용하여 선택한 디렉토리에 다운로드하십시오.

  1. wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.deb

그런 다음 다음과 같이 dpkg 명령을 사용하여 일반적인 Ubuntu 방식으로 설치합니다.

  1. sudo dpkg -i elasticsearch-1.7.2.deb

팁: Elasticsearch의 최신 릴리스 버전을 원하는 경우 elastic.co로 이동하여 링크를 찾은 다음 wget을 사용하여 Droplet에 다운로드하십시오. deb 패키지를 다운로드하십시오.

그러면 Elasticsearch가 /usr/share/elasticsearch/에 설치되고 구성 파일은 /etc/elasticsearch에 배치되고 초기화 스크립트는 /etc/에 추가됩니다. init.d/elasticsearch.

Elasticsearch가 Droplet으로 자동으로 시작 및 중지되도록 하려면 다음 명령을 사용하여 초기화 스크립트를 기본 런레벨에 추가하십시오.

  1. sudo update-rc.d elasticsearch defaults

3단계 — Elastic 구성

이제 Elasticsearch와 해당 Java 종속 항목이 설치되었으므로 Elasticsearch를 구성할 차례입니다.

Elasticsearch 구성 파일은 /etc/elasticsearch 디렉터리에 있습니다. 두 개의 파일이 있습니다.

  • elasticsearch.yml — Elasticsearch 서버 설정을 구성합니다. 이것은 로깅을 제외한 모든 옵션이 저장되는 곳이며, 이것이 우리가 이 파일에 가장 관심을 갖는 이유입니다.\n
  • logging.yml — 로깅을 위한 구성을 제공합니다. 처음에는 이 파일을 편집할 필요가 없습니다. 모든 기본 로깅 옵션을 그대로 둘 수 있습니다. 기본적으로 /var/log/elasticsearch에서 결과 로그를 찾을 수 있습니다.

Elasticsearch 서버에서 사용자 지정할 첫 번째 변수는 elasticsearch.ymlnode.namecluster.name입니다. 이름에서 알 수 있듯이 node.name은 서버(노드)의 이름과 노드가 연결된 클러스터를 지정합니다.

이 변수를 사용자 지정하지 않으면 Droplet 호스트 이름과 관련하여 node.name이 자동으로 할당됩니다. cluster.name은 자동으로 기본 클러스터의 이름으로 설정됩니다.

cluster.name 값은 Elasticsearch의 자동 검색 기능에서 Elasticsearch 노드를 자동으로 검색하고 클러스터에 연결하는 데 사용됩니다. 따라서 기본값을 변경하지 않으면 클러스터의 동일한 네트워크에서 원치 않는 노드가 발견될 수 있습니다.

기본 elasticsearch.yml 구성 파일 편집을 시작하려면:

  1. sudo nano /etc/elasticsearch/elasticsearch.yml

node.namecluster.name의 줄 시작 부분에서 # 문자를 제거하여 주석을 해제한 다음 해당 값을 변경합니다. /etc/elasticsearch/elasticsearch.yml 파일의 첫 번째 구성 변경은 다음과 같아야 합니다.

...
node.name: "My First Node"
cluster.name: mycluster1
...

또 다른 중요한 설정은 "마스터\ 또는 "슬레이브\가 될 수 있는 서버의 역할입니다. "마스터\는 클러스터 상태와 안정성을 담당합니다. 클러스터 노드가 많은 대규모 배포에서는 둘 이상의 전용 "마스터\를 두는 것이 좋습니다. 일반적으로 전용 "마스터\는 데이터를 저장하거나 인덱스를 생성하지 않습니다. 따라서 클러스터 상태가 위험에 처할 수 있는 과부하의 가능성이 없어야 합니다.

"노예\는 데이터 작업을 로드할 수 있는 "일꾼\으로 사용됩니다. "슬레이브\ 노드가 과부하되더라도 추가 로드를 수행할 다른 노드가 있는 경우 클러스터 상태에 심각한 영향을 미치지 않아야 합니다.

서버의 역할을 결정하는 설정을 node.master라고 합니다. Elasticsearch 노드가 하나만 있는 경우 이 옵션을 주석 처리하여 기본값인 true를 유지해야 합니다. 즉, 유일한 노드도 마스터여야 합니다. 또는 노드를 슬레이브로 구성하려면 node.master 줄 시작 부분에서 # 문자를 제거하고 값을 false로 변경합니다. :

...
node.master: false
...

또 다른 중요한 구성 옵션은 노드가 데이터를 저장할지 여부를 결정하는 node.data입니다. 대부분의 경우 이 옵션은 기본값(true)으로 두어야 하지만 노드에 데이터를 저장하지 않으려는 두 가지 경우가 있습니다. 하나는 이미 언급한 것처럼 노드가 전용 "마스터\인 경우입니다. 다른 하나는 노드가 노드에서 데이터를 가져오고 결과를 집계하는 데만 사용되는 경우입니다. 후자의 경우 노드는 " 로드 밸런서 검색”.

다시 말하지만, Elasticsearch 노드가 하나만 있는 경우 기본 true 값을 유지하도록 이 설정을 주석 처리된 상태로 두어야 합니다. 그렇지 않으면 데이터를 로컬에 저장하지 않으려면 다음 행의 주석을 제거하고 값을 false로 변경하십시오.

...
node.data: false
...

다른 두 가지 중요한 옵션은 index.number_of_shardsindex.number_of_replicas입니다. 첫 번째는 인덱스를 분할할 조각(샤드) 수를 결정합니다. 두 번째는 클러스터 전체에 배포될 복제본 수를 정의합니다. 샤드가 많으면 인덱싱 성능이 향상되고 복제본이 많으면 검색 속도가 빨라집니다.

여전히 단일 노드에서 Elasticsearch를 탐색하고 테스트하고 있다고 가정하면 복제본 없이 하나의 샤드만 가지고 시작하는 것이 좋습니다. 따라서 해당 값은 다음과 같이 설정되어야 합니다(줄 시작 부분에서 #를 제거해야 함).

...
index.number_of_shards: 1
index.number_of_replicas: 0
...

변경하고자 하는 마지막 설정은 데이터가 저장되는 경로를 결정하는 path.data입니다. 기본 경로는 /var/lib/elasticsearch입니다. 프로덕션 환경에서는 Elasticsearch 데이터를 저장하기 위한 전용 파티션과 마운트 지점을 사용하는 것이 좋습니다. 최선의 경우 이 전용 파티션은 더 나은 성능과 데이터 격리를 제공하는 별도의 스토리지 미디어가 됩니다. path.data 행의 주석 처리를 제거하고 해당 값을 변경하여 다른 path.data 경로를 지정할 수 있습니다.

...
path.data: /media/different_media
...

모든 변경을 완료한 후 파일을 저장하고 종료하십시오. 이제 다음 명령을 사용하여 처음으로 Elasticsearch를 시작할 수 있습니다.

  1. sudo service elasticsearch start

Elasticsearch를 사용하기 전에 Elasticsearch가 완전히 시작될 때까지 10초 이상 기다리십시오. 그렇지 않으면 연결할 수 없다는 오류가 발생할 수 있습니다.

4단계 — Elastic 보안

Elasticsearch에는 보안 기능이 내장되어 있지 않으며 HTTP API에 액세스할 수 있는 모든 사람이 제어할 수 있습니다. 이 섹션은 Elasticsearch 보안에 대한 포괄적인 가이드가 아닙니다. 서버 및 실행 중인 서버/가상 머신에 대한 무단 액세스를 방지하기 위해 필요한 모든 조치를 취하십시오. 시스템 보안을 강화하려면 iptables 사용을 고려하십시오.

첫 번째 보안 조정은 공개 액세스를 방지하는 것입니다. 공개 액세스를 제거하려면 elasticsearch.yml 파일을 편집합니다.

  1. sudo nano /etc/elasticsearch/elasticsearch.yml

network.bind_host가 포함된 줄을 찾아 줄 시작 부분에서 # 문자를 제거하여 주석 처리를 제거하고 값을 localhost로 변경합니다. 그래서 다음과 같이 보입니다.

...
network.bind_host: localhost
...

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

또한 추가 보안을 위해 사용자 지정 식을 평가하는 데 사용되는 동적 스크립트를 비활성화할 수 있습니다. 사용자 지정 악성 표현을 만들어 공격자가 환경을 손상시킬 수 있습니다.

사용자 지정 표현식을 비활성화하려면 /etc/elasticsearch/elasticsearch.yml 파일 끝에 다음 줄을 추가합니다.

...
[label /etc/elasticsearch/elasticsearch.yml]
script.disable_dynamic: true
...

5단계 - 테스트

이제 Elasticsearch는 포트 9200에서 실행되어야 합니다. curl, 명령줄 클라이언트 측 URL 전송 도구 및 다음과 같은 간단한 GET 요청을 사용하여 테스트할 수 있습니다.

  1. curl -X GET 'http://localhost:9200'

다음과 같은 응답이 표시됩니다.

Output of curl
{ "status" : 200, "name" : "Harry Leland", "cluster_name" : "elasticsearch", "version" : { "number" : "1.7.2", "build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec", "build_timestamp" : "2015-09-14T09:49:53Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" }

위와 비슷한 응답이 표시되면 Elasticsearch가 제대로 작동하는 것입니다. 그렇지 않은 경우 설치 지침을 올바르게 따랐는지, Elasticsearch가 완전히 시작될 때까지 약간의 시간을 허용했는지 확인하십시오.

6단계 - Elasticsearch 사용

Elasticsearch 사용을 시작하려면 먼저 일부 데이터를 추가해 보겠습니다. 이미 언급했듯이 Elasticsearch는 일반적인 CRUD 명령인 만들기, 읽기, 업데이트 및 삭제에 응답하는 RESTful API를 사용합니다. 작업을 위해 curl을 다시 사용합니다.

다음 명령을 사용하여 첫 번째 항목을 추가할 수 있습니다.

  1. curl -X POST 'http://localhost:9200/tutorial/helloworld/1' -d '{ "message": "Hello World!" }'

다음과 같은 응답이 표시됩니다.

Output
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"created":true}

curl을 사용하여 Elasticseach 서버에 HTTP POST 요청을 보냈습니다. 요청의 URI는 /tutorial/helloworld/1입니다. 여기에서 매개변수를 이해하는 것이 중요합니다.

  • 튜토리얼은 Elasticsearch 데이터의 색인입니다.
  • helloworld는 유형입니다.
  • 1은 위 인덱스 및 유형 아래 항목의 ID입니다.

다음과 같이 HTTP GET 요청을 사용하여 이 첫 번째 항목을 검색할 수 있습니다.

  1. curl -X GET 'http://localhost:9200/tutorial/helloworld/1'

결과는 다음과 같아야 합니다.

Output
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":1,"found":true,"_source":{ "message": "Hello World!" }}

기존 항목을 수정하려면 다음과 같이 HTTP PUT 요청을 사용할 수 있습니다.

  1. curl -X PUT 'localhost:9200/tutorial/helloworld/1?pretty' -d '
  2. {
  3. "message": "Hello People!"
  4. }'

Elasticsearch는 다음과 같이 성공적인 수정을 승인해야 합니다.

Output
{ "_index" : "tutorial", "_type" : "helloworld", "_id" : "1", "_version" : 2, "created" : false }

위의 예에서 첫 번째 항목의 message를 "Hello People!\로 수정했습니다. 이를 통해 버전 번호가 자동으로 2로 증가했습니다.

위의 요청에서 추가 인수 pretty를 발견했을 수 있습니다. 새 행에 각 데이터 필드를 쓸 수 있도록 사람이 읽을 수 있는 형식을 활성화합니다. 또한 데이터를 검색할 때 결과를 "예쁘게\ 하여 다음과 같이 훨씬 더 멋진 결과를 얻을 수 있습니다.

  1. curl -X GET 'http://localhost:9200/tutorial/helloworld/1?pretty'

이제 응답이 훨씬 더 나은 형식이 됩니다.

Output
{ "_index" : "tutorial", "_type" : "helloworld", "_id" : "1", "_version" : 2, "found" : true, "_source":{ "message": "Hello World!" } }

지금까지 Elasticsearch에서 데이터를 추가하고 쿼리했습니다. 다른 작업에 대해 알아보려면 API 설명서를 확인하세요.

결론

Elasticsearch를 사용하여 설치, 구성 및 시작하는 것이 얼마나 쉬운지 알 수 있습니다. 수동 쿼리를 충분히 활용했으면 다음 작업은 애플리케이션에서 사용을 시작하는 것입니다.