Data Engineering/Distributed System

[OpenSearch] - 5. 직접 OpenSearch 클러스터 구성해보기

cstory-bo 2024. 1. 6. 22:58

이번에는 직접 이전 블로그 포스팅 했던 내용을 기반으로 클러스터를 구성해보려고 한다.

출처:  https://opensearch.org/docs/latest/opensearch/cluster/

위와 같이 구성하였으며 클러스터 매니저 노드를 위한 서버 1개, 데이터&인제스터 노드 2개, 코디네이터 전용 노드 1개로 총 4개의 서버를 이용하였다.

AMI를 이용한 서버 생성

우선 하나의 ec2 서버를 생성하고 OpenSearch를 설치한다. 이때 실행은 하지 않는다. 아래 글을 참고한다.
실행은 하지 않으며 systemctl service에 등록만 한다.

2023.12.27 - [Data Engineering/Distributed System] - EFK(ELK) 구축 해보기!! (서버 로그 수집) - 4. OpenSearch와 Open Dashboard 설치하기

 

EFK(ELK) 구축 해보기!! (서버 로그 수집) - 4. OpenSearch와 Open Dashboard 설치하기

우선 Fluentd를 진행 중이선 서버1은 놔두고 서버2로 들어간다. Fluentd에서 OpenSearch로 로그를 보내려면 서버 2에 OpenSearch가 설치되어있어야 하기 때문에 서버2에 OpenSearch 설치와 함께 Dashboard까지 설

cstory-bo.tistory.com

그리고 해당 서버로 AWS 인스터스 > 작업 > 이미지 및 템플릿 > 이미지 생성으로 들어가서 이미지를 생성한다.

이후 AMI로 인스턴스 시작으로 인스턴스 4대를 생성한다. 이때 서버 크기를 medium으로 한다. 혹시나 micro로 만들어보았었는데 메모리 문제로 안됐다...

각 서버 구성

이제는 서버 하나씩 들어가서 OpenSearch 설정파일에 역할을 부여한다.

config 폴더 내 opensearch.yml 파일에 들어간다.

Cluster Manager 노드 설정

plugins.security.disabled: true
cluster.name: opensearch-cluster
node.name: opensearch-cluster_manager
node.roles: [ cluster_manager ]
network.host: 0.0.0.0
discovery.seed_hosts: [0.0.0.0]
cluster.initial_cluster_manager_nodes: ["opensearch-cluster_manager"]

그리고 다시 systemctl restart opensearch.service 해준다.

이러고 다시 Elasticvue에 클러스터 매니저 노드를 연결하고 nodes 탭을 확인하면 바인딩 된것을 확인할 수 있다.

아래 포스팅에 elasticvue에 대한 내용이 있다.

2024.01.04 - [Data Engineering/Distributed System] - [OpenSearch] - 1. OpenSearch 구조와 동작방식 알아보기 & CRUD 등 여러 동작 실습하기

 

[OpenSearch] - 1. OpenSearch 구조와 동작방식 알아보기 & CRUD 등 여러 동작 실습하기

OpenSearch 구성 요소 opensearch는 RDBMS와 사용하는 용어가 다르다. 테이블 -> 인덱스 레코드 -> 도큐먼트 컬럼 -> 필드 스키마 -> 매핑 인덱스란 말이 어색할 수도 있는데, RDBMS에서 인덱스는 보통 빠른

cstory-bo.tistory.com

 

Data & Ingest 노드 설정

plugins.security.disabled: true
cluster.name: opensearch-cluster
node.name: opensearch-d{1 or 2}
node.roles: [ data, ingest ]
network.host: 0.0.0.0
discovery.seed_hosts: ["<CLUSTER_MANAGER_NODE_PUBLIC_IP>"]

위에 node.name만 다르게해서 2개의 서버에 설정한다.

Coordinator 노드 설정

plugins.security.disabled: true
cluster.name: opensearch-cluster
node.name: opensearch-c1
node.roles: []
network.host: 0.0.0.0
discovery.seed_hosts: ["<CLUSTER_MANAGER_NODE_PUBLIC_IP>"]

cluster manager 노드는 다른 이외의 노드들에 대해 모두 알고 있기에 Elasticvue에 클러스터 매니저 노드만 설정해도 전체 노드들을 볼 수 있다.

만약 여기서 Manager 노드의 opensearch.service를 잠깐 멈추면 어떻게 될까?

원래는 매니저 노드를 재선출 하겠지만, 지금은 후보 노드를 만들지 않았기에 서비스가 멈춘다.

그래서 다시 매니저 노드도 실행하고 위의 설정 중에 데이터&인제스트 노드 d1에 후보 역할도 추가해보았다.

node.roles: [ data, ingest, cluster_manager ]

다시 매니저 노드를 멈추면, 이번에도 에러로그가 뜬다. 이번에는 그 이유는 Quorum 때문이다. 재선출 할 때 투표를 하는 데 이때 과반수 이상이어야한다. 그래서 d2 노드에서 후보 역할을 부여한다.

Ingest 노드 파이프라인 설정

PUT /_ingest/pipeline/test-pipeline API로 Ingest 파이프라인을 설정할 수 있다. 

$ curl -XPUT "$OPENSEARCH_REST_API/_ingest/pipeline/test-pipeline?pretty=true" \
	-H "Content-Type: application/json" \
	-d '
{
  "processors": [
    {
      "set": {
        "field": "field1",
        "value": 10
      }
    },
    {
      "lowercase": {
        "field": "field2"
      }
    }
  ]
}
'

예를 들어 이렇게 설정하면 set으로 인해 field1의 모든 값은 10으로 바뀌고, field2는 소문자로 바뀐다.