웹사이트 검색

CentOS 7에서 Elasticsearch를 설치하고 구성하는 방법


저자는 Write for DOnations 프로그램을 선택했습니다.

소개

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

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

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

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

전제 조건

이 튜토리얼을 따르려면 다음이 필요합니다.

  • 최소 1GB의 메모리와 비루트 sudo 사용자로 CentOS 7을 실행하는 서버. 자세한 지침은 CentOS 7용 초기 서버 설정 가이드를 확인하십시오.
  • wget이 서버에 설치됨

1단계 — CentOS 7에 Java 설치

Elasticsearch는 Java 프로그래밍 언어로 작성되었습니다. 첫 번째 작업은 서버에 JRE(Java Runtime Environment)를 설치하는 것입니다. JRE용 기본 CentOS OpenJDK 패키지를 사용합니다. 이 JRE는 무료이며 잘 지원되며 CentOS Yum 설치 관리자를 통해 자동으로 관리됩니다.

최신 버전의 OpenJDK 8을 설치합니다.

  1. sudo yum install java-1.8.0-openjdk.x86_64

이제 설치를 확인하십시오.

  1. java -version

이 명령은 다음과 같은 출력을 생성합니다.

Output
openjdk version "1.8.0_262" OpenJDK Runtime Environment (build 1.8.0_262-b10) OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

Elasticsearch를 사용하여 발전하고 더 나은 Java 성능과 호환성을 찾기 시작하면 Oracle의 독점 Java(Oracle JDK 8)를 설치하도록 선택할 수 있습니다. 자세한 내용은 CentOS 및 Fedora에 Java를 설치하는 방법에 대한 기사를 참조하십시오.

2단계 — CentOS 7에서 Elasticsearch 다운로드 및 설치

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

이 글을 쓰는 시점에서 최신 Elasticsearch 버전은 7.9.2입니다.

선택한 작업 디렉토리에서 프로그램을 다운로드합니다.

  1. wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-x86_64.rpm

그런 다음 rpm 명령을 사용하여 설치합니다.

  1. sudo rpm -ivh elasticsearch-7.9.2-x86_64.rpm

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

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

  1. sudo systemctl enable elasticsearch.service

Elasticsearch가 설치되면 이제 몇 가지 중요한 설정을 구성합니다.

3단계 — CentOS 7에서 Elasticsearch 구성

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

Elasticsearch 구성 파일은 /etc/elasticsearch 디렉토리에 있습니다. 우리가 검토하고 편집할 항목은 다음과 같습니다.

  • elasticsearch.yml — Elasticsearch 서버 설정을 구성합니다. 이것은 대부분의 옵션이 저장되는 곳이며, 이것이 우리가 이 파일에 주로 관심을 갖는 이유입니다.
  • jvm.options — 메모리 설정과 같은 JVM 구성을 제공합니다.\n

Elasticsearch 서버에서 사용자 지정할 첫 번째 변수는 elasticsearch.ymlnode.namecluster.name입니다. 지금 해보자.

이름에서 알 수 있듯이 node.name은 서버(노드)의 이름과 노드가 연결된 클러스터를 지정합니다. 이러한 변수를 사용자 지정하지 않으면 서버 호스트 이름과 관련하여 node.name이 자동으로 할당됩니다. cluster.name은 자동으로 기본 클러스터의 이름으로 설정됩니다.

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

기본 elasticsearch.yml 구성 파일 편집을 시작하겠습니다.

nano 또는 원하는 텍스트 편집기를 사용하여 엽니다.

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

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

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

네트워킹 설정은 elasticsearch.yml에도 있습니다. 기본적으로 Elasticsearch는 동일한 서버의 클라이언트만 연결할 수 있도록 포트 9200의 localhost에서 수신 대기합니다. Elasticsearch의 오픈 소스 및 무료 에디션은 인증 기능을 제공하지 않기 때문에 보안 관점에서 이러한 설정을 변경하지 않은 상태로 두어야 합니다.

또 다른 중요한 설정은 node.roles 속성입니다. 이를 master-eligible(구성에서 간단히 master), data 또는 ingest로 설정할 수 있습니다.

master-eligible 역할은 클러스터의 상태와 안정성을 담당합니다. 클러스터 노드가 많은 대규모 배포에서는 마스터 역할만 있는 전용 노드를 두 개 이상 두는 것이 좋습니다. 일반적으로 전용 마스터 노드는 데이터를 저장하거나 인덱스를 생성하지 않습니다. 따라서 클러스터 상태가 위험에 처할 수 있는 과부하 가능성이 없습니다.

