이번에는 직접 이전 블로그 포스팅 했던 내용을 기반으로 클러스터를 구성해보려고 한다.
위와 같이 구성하였으며 클러스터 매니저 노드를 위한 서버 1개, 데이터&인제스터 노드 2개, 코디네이터 전용 노드 1개로 총 4개의 서버를 이용하였다.
AMI를 이용한 서버 생성
우선 하나의 ec2 서버를 생성하고 OpenSearch를 설치한다. 이때 실행은 하지 않는다. 아래 글을 참고한다.
실행은 하지 않으며 systemctl service에 등록만 한다.
그리고 해당 서버로 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에 대한 내용이 있다.
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는 소문자로 바뀐다.
'Data Engineering > Distributed System' 카테고리의 다른 글
[OpenSearch] - 4. 분산 아키텍처 & 각 노드 역할과 샤드 (0) | 2024.01.06 |
---|---|
[OpenSearch] - 3. Inverted Index ( 역인덱스 ) (1) | 2024.01.06 |
[OpenSearch] - 2. 텍스트 분석 (0) | 2024.01.06 |
[OpenSearch] - 1. OpenSearch 구조와 동작방식 알아보기 & CRUD 등 여러 동작 실습하기 (2) | 2024.01.04 |
Zookeeper Cli & java API 사용하기 (0) | 2024.01.04 |