콘텐츠로 이동

고가용성 OpenSearch

개요

OpenSearch는 Elasticsearch OSS 7.10.2에서 파생된 오픈 소스 분산 검색 및 분석 제품군입니다. 대화형 로그 분석, 실시간 애플리케이션 모니터링, 데이터 분석과 같은 기본 기능을 손쉽게 수행할 수 있습니다.

노드 유형 설명 프로덕션 모범 사례
Cluster manager 클러스터의 전체 작업을 관리하고 클러스터 상태를 추적합니다. 여기에는 인덱스 생성 및 삭제, 클러스터에 조인하거나 떠나는 노드 추적, ping 요청을 실행하여 클러스터 내 각 노드의 상태 확인, 노드에 샤드 할당 등이 포함됩니다. 거의 모든 프로덕션 사용 사례에서 세 개의 서로 다른 영역에 세 개의 전용 클러스터 관리자 노드를 두는 것이 올바른 방법입니다. 이 구성은 클러스터가 쿼럼을 잃지 않도록 보장합니다. 두 노드는 대부분의 시간 동안 유휴 상태이며, 다른 노드에 장애가 발생하거나 유지보수가 필요할 때만 사용됩니다.
Cluster manager eligible 투표 과정을 통해 그중 하나의 노드가 클러스터 관리자 노드로 선택됩니다. 프로덕션 클러스터의 경우 전용 클러스터 관리자 노드를 보유해야 합니다. 전용 노드 유형을 구현하는 방법은 다른 모든 노드 유형을 false로 표시하는 것입니다. 이 경우 다른 모든 노드는 클러스터 관리자 eligible 노드가 아닌 것으로 표시해야 합니다.
Data 데이터를 저장하고 검색합니다. 로컬 샤드에서 데이터 관련 작업(인덱싱, 검색, 집계)을 모두 수행합니다. 이들은 클러스터의 작업 노드이며 다른 노드 유형보다 더 많은 디스크 공간이 필요합니다. 데이터 노드를 추가할 때는 영역 간 균형을 유지하세요. 예를 들어, 세 개의 영역이 있는 경우 세 개의 배수로 데이터 노드를 추가하고 각 영역에 하나씩 배치합니다. 스토리지와 RAM이 큰 노드를 사용하는 것이 좋습니다.
Ingest 데이터를 클러스터에 저장하기 전에 전처리합니다. 수집 파이프라인을 실행하여 데이터를 인덱스에 추가하기 전에 변환합니다. 대량의 데이터를 수집하고 복잡한 수집 파이프라인을 실행할 계획이라면 전용 수집 노드를 사용하는 것이 좋습니다. 또한 데이터 노드에서 인덱싱을 오프로드하여 데이터 노드가 검색 및 집계에 전념하도록 선택할 수도 있습니다.
Coordinating 클라이언트 요청을 데이터 노드의 샤드에 위임하고, 결과를 수집 및 집계하여 최종 결과로 만든 다음 해당 결과를 클라이언트에 다시 보냅니다. 한두 개의 전용 조정 전용 노드는 검색량이 많은 워크로드의 병목 현상을 방지할 수 있습니다. 가능한 한 많은 코어를 가진 CPU를 사용하는 것이 좋습니다.
Dynamic 특정 노드를 머신러닝(ML) 작업과 같은 사용자 정의 작업에 위임하여 데이터 노드의 리소스 소비를 방지하므로 OpenSearch 기능에 영향을 미치지 않습니다.

사전 요구 사항

기본 정보 및 호환성

참고

아래 구성 정보는 Guance 및 고가용성 OpenSearch 배포 시나리오 구성입니다.

호스트명 IP 주소 역할 K8s 구성 데이터 디스크 스토리지
k8s-master 192.168.100.101 k8s,master 4 CPU, 16G MEM, 100G DISK
K8s-node01 192.168.100.102 k8s,node01 4 CPU, 16G MEM, 100G DISK
K8s-node02 192.168.100.103 k8s,node02 4 CPU, 16G MEM, 100G DISK
K8s-node03 192.168.100.104 k8s,node03 4 CPU, 16G MEM, 100G DISK
K8s-node04 192.168.100.105 opensearch, master, coordinating 4 CPU, 16G MEM, 100G DISK /data:20G
K8s-node05 192.168.100.106 opensearch, master, coordinating 4 CPU, 16G MEM, 100G DISK /data:20G
K8s-node06 192.168.100.107 opensearch, master, coordinating 4 CPU, 16G MEM, 100G DISK /data:20G
K8s-node07 192.168.100.108 opensearch, data 8CPU, 32G MEM, 100G DISK /data:1T
K8s-node08 192.168.100.109 opensearch, data 8CPU, 32G MEM, 100G DISK /data:1T
K8s-node09 192.168.100.110 opensearch, data 8CPU, 32G MEM, 100G DISK /data:1T
이름 설명
OpenSearch 버전 2.4.1
오프라인 설치 지원 여부
지원 아키텍처 amd64/arm64

기본 구성

OpenSearch URL opensearch-cluster-client.middleware
OpenSearch 포트 9200
OpenSearch 계정 openes/kJMerxk3PwqQ
master JVM 크기 2G
client JVM 크기 4G
data JVM 크기 20G

설치 단계

OpenSearch는 리소스를 많이 사용하므로 클러스터 리소스를 독점적으로 사용해야 합니다. 따라서 사전에 클러스터 스케줄링을 구성해야 합니다.

1. 클러스터 레이블 설정

다음 명령을 실행하여 클러스터에 레이블을 지정합니다:

kubectl label node 192.168.100.105 192.168.100.106  192.168.100.107 openes=masts-client
kubectl label node 192.168.100.108 192.168.100.109 192.168.100.110  openes=data