data 역할은 데이터를 저장할 노드를 정의합니다. 데이터 노드가 과부하되더라도 추가 로드를 수행할 다른 노드가 있는 경우 클러스터 상태에 심각한 영향을 미치지 않아야 합니다.

마지막으로 ingest 역할은 노드가 데이터 스트림을 수락하고 처리할 수 있도록 합니다. 더 큰 설정에서는 마스터데이터 노드에 가능한 과부하를 방지하기 위해 전용 수집 노드가 있어야 합니다.

참고: 하나의 노드는 Elasticsearch 설정의 확장성, 중복성 및 고가용성을 허용하는 하나 이상의 역할을 가질 수 있습니다. 기본적으로 이러한 역할은 모두 노드에 할당됩니다. 이는 이 문서에서 설명하는 예제 시나리오에서와 같이 단일 노드 Elasticsearch에 적합합니다. 따라서 역할을 변경할 필요가 없습니다. 그래도 노드를 마스터로 지정하는 등 역할을 변경하려면 /etc/elasticsearch/elasticsearch.yml을 다음과 같이 변경하면 됩니다.

...
node.roles: [ master ]
...

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

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

모든 변경을 완료했으므로 elasticsearch.yml을 저장하고 닫습니다.

또한 jvm.options에서 구성을 편집해야 합니다.

Elasticsearch는 JVM에 의해 실행됩니다. 즉, 기본적으로 Java 애플리케이션입니다. 따라서 모든 Java 애플리케이션과 마찬가지로 /etc/elasticsearch/jvm.options 파일에서 구성할 수 있는 JVM 설정이 있습니다. 특히 성능과 관련하여 가장 중요한 두 가지 설정은 XmsXmx로, 최소(Xms) 및 최대(<Xmx) 메모리 할당.

기본적으로 둘 다 1GB로 설정되지만 거의 최적이 아닙니다. 뿐만 아니라 서버에 1GB의 RAM만 있으면 기본 설정으로 Elasticsearch를 시작할 수 없습니다. 운영 체제가 최소 100MB를 차지하므로 Elasticsearch에 1GB를 전용할 수 없기 때문입니다.

불행히도 메모리 설정을 계산하기 위한 보편적인 공식은 없습니다. 당연히 더 많은 메모리를 할당할수록 성능이 향상되지만 서버의 나머지 프로세스를 위해 충분한 메모리가 남아 있는지 확인하십시오. 예를 들어 시스템에 1GB의 RAM이 있는 경우 XmsXmx를 모두 512MB로 설정하여 나머지 512MB를 추가로 허용할 수 있습니다. 프로세스. 일반적으로 XmsXmx는 JVM 가비지 수집의 성능 저하를 피하기 위해 동일한 값으로 설정됩니다.

서버에 1GB의 RAM만 있는 경우 이 설정을 편집해야 합니다.

jvm.options를 엽니다.

  1. sudo nano /etc/elasticsearch/jvm.options

이제 XmsXmx 값을 512MB로 변경합니다.

...
-Xms512m
-Xmx512m
...

파일을 저장하고 종료합니다.

이제 처음으로 Elasticsearch를 시작합니다.

  1. sudo service elasticsearch start

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

참고: 모든 Elasticsearch 설정이 설정되고 구성 파일에 보관되는 것은 아닙니다. 대신 index.number_of_shardsindex.number_of_replicas와 같은 일부 설정은 API를 통해 설정됩니다. 첫 번째는 인덱스가 분할될 조각(샤드) 수를 결정합니다. 두 번째는 클러스터 전체에 배포될 복제본 수를 정의합니다. 샤드가 많으면 인덱싱 성능이 향상되고 복제본이 많으면 검색 속도가 빨라집니다.

여전히 단일 노드에서 Elasticsearch를 탐색하고 테스트하고 있다고 가정하면 다음 curl 명령을 실행하여 이러한 설정을 사용하고 변경할 수 있습니다.

  1. curl -XPUT -H 'Content-Type: application/json' 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{
  2. "index.number_of_replicas" : "0",
  3. "index.number_of_shards" : "1"
  4. }'

Elasticsearch를 설치하고 구성했으면 이제 서버를 보호하고 테스트합니다.

4단계 — (선택 사항) CentOS 7에서 Elasticsearch 보안

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

기본적으로 Elasticsearch는 localhost 네트워크 인터페이스에서만 수신 대기하도록 구성되어 있습니다. 즉, 원격 연결은 불가능합니다. 다음 조치 중 하나 또는 모두를 수행하지 않는 한 이 설정을 변경하지 않은 상태로 두어야 합니다.

  • iptables가 있는 신뢰할 수 있는 호스트로만 TCP 포트 9200에 대한 액세스를 제한했습니다.
  • 신뢰할 수 있는 호스트 간에 VPN을 생성했으며 VPN의 가상 인터페이스 중 하나에 Elasticsearch를 노출하려고 합니다.

