개발공부/Elasticsearch

[Elasticsearch] elasticsearch 기본 설정 및 cluster 구성하기(start error)

차나니 2024. 5. 13. 23:58

Elasticsearch 실행 상태 확인하기

아래 명령어를 통해 Elasticsearch가 정상적으로 작동하고 있는지 확인하실 수 있습니다 !

curl localhost:9200

 

만약 curl: (7) Faild connect to localhost:9200; Connection refused 와 같은 에러가 발생했을 경우 elasticsearch.yml 파일의 network 설정을 확인해보시길 바랍니다 !

 

elasticsearch.yml 설정 정보

Elasticsearch의 실행 환경에 대한 설정은 elasticsearch.yml에서 관리합니다.

yml의 주요 설정은 아래와 같습니다.

 

cluster.name : "클러스터명"

  • 클러스터명을 설정할 수 있습니다.
  • 노드들은 클러스터명이 같으면 클러스터로 묶입니다.
  • 클러스터명이 다르면 동일한 물리적 장비나, 바인딩이 가능한 네트워크상에 있더라도 서로 다른 클러스터로 바인딩 됩니다.
  • default 클러스터명은 elasticsearch입니다.

node.name : "노드명"

  • 실행중인 각각의 elasticsearch 노드들을 구분할 수 있는 노드의 이름을 설정합니다.
  • 설정하지 않으면 7버전 이상부터는 호스트명으로 설정됩니다.

node.attr. : "value"

  • 노드별로 속성을 부여하기 위한 일종의 네임스페이스를 지정합니다.
  • 이 설정을 이용하면 hot/warm 아키텍처를 구성하거나 물리 장비 구성에 따라 샤드 배치를 임의적으로 조절하는 등의 설정이 가능합니다.

path.data : ["경로"]

  • 색인된 데이터를 저장하는 경로를 지정합니다.
  • Default : Es 설치경로/data
  • 배열형태로 여러개의 경로값의 입력이 가능하기 때문에 한 서버에서 디스크를 여러개 사용할 수 있습니다.

path.logs : "경로"

  • ElasticSearch 실행 로그를 저장하는 경로를 지정합니다.
  • Default : Es설치경로/logs
  • 실행중인 시스템 로그는 클러스터명.log 형식의 파일로 저장되며, 날짜가 변경되면 날짜가 추가됩니다.

bootstrap.memory_lock : true

  • Elasticsearch가 사용 중인 힙 메모리 영역을 다른 자바 프로그램이 간섭하지 못하도록 미리 점유하는 설정입니다.
  • true 권장

network.host : ip주소

  • Elasticsearch가 실행되는 서버의 ip주소
  • Default : 127.0.0.1
  • 주석 처리 혹은, 루프백인 경우 개발모드로 실행됩니다.
  • 이 설정을 실제 IP 주소로 변경 시, 운영 모드로 실행되며, 시작 시 부트스트랩을 체크합니다.
  • network.host는 서버의 내/외부 주소를 모두 지정하는데 만약 내부망에서 사용하는 주소와 외부망에서 접근하는 주소를 다르게 설정하고자 하면 아래의 값 들을 이용해서 구분이 가능합니다.
    • network.bind_host : 내부망
    • network.publish_host : 외부망
  • 다음은 network.host 설정에 사용되는 특별한 변수값입니다.
    • _local_ : 루프백 주소 127.0.0.1과 같습니다. (Default 값)
    • _site_ : 로컬 네트워크 주소로 설정, 실제로 클러스터링 구성 시 주로 설정하는 값입니다.
    • _global_ : 네트워크 외부에서 바라보는 주소로 설정합니다.

실제로 클러스터를 구성할 떄 설정을 network.host : _site_ 로 해놓으면 서버의 네트워크 주소가 바뀌어도 설정 파일은 변경하지 않아도 되기 때문에 편리합니다.

 

http.post : 포트번호

  • Elasticsearch가 클라이언트와 통신하기 위한 http 포트를 설정합니다.
  • Default : 9200
    • 포트가 이미 사용 중인 경우 9300~9399 사이의 값을 차례대로 사용합니다.

