본문 바로가기

공부방/Elasticsearch

elasticsearch 기본 설정 및 cluster 구성

1. Elasticsearch 실행 상태 확인


아래 명령어를 통해서 elasticsearch가 돌아가고 있는 것을 확인할 수 있습니다.

 

curl localhost:9200

 

만약에 curl: (7) Failed connect to localhost:9200; Connection refused 와 같은 에러가 발생한다면 elasticsearch.yml 파일을 통해 network 설정을 확인해보면 됩니다.

 

// less -S ./elasticsearch-7.9.1/config/elasticsearch.yml
// 만약 운영하고 있는 서버라면 내부 ip만을 통해 접근할 수 있도록 설정해 놓았을 수도 있을겁니다.
// 아래와 같이 특정 ip만 접근 가능하도록 설정할 수도 있습니다.

network.host: 10.131.93.83

 

2. 용어 정리


  1. 색인 (indexing) : 데이터가 검색될 수 있는 구조로 변경하기 위해 원본 문서를 검색어 토큰들으로 변환하여 데이터를 저장하는 일련의 과정
  2. 인덱스 (index, indices) : 색인 과정을 거친 결과물, 또는 색인된 데이터가 저장되는 저장소입니다. 또한 Elasticsearch에서 도큐먼트들의 논리적인 집합을 표현하는 단위, RDBMS의 테이블과 유사한 개념.
  3. 검색 (search) : 인덱스에 들어있는 검색어 토큰들을 포함하고 있는 문서를 찾아가는 과정
  4. 질의 (query) : 사용자가 원하는 문서를 찾거나 집계 결과를 출력하기 위해 검색 시 입력하는 검색어 또는 검색 조건입니다. "쿼리" 또는 "질의"라고도 표현합니다.
  5. 디스커버리 (discovery) : 노드가 서로 다른 노드를 찾아가면서 같이 한 클러스터로 구성하기 위해서 찾아가는 과정

 

3. ElasticSearch 설정 정보 (elasticsearch.yml)


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

yml 에서 하는 주요설정은 다음과 같습니다.

 

cluster.name: "<클러스터명>"

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

 

node.name: "<노드명>"

  • 실행중인 각각의 elasticsearch 노드들을 구분할 수 있는 노드의 이름을 설정.
  • 설정하지 않으면 7버전 이상부터는 호스트명, 6.x 이하 버전에서는 UUID의 첫 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주소>

  • ES가 실행되는 서버의 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.port : <포트 번호>

  • Elasticsearch가 클라이언트와 통신하기 위한 Http 포트를 설정,
  • default : 9200
    • 포트가 이미 사용중인 경우 9200~9299 사이의 값을 차례대로 사용

 

transport.port: <포트 번호>

  • ElasticSearch 노드들끼리 서로 통신하기 위한 tcp 포트를 설정
  • default : 9300
    • 포트가 이미 사용중인 경우 9300~9399 사이의 값을 차례대로 사용.

 

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

  • 클러스터 구성을 위해 바인딩 할 원격 노드의 IP 또는 도메인 주소를 배열 형태로 입력.
  • 주소만 적는 경우 디폴트로 9300~9305 사이의 값을 검색
    • tcp 포트가 이 범위 밖에 설정 된 경우 포트번호 까지 같이 적어줘야함.
  • 이렇게 원격에 있는 노드들을 찾아 바인딩 하는 과정을 디스커버리 라고함.

 

cluster.initial_master_nodes : ["<노드-1>", "<노드-2>"]

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

 

cluster.initial_master_nodes 옵션 또한 7.0이상 부터 추가된 기능.

6.x 이전 버전에서는 최소 마스터 후보노드를 지정하기 위해 다음 옵션 사용

discovery.zen.minimum_master_nodes

7.0 버전 부터는 최소 마스터 후보 노드의 크기가 능동적으로 변경

 

