개발 환경에서 첫 Elasticsearch 클러스터 설정하기

로컬 개발용 Elasticsearch 클러스터를 설정하고, 상태를 확인하며, 단일 노드 및 다중 노드 구성에서 흔히 발생하는 실수를 피하는 방법을 알아봅니다.

개발 환경에서 첫 Elasticsearch 클러스터 설정하기

첫 Elasticsearch 클러스터를 설정하는 것은 주로 안전한 개발 구성을 선택하고 노드가 의도한 클러스터에 실제로 조인되었는지 확인하는 것입니다. 단일 노드 설정은 기본적인 인덱싱 및 검색 테스트에 충분하며, 로컬 다중 노드 설정은 디스커버리와 샤드 할당을 학습하는 데 도움이 됩니다.

여기서는 로컬 개발에 초점을 맞춥니다. 이러한 느슨한 설정을 공용 또는 프로덕션 클러스터에 재사용하지 마십시오.

사전 요구 사항

시작하기 전에 다음 사전 요구 사항이 충족되었는지 확인하십시오.

  1. Java 런타임: 최신 Elasticsearch 배포판에는 번들 JDK가 포함되어 있습니다. 번들 JDK가 포함되지 않은 패키지나 배포판을 사용하는 경우 해당 Elasticsearch 릴리스에 필요한 Java 버전을 설치하십시오.
  2. Elasticsearch 다운로드: 공식 Elastic 웹사이트에서 원하는 Elasticsearch 버전의 바이너리 배포판을 다운로드하십시오.
  3. 시스템 리소스: 기본 개발 테스트의 경우 2GB RAM이 일반적으로 충분하지만, 다중 노드 테스트의 경우 더 많은 용량을 권장합니다.

1단계: Elasticsearch 다운로드 및 압축 풀기

다운로드(보통 .zip 또는 .tar.gz 파일)가 완료되면 클러스터 파일을 호스팅할 디렉토리(예: ~/elasticsearch-8.12.0)에 아카이브를 추출합니다. 이 디렉토리를 Elasticsearch 홈 디렉토리라고 합니다.

2단계: 단일 노드 클러스터 구성 (개발 기본값)

기본적으로 Elasticsearch를 처음 실행하면 단일 노드 클러스터로 시작을 시도합니다. 그러나 최신 버전에서는 로컬 개발의 경우에도 특히 보안 및 메모리 설정과 관련하여 명시적인 구성이 필요한 경우가 많습니다.

구성 파일은 Elasticsearch 홈 디렉토리 내의 config/ 디렉토리에 있습니다.

필수 구성 (config/elasticsearch.yml)

기본 구성 파일은 elasticsearch.yml입니다. 로컬 단일 노드 설정의 경우 최소한 클러스터 이름과 노드 이름을 구성해야 합니다.

# 클러스터 구성
cluster.name: dev-cluster

# 노드 구성
node.name: node-1

# 네트워크 설정 (개발을 위해 localhost 사용)
network.host: 127.0.0.1

# HTTP 포트 (기본값은 9200)
http.port: 9200

# 개발에 중요: 초기에 보안 비활성화 (프로덕션에서는 주의해서 사용!)
xpack.security.enabled: false

보안 경고: xpack.security.enabled를 비활성화하는 것은 테스트를 단순화하기 위해 초기 개발 설정에서 일반적입니다. 절대 공개적으로 액세스 가능한 환경에서 이 구성을 실행하지 마십시오. 최신 Elasticsearch 버전(7.x+)의 경우 보안이 활성화된 상태로 유지되면 초기 비밀번호를 생성하기 위해 먼저 설정 명령을 실행해야 하는 경우가 많습니다.

단일 노드 시작

압축을 푼 디렉토리의 루트로 이동하여 적절한 시작 스크립트를 실행합니다. Linux/macOS의 경우:

./bin/elasticsearch

Windows에서 PowerShell을 사용하는 경우:

.\bin\elasticsearch.bat

로그에 노드가 성공적으로 시작되었음을 나타내는 메시지(일반적으로 started와 같은 메시지)가 표시될 때까지 기다립니다.

3단계: 클러스터 상태 확인

프로세스가 실행 중이면 기본 HTTP 포트(9200)에 대해 curl을 사용하여 클러스터 상태를 확인할 수 있습니다.

클러스터 상태 확인

이 명령은 클러스터의 전체 상태를 확인합니다.

curl -X GET "http://localhost:9200/_cat/health?v"