레이블 확인:

kubectl get nodes --show-labels  | grep 'openes'

2. 클러스터 테인트(Taint) 설정

다음 명령을 실행하여 클러스터 테인트를 설정합니다:

kubectl taint node 192.168.100.105 192.168.100.106  192.168.100.107 192.168.100.108 192.168.100.109 192.168.100.110 app=openes:NoExecute

3. OpenEBS StorageClass 설정 (선택 사항)

OpenEBS 참조 문서: OpenEBS 배포

퍼블릭 클라우드를 사용하는 경우 퍼블릭 클라우드 스토리지 블록 구성 요소를 참조하세요.

다음 YAML 구성을 배포합니다:

apiVersion: storage.k8s.io/v1
allowVolumeExpansion: true
kind: StorageClass
metadata:
  annotations:
    cas.openebs.io/config: |
      - name: StorageType
        value: "hostpath"
      - name: BasePath
        value: "/data"
  name: openebs-data
provisioner: openebs.io/local
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer

/data 디렉터리의 디스크 용량이 충분한지 확인하세요.

4. Charts 패키지 다운로드

helm pull opensearch-cluster --repo https://pubrepo.guance.com/chartrepo/dataflux-chart  --untar

5. values 구성 수정

opensearch-cluster 디렉터리 아래의 values.yaml을 수정합니다.

각 역할의 opensearchJavaOpts, nodeSelector, tolerations, storageClass 매개변수를 수정합니다.

실제 상황에 따라 설정하고, 파일 형식에 주의하며, 각 역할의 resource 제한은 실제 상황에 따라 설정할 수 있습니다. replicas는 홀수가 좋으며, 스플릿 브레인을 방지합니다.

opensearch-master:
...
  replicas: 3
  opensearchJavaOpts: "-Xmx2g -Xms2g" 
  nodeSelector:
    openes: masts-client # client와 master가 동일한 머신에 있음
  tolerations:
  - effect: NoExecute
    key: app
    operator: Equal
    value: openes  
  persistence:
    ...
    storageClass: openebs-data 

opensearch-client:
...
  replicas: 3
  opensearchJavaOpts: "-Xmx2g -Xms2g" 
  nodeSelector:
    openes: masts-client # client와 master가 동일한 머신에 있음
  tolerations:
  - effect: NoExecute
    key: app
    operator: Equal
    value: openes  
  persistence:
    ...
    storageClass: openebs-data 

opensearch-data:
...
  replicas: 3
  opensearchJavaOpts: "-Xmx20g -Xms20g" 
  nodeSelector:
    openes: data
  tolerations:
  - effect: NoExecute
    key: app
    operator: Equal
    value: openes    
  persistence:
    ...
    storageClass: openebs-data     

6. Helm 설치

opensearch-cluster 디렉터리에서 실행해야 합니다.

helm install opensearch-cluster -n middleware ./ --create-namespace

출력 결과:

Release "opensearch-cluster" has been isntalld. Happy Helming!
NAME: opensearch-cluster
LAST DEPLOYED: Wed Nov  2 20:26:16 2022
NAMESPACE: middleware
STATUS: deployed
REVISION: 1
TEST SUITE: None

7. 배포 및 구성 확인

7.1 컨테이너 상태 확인

kubectl get pods -A -l     app.kubernetes.io/instance=opensearch-cluster

출력 결과:

NAMESPACE    NAME                          READY   STATUS    RESTARTS   AGE
middleware   opensearch-cluster-client-0   1/1     Running   0          63m
middleware   opensearch-cluster-client-1   1/1     Running   0          4m52s
middleware   opensearch-cluster-client-2   1/1     Running   0          4m47s
middleware   opensearch-cluster-data-0     1/1     Running   0          63m
middleware   opensearch-cluster-data-1     1/1     Running   0          63m
middleware   opensearch-cluster-data-2     1/1     Running   0          63m
middleware   opensearch-cluster-master-0   1/1     Running   0          63m
middleware   opensearch-cluster-master-1   1/1     Running   0          63m
middleware   opensearch-cluster-master-2   1/1     Running   0          4m31s

Running 상태는 배포 성공을 의미합니다.

7.2 사용자 생성

kJMerxk3PwqQ는 설정된 비밀번호이며, 사용자 정의하여 수정할 수 있습니다.

kubectl exec -ti -n middleware opensearch-cluster-client-0 -c opensearch-client \
    -- curl -X PUT -u admin:admin  http://127.0.0.1:9200/_plugins/_security/api/internalusers/openes \
    -H  'Content-Type: application/json' \
    -d '{"password": "kJMerxk3PwqQ","opendistro_security_roles": ["all_access"]}'

출력 결과:

{"status":"CREATED","message":"'openes' created."}

7.3 사용자 확인

사용자 생성 시 문서 기본 비밀번호를 수정한 경우 명령어를 수정하세요.

다음 명령을 실행합니다:

kubectl exec -ti -n middleware opensearch-cluster-client-0 -c opensearch-client -- curl -u openes:kJMerxk3PwqQ  http://127.0.0.1:9200/_cat/indices

출력 결과:

green open security-auditlog-2022.11.02 bwpC6JXiTzeqcC9YT8vksg 1 1  3 0  87.7kb 43.8kb
green open .kibana_1                    D_GsZGbKT0aIGEGkhnTajg 1 1  0 0    416b   208b
green open .opendistro_security         _723x9PCQZO8BosxrG_2cg 1 2 10 0 182.1kb 78.7kb

제거

helm uninstall opensearch-cluster -n middleware 

문서 평가

이 페이지가 도움이 되었나요?