4. 노드의 역할 (Master, Data, Ingest, ML) 설정 (Elasticsearch.yml)


  • ES의 노드는 수행하는 역할들이 존재
  • 각자 노드들이 서로 다른 역할을 하도록 클러스터 구성 가능
  • 아래 설정들의 모든 디폴트 값은 true 이며 명시된 모든 역할을 수행
  • 특정 값들을 false 설정 함으로써, 노드의 역할들을 구분지어 클러스터 구성

 

node.master : true

  • 마스터 후보(master eligible) 노드 여부를 설정
  • false 인 경우 마스터 노드 선출 불가능
  • 모든 클러스터는 1개의 마스터 노드 존재하며, 마스터 노드가 다운 되거나 끊어진 경우 남은 마스터 후보 노드들 중에서 새로운 마스터 노드 선출

 

node.data : true

  • 노드가 데이터를 저장하도록 함.
  • false 인경우 이 노드는 데이터를 저장하지 않음

 

node.ingest: true

  • 데이터 색인시 전처리 작업인 ingest pipeline 작업의 수행을 할 수 있는지 여부 지정
  • false 인 경우 이 노드에서는 ingest pipeline 작업을 수행하지 않음.

 

node.ml : true

  • 이 노드가 머신러닝 작업 수행을 할 수 있는지 여부를 지정.

 

커맨드 라인 설정

elasticsearch.yml 파일에 설정하는 것 외에도 Elasticsearch 실행 시 커맨드 명령에 -E <옵션>=<값> 을 이용해서 환경 설정이 가능합니다. 예를 들어 클러스터명은 my-cluster 노드명은 node-1로 노드를 실행하기 위해서는 다음과 같이 실행합니다.

# 클러스터명: my-cluster / 노드명:  node-1 로 노드 실행
$ bin/elasticsearch -E cluster.name=my-cluster -E node.name="node-1"

 

환경설정이 elasticsearch.yml 과 커맨드 명령 -E에 모두 있는 경우에는 -E 명령에서 한 설정이 더 우선 설정됨.

 

5. 단일 서버, 단일 노드, 단일 클러스터


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

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

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

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

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

 

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

 

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

 

내부 IP로도 접속이 가능하도록 수정

 

elastic search가 돌아가고 있는 내부 ip 주소

우선 내부 ip로 접근이 가능한지 확인해보면, elasticsearch 결과가 나타나지 않을 것입니다.

 

// 내부 ip가 34.64.137.113 인 경우
curl 34.64.137.113:9200


elasticsearch는 기본적으로 localhost 로만 접근이 가능하도록 되어있기 때문입니다.

 

curl localhost:9200 
=> 접속 되는 것을 확인 가능

 

내부 ip 또는 공유 IP로 접근하려면 따로 설정이 필요하다.
elastic search가 inter network ip를 찾아서 setting 하는 방법이다.

 

//network.host: "10.178.0.2"
network.host: "_site_, "_local_"

 

오류 해결

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

 

network host 설정을 하지 않으면 elasticsearch 실행시 개발자 모드로 오류 없이 실행이 된다. (기본)
network host 값을 설정하게 되면 외부에서도 접속을 하게 되는 상태로 만들게 되면서
bootstrap check를 하게 되고 바로 실행이 되지 않는다.

 

오류를 해결하는 방법을 알아보자.

 

1. max file descriptions
  - 한 프로세스가 접근할 수 있는 파일에 제한을 두는데 이 값을 무한대로 바꿔줘야 함
  - limit.conf 파일에서 설정 변경
  - /etc/security/limits.conf 파일 설정 변경
  - 맨 마지막 줄에 계정이름 - nofile 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


elasticsearch.yml 파일 설정을 마치고 나면 아래와 같은 결과가 되어 있을 것입니다.

 

 

6. 단일 서버, 다중 노드, 다중 클러스터


한개의 서버에서, 세개의 노드를 사용하여 두개의 클러스터를 만드는 것입니다. (아래 그림 참고)

