웹사이트 검색

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


소개

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

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

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

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

전제 조건

이 자습서를 따르기 전에 다음이 필요합니다.

  • 루트가 아닌 sudo 사용자 생성을 포함하여 Ubuntu 16.04의 초기 서버 설정에 따라 Ubuntu 16.04 Droplet이 설정되었습니다.\n
  • 이 Java 설치 문서의 "Oracle JDK 설치\ 섹션에 따라 수행할 수 있는 Oracle JDK 8 설치\n

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

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

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

먼저 패키지 색인을 업데이트합니다.

  1. sudo apt-get update

작성 당시 2.3.1인 최신 Elasticsearch 버전을 다운로드합니다.

  1. wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/deb/elasticsearch/2.3.1/elasticsearch-2.3.1.deb

그런 다음 dpkg를 사용하여 일반적인 Ubuntu 방식으로 설치합니다.

  1. sudo dpkg -i elasticsearch-2.3.1.deb

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

Elasticsearch가 서버와 함께 자동으로 시작되고 중지되도록 하려면 초기화 스크립트를 기본 실행 수준에 추가하십시오.

  1. sudo systemctl enable elasticsearch.service

Elasticsearch를 처음 시작하기 전에 권장 최소 구성에 대한 다음 섹션을 확인하십시오.

2단계 - Elasticsearch 구성

이제 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 노드를 자동으로 검색하고 클러스터에 연결하는 데 사용됩니다. 따라서 기본값을 변경하지 않으면 클러스터의 동일한 네트워크에서 원치 않는 노드가 발견될 수 있습니다.

nano 또는 선호하는 텍스트 편집기를 사용하여 기본 elasticsearch.yml 구성 파일 편집을 시작합니다.

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

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

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

Elasticsearch를 사용하여 시작할 수 있는 최소 설정입니다. 그러나 Elasticsearch에 대한 보다 철저한 이해와 미세 조정을 위해 구성 부분을 계속 읽는 것이 좋습니다.

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

슬레이브 서버는 데이터 작업을 로드할 수 있는 일꾼으로 사용됩니다. 슬레이브 노드에 과부하가 걸리더라도 추가 부하를 감당할 다른 노드가 있다면 클러스터 상태에 심각한 영향을 미치지 않아야 합니다.

서버의 역할을 결정하는 설정을 node.master라고 합니다. 기본적으로 노드는 마스터입니다. Elasticsearch 노드가 하나만 있는 경우 하나 이상의 마스터가 항상 필요하므로 이 옵션을 기본 true 값으로 두어야 합니다. 또는 노드를 슬레이브로 구성하려면 다음과 같이 node.master 변수에 false 값을 할당합니다.

. . .
node.master: false
. . .

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

다시 말하지만 Elasticsearch 노드가 하나만 있는 경우 이 값을 변경하면 안 됩니다. 그렇지 않으면 데이터를 로컬에 저장하지 않으려면 다음과 같이 node.datafalse로 지정합니다.

. . .
node.data: false
. . .

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

기본적으로 샤드 수는 5개이고 복제본 수는 1개입니다. 여전히 단일 노드에서 Elasticsearch를 탐색하고 테스트하고 있다고 가정하면 복제본 없이 샤드 하나만 가지고 시작할 수 있습니다. 따라서 해당 값은 다음과 같이 설정되어야 합니다.

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

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

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

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

  1. sudo systemctl start elasticsearch

Elasticsearch를 사용하기 전에 완전히 시작할 수 있도록 몇 가지를 제공하십시오. 그렇지 않으면 연결할 수 없다는 오류가 발생할 수 있습니다.

3단계 — Elasticsearch 보안

기본적으로 Elasticsearch에는 보안 기능이 내장되어 있지 않으며 HTTP API에 액세스할 수 있는 모든 사람이 제어할 수 있습니다. Elasticsearch는 로컬에서만 액세스할 수 있는 루프백 인터페이스(예: 127.0.0.1)에서만 수신 대기하므로 이것이 항상 보안 위험은 아닙니다. 따라서 공개 액세스가 불가능하며 모든 서버 사용자가 신뢰할 수 있거나 전용 Elasticsearch 서버인 한 Elasticsearch는 충분히 안전합니다.