예상 출력 일부:

epoch      timestamp cluster     status node.total node.data shards prio initialized
1678886400 10:00:00  dev-cluster green    1          1        0   0           1

status 필드는 green이어야 하며, 이는 정상적인 단일 노드 클러스터를 나타냅니다.

노드 정보 확인

노드 정보도 확인할 수 있습니다.

curl -X GET "http://localhost:9200/_cat/nodes?v"

4단계: 다중 노드 클러스터 설정 (실제 테스트용)

샤드 할당을 보다 현실적으로 개발하거나 테스트하려면 최소 두 개의 노드가 필요합니다. 이를 위해서는 각각 고유한 구성을 가진 여러 개의 개별 Elasticsearch 인스턴스를 실행해야 합니다.

디렉토리 구조

주 작업 영역 내에 각 노드에 대한 별도의 디렉토리(예: es_data/node1, es_data/node2)를 만듭니다. 기본 Elasticsearch 배포판을 이러한 각 디렉토리에 복사하거나 기본 설치에 연결합니다.

노드 구성 차이점

각 노드에 대해 고유한 config/elasticsearch.yml 파일을 만듭니다.

노드 1 구성 (es_data/node1/config/elasticsearch.yml)

cluster.name: dev-cluster
node.name: node-1
network.host: 127.0.0.1
http.port: 9200
transport.port: 9300
path.data: node1_data  # 고유한 데이터 경로
xpack.security.enabled: false
discovery.seed_hosts: ["127.0.0.1:9300", "127.0.0.1:9301"]
# 이 줄은 노드 1에게 다른 멤버를 찾는 방법을 알려줍니다.
cluster.initial_master_nodes: ["node-1", "node-2"]

노드 2 구성 (es_data/node2/config/elasticsearch.yml)

cluster.name: dev-cluster
node.name: node-2
network.host: 127.0.0.1
http.port: 9201  # 다른 HTTP 포트를 사용해야 함
transport.port: 9301  # 다른 전송 포트를 사용해야 함
path.data: node2_data  # 고유한 데이터 경로
xpack.security.enabled: false
discovery.seed_hosts: ["127.0.0.1:9300", "127.0.0.1:9301"]
# 이 줄은 노드 2에게 다른 멤버를 찾는 방법을 알려줍니다.
cluster.initial_master_nodes: ["node-1", "node-2"]

다중 노드 클러스터 시작

  1. 노드 1 시작: es_data/node1로 이동하여 ./bin/elasticsearch를 실행합니다.
  2. 노드 2 시작: es_data/node2로 이동하여 ./bin/elasticsearch를 실행합니다.

다중 노드 클러스터 확인

실행 중인 모든 HTTP 포트(예: 9200)에 대해 API를 사용하여 노드 수를 확인합니다.

curl -X GET "http://localhost:9200/_cat/nodes?v"

예상 출력 일부:

ip           heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
127.0.0.1    15           50       0   0.01    0.02    0.01    mdi        *      node-1
127.0.0.1    16           51       0   0.00    0.01    0.01    mdi        -      node-2

name 아래에 두 개의 항목이 표시되면 다중 노드 클러스터가 올바르게 구성된 것입니다.

개발 환경을 위한 모범 사례

  • 전용 데이터 경로 사용: 특히 다중 노드 설정에서 각 노드에 대해 항상 path.data를 명시적으로 구성하여 인스턴스 간의 우발적인 데이터 오염을 방지하십시오.
  • 고유한 포트: 각 로컬 노드에 대해 고유한 HTTP 포트(http.port)와 전송 포트(transport.port)를 사용하여 충돌을 방지하십시오.
  • 메모리 잠금: 개발 중에 힙 크기 제한에 도달하지 않는지 확인하십시오. 메모리 관련 시작 오류가 발생하면 jvm.options 파일에서 JVM 힙 크기를 조정해야 할 수 있습니다(기본값은 일반적으로 기본 테스트에 충분합니다).

다음 단계: 데이터 인덱싱

클러스터가 실행 중이면 다음 논리적 단계는 인덱스를 생성하고 매핑 설정을 지정하는 것입니다. 예를 들어, products라는 간단한 인덱스를 생성하려면:

curl -X PUT "http://localhost:9200/products?pretty"

이 기본 설정을 통해 클라이언트 라이브러리 또는 Kibana를 사용하여 Elasticsearch와 상호 작용을 시작할 수 있습니다.