node-1 과 node-2는 하나의 클러스터로 묶여있기 때문에 데이터 교환이 일어납니다.

node-1로 입력된 데이터는 node-2에서도 읽을 수 있으며 그 반대도 가능합니다.

하지만 node-3은 클러스터가 다르기 때문에, node-1, node-2에 입력된 데이터를 node-3에서 읽을 수는 없습니다.

 

elaticsearch.yml 파일 설정은 아래와 같이 설정해주시면 됩니다.

node-3의 cluster 이름을 다르게 변경해 주는것이 포인트입니다.

#[node - 1] config/elasticsearch.yml 
cluster.name: es-cluster-1
node.name: "node-1"

#[node - 2] config/elasticsearch.yml 
cluster.name: es-cluster-1
node.name: "node-2"

#[node - 3] config/elasticsearch.yml 
cluster.name: es-cluster-2
node.name: "node-3"

 

7. 다중 서버, 다중 노드, 단일 클러스터


최종 프로젝트 구조입니다.

세개의 서버와, 세개의 노드로, 한개의 클러스터를 만들어봅시다.

 

 

 

 

Discovery

앞서 elasticsearch.yml 파일 설정 파트에서 discovery에 대한 설명을 간단히 하였는데, 다중 노드로 클러스터를 만들때 discovery에 대한 개념을 알고가야 하기 때문에 간단한 개념과, 노드를 하나의 클러스터로 묶어주는 과정을 간단히 살펴보도록  합시다.

  • 노드가 처음 실행될 때 같은 서버, 또는 discovery.seed_hosts: [ ] 에 설정된 네트워크 상의 다른 노드들을 찾아 하나의 클러스터로 바인딩하는 과정을 디스커버리 라고 함.
  • 디스커버리는 다음과 같은 순서로 이루어짐
    1. discovery.seed_hosts 설정에 있는 주소 순서대로 노드가 있는지 여부를 확인
      • 노드가 존재하는 경우 > cluster.name 확인
        • 일치하는 경우 > 같은 클러스터로 바인딩 > 종료
        • 일치하지 않는 경우 > 1로 돌아가서 다음 주소 확인 반복
      • 노드가 존재하지 않는 경우 > 1로 돌아가서 다음 주소 확인 반복
    2. 주소가 끝날때까지 노드를 찾지 못한 경우.
      • 스스로 새로운 클러스터 시작

 

 

 

자 이제 

우선 세개의 서버가 있어야합니다.

elastic-1, elastic-2, elastic-3

 

 

서버별 설정 추가

 

세개 서버에서 elasticsearch.yml 파일을 수정해줍니다.

 

elastic-1 서버의 노드 설정

 

elastic-2 서버의 노드 설정

 

elastic-3 서버의 노드 설정

 

리눅스 서버 설정

 

IP주소를 특정 이름으로 사용할 수 있도록 변화해 봅시다.

/etc/hosts 파일을 수정하면 alias name으로 사용할 수 있게 됩니다.

elastic-1, elastic-2, elastic-3 모두 추가해준다.

 

// sudo vi /etc/hosts
10.178.0.2 elastic-1
10.178.0.3 elastic-2
10.178.0.4 elastic-3

 

* 방화벽 제거 해줘야함. 9200, 9300을 open 해줘야 한다

 

curl 34.64.137.113:9200/_cat/nodes

 

아스타리카가 나타나 있는 것이 master node를 의미함. (node-2 가 master node로 설정되어 있습니다.)

 

 

아래의 커맨드로 더 상세하게 살펴볼 수도 있습니다.

 

curl 34.64.137.113:9200/_cat/nodes?v

 

 

 

 

'공부방 > Elasticsearch' 카테고리의 다른 글

Kibana  (0) 2023.05.09
elasticsearch - TLS 적용  (0) 2023.05.09
ghj  (0) 2023.05.03
Prometheus + Grafana  (0) 2023.05.02
test  (0) 2023.04.28