그래도 보안을 강화하려면 먼저 인증을 활성화해야 합니다. 인증은 상업용 Shield 플러그인에서 제공합니다. 안타깝게도 이 플러그인은 무료는 아니지만 테스트에 사용할 수 있는 30일 무료 평가판이 있습니다. 공식 페이지에는 훌륭한 설치 및 구성 지침이 있습니다. 추가로 알아야 할 유일한 사항은 Elasticsearch 플러그인 설치 관리자의 경로가 /usr/share/elasticsearch/bin/plugin이라는 것입니다.

상용 플러그인을 사용하고 싶지 않지만 여전히 HTTP API에 대한 원격 액세스를 허용해야 하는 경우 Ubuntu의 기본 방화벽인 UFW(Uncomplicated Firewall)로 네트워크 노출을 최소한 제한할 수 있습니다. 기본적으로 UFW는 설치되지만 활성화되지는 않습니다. 사용하기로 결정한 경우 다음 단계를 따르십시오.

먼저 필요한 서비스를 허용하는 규칙을 만듭니다. 서버에 로그인하려면 최소한 SSH가 허용되어야 합니다. SSH에 대한 전 세계 액세스를 허용하려면 포트 22를 화이트리스트에 추가하십시오.

  1. sudo ufw allow 22

그런 다음 다음과 같이 신뢰할 수 있는 원격 호스트(예: TRUSTED_IP)에 대한 기본 Elasticsearch HTTP API 포트(TCP 9200)에 대한 액세스를 허용합니다.

  1. sudo ufw allow from TRUSTED_IP to any port 9200

그런 다음 다음 명령으로 UFW를 활성화합니다.

  1. sudo ufw enable

마지막으로 다음 명령을 사용하여 UFW의 상태를 확인합니다.

  1. sudo ufw status

규칙을 올바르게 지정한 경우 출력은 다음과 같아야 합니다.

Output of java -version
Status: active To Action From -- ------ ---- 9200 ALLOW TRUSTED_IP 22 ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6)

UFW가 활성화되고 Elasticsearch 포트 9200을 보호하는 것을 확인한 후에는 Elasticsearch가 외부 연결을 수신하도록 허용할 수 있습니다. 이렇게 하려면 elasticsearch.yml 구성 파일을 다시 엽니다.

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

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

. . .
network.host: 0.0.0.0
. . .

Elasticsearch가 모든 인터페이스와 바인딩된 IP에서 수신 대기하도록 0.0.0.0을 지정했습니다. 특정 인터페이스에서만 수신하도록 하려면 0.0.0.0 대신 해당 IP를 지정하면 됩니다.

위의 설정을 적용하려면 다음 명령을 사용하여 Elasticsearch를 다시 시작하십시오.

  1. sudo systemctl restart elasticsearch

그런 다음 신뢰할 수 있는 호스트에서 Elasticsearch로 연결을 시도합니다. 연결할 수 없으면 UFW가 작동하고 network.host 변수가 올바르게 지정되었는지 확인하십시오.

4단계 - Elasticsearch 테스트

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

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

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

Output of curl
{ "name" : "My First Node", "cluster_name" : "mycluster1", "version" : { "number" : "2.3.1", "build_hash" : "bd980929010aef404e7cb0843e61d0665269fc39", "build_timestamp" : "2016-04-04T12:25:05Z", "build_snapshot" : false, "lucene_version" : "5.5.0" }, "tagline" : "You Know, for Search" }

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

Elasticsearch를 보다 철저하게 확인하려면 다음 명령을 실행합니다.

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

위 명령의 출력에서 노드, 클러스터, 애플리케이션 경로, 모듈 등에 대한 모든 현재 설정을 보고 확인할 수 있습니다.

5단계 — 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,"_shards":{"total":2,"successful":1,"failed":0},"created":true}

curl을 사용하여 Elasticsearch 서버에 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, "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "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 People!" } }

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

결론

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


판권 소유. © Linux-Console.net • 2019-2024