위의 작업을 수행한 후에만 Elasticseach가 localhost 외에 다른 네트워크 인터페이스에서 수신하도록 허용하는 것을 고려해야 합니다. 예를 들어 다른 호스트에서 Elasticsearch에 연결해야 하는 경우 이러한 변경을 고려할 수 있습니다.

네트워크 노출을 변경하려면 elasticsearch.yml 파일을 엽니다.

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

이 파일에서 network.host가 포함된 줄을 찾아 줄 시작 부분에서 # 문자를 제거하여 주석 처리를 제거한 다음 값을 다음의 IP 주소로 변경합니다. 보안 네트워크 인터페이스. 라인은 다음과 같이 보일 것입니다:

...
network.host: 10.0.0.1
...

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

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

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

...
[label /etc/elasticsearch/elasticsearch.yml]
script.allowed_types: none
...

위의 변경 사항을 적용하려면 Elasticsearch를 다시 시작해야 합니다.

지금 Elasticsearch를 다시 시작하십시오.

  1. sudo service elasticsearch restart

이 단계에서는 Elasticsearch 서버를 보호하기 위해 몇 가지 조치를 취했습니다. 이제 애플리케이션을 테스트할 준비가 되었습니다.

5단계 — CentOS 7에서 Elasticsearch 테스트

이제 Elasticsearch는 포트 9200에서 실행되어야 합니다. 클라이언트측 URL 전송을 위한 명령줄 도구인 curl을 사용하여 이를 테스트할 수 있습니다.

서비스를 테스트하려면 다음과 같이 GET 요청을 수행합니다.

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

다음 응답이 표시됩니다.

Output
{ "name" : "My First Node", "cluster_name" : "mycluster1", "cluster_uuid" : "R23U2F87Q_CdkEI2zGhLGw", "version" : { "number" : "7.9.2", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "d34da0ea4a966c4e49417f2da2f244e3e97b4e6e", "build_date" : "2020-09-23T00:45:33.626720Z", "build_snapshot" : false, "lucene_version" : "8.6.2", "minimum_wire_compatibility_version" : "6.8.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }

비슷한 응답이 표시되면 Elasticsearch가 제대로 작동하는 것입니다. 그렇지 않은 경우 설치 지침을 다시 확인하고 Elasticsearch가 완전히 시작될 때까지 약간의 시간을 허용합니다.

이제 Elasticsearch 서버가 작동합니다. 다음 단계에서는 응용 프로그램에서 일부 데이터를 추가하고 검색합니다.

6단계 — CentOS 7에서 Elasticsearch 사용

이 단계에서는 일부 데이터를 Elasticsearch에 추가한 다음 몇 가지 수동 쿼리를 수행합니다.

curl을 사용하여 첫 번째 항목을 추가하십시오.

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

다음 출력이 표시됩니다.

Output
{"_index":"tutorial","_type":"helloworld","_id":"1","_version":3,"result":"updated","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":4

curl을 사용하여 Elasticseach 서버에 HTTP POST 요청을 보냈습니다. 요청의 URI는 /tutorial/helloworld/1입니다. 이러한 매개변수를 자세히 살펴보겠습니다.

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

-H Content-Type: application/json 인수를 사용하여 JSON에 대한 모든 POST 요청의 콘텐츠 유형을 설정해야 한다는 점에 유의하십시오. 이 작업을 수행하지 않으면 Elasticsearch에서 요청을 거부합니다.

이제 HTTP GET 요청을 사용하여 첫 번째 항목을 검색합니다.

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

결과는 다음과 같습니다.

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

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

  1. curl -H 'Content-Type: application/json' -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, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1 }

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

GET 작업의 출력을 사람이 더 쉽게 읽을 수 있도록 하려면 pretty 인수를 추가하여 결과를 "pretify\할 수도 있습니다.

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

이제 응답이 더 읽기 쉬운 형식으로 출력됩니다.

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

이것이 Elasticsearch에서 데이터를 추가하고 쿼리하는 방법입니다. 다른 작업에 대해 알아보려면 Elasticsearch API 설명서를 확인하세요.

결론

이 튜토리얼에서는 CentOS 7에서 Elasticsearch를 설치, 구성 및 사용하기 시작했습니다. 수동 쿼리에 익숙해지면 다음 작업은 애플리케이션에서 서비스 사용을 시작하는 것입니다.