discovery.seed.hosts:["호스트-1", "호스트-2", ...]

  • 클러스터 구성을 위해 바인딩 할 원격 노드의 IP 또는 도메인 주소를 배열 형태로 입력합니다.
  • 주소만 적는 경우 Default로 9300~9305 사이의 값을 검색합니다.
    • tcp 포트가 이 범위 밖에 설정 된 경우 포트번호까지 같이 적어줘야합니다.

이렇게 원격에 있는 노드들을 찾아 바인딩하는 과정을 디스커버리라고합니다.

 

cluster.inital_master_nodes : ["노드-1", "노드-2"]

  • 클러스터가 최초 실행될 때 명시된 노드들을 대상으로, 마스터 대상으로 마스터 노드를 선출합니다.

단일 서버, 단일 노드, 단일 클러스터 설정하기

처음으로 아래와 같이 단일 cluster를 생성해 볼 것입니다 ! (elasticsearch.yml 파일 수정)

① cluster의 이름은 "scout-cluster"로 지정합니다. (cluster.name)

② node의 이름은 "node-1"로 지정합니다. (node.name)

③ 서버와 elasticsearch 간의 연결을 시도합니다. (network.host)

④ 방화벽 설정을 제거하고 client에서 elasticsearch를 호출할 수 있도록 해줍니다. (filter IP : 0.0.0.0/0)

→ cluster의 이름과 node이름을 설정해줍니다.

cluster.name: "scout-cluster"
node.name: "node-1"

 

→ 내부 IP로도 접속이 가능하도록 수정해줍니다.

elasticsearch는 기본적으로 localhost로만 접근이 가능하도록 되어있어  내부 ip로 접근 시 결과가 나타나지 않을 것입니다.

// 내부 IP가 12.34.56.111 인 경우(결과 X)
curl 12.34.56.111

// localhost (결과 O)
curl localhost:9200

 

따라서 내부 IP 또는 공유 IP로 접근하려면 설정이 필요합니다.

elasticsearch가 inter network ip를 찾아서 setting 하는 방법입니다.

network.host: "_site_, _local_"

 

🚨 오류 발생

elasticsearch를 실행하면 오류가 발생합니다 !!

이유는 network host 설정을 하지 않으면 elasticsearch 실행 시 개발자 모드로 오류 없이 실행이 되지만, network host의 값을 설정하게 되면 외부에서도 접속을 하게 되는 상태로 만들게 되어 bootstrap check를 하게 되어 바로 실행되지 않습니다.

 

🎊 해결방법

실행이 되지 않는 이유를 elasticsearch의 log를 보고 찾을 수 있었습니다 !

1. max file descriptions
 - 한 프로세스가 접근할 수 있는 파일에 제한을 두는데 이 값을 무한대로 바꿔주야합니다.
 - limit.conf 파일에서 설정 변경
 - /etc/security/limits.conf 파일 설정 변경
 - 맨 마지막 줄에  (root = 계정이름) 추가
 root  hard    nofile  65536
 root  soft    nofile  65536
 root - noflie 65535
 
2. max virtual memory areas
 - /etc/sysctl.conf 파일에서 설정 변경
 - vm.max_map_count=262144
  
3. discovery settings are unsuitable
 - elasticsearch.yml 파일에서 수정
 - discovery.seed_hosts 설정을 해줘야합니다.
 - host name을 써주면됩니다.
 - discovery.seed_hosts: 호스트이름
 - cluster.initial_master_nodes: 노드이름

 

이후 시스템을 재시작 해줘야합니다 !

sudo shutdown -r

// sysctl.conf 파일을 적용시켜주기
sudo sysctl -p

 

상단의 설정 내용을 변경해준 이후 정상적으로 작동되었습니다 :)  추가로 SSL 설정이 궁금하신 분은 아래 게시글을 참고주세요 !

 

[Linux] Elasticsearch SSL/TLS(https) 외부에서 접속하기

설치환경- Linux : Ubuntu 22.04- Eleasticsearch, logstash : 7.17.21 미리 준비하기① 도메인 : 서버 IP를 DNS 정보로 등록하기② SSL인증서 : 위 도메인 정보가 포함되어있는 인증서 발급하기 도메인의 경우는

chanhan.tistory.com