콘텐츠로 이동

오픈서치 HA

정리

나름의 오픈서치 고가용성을 위한 설치 설정내용을 정리 작성

Story

오픈서치를 사용하기 시작한 초기부터 사용 용도나 의존도(?)가 높아지면서 더 효율적인 설정과 좋은 성능이 더더욱 필요로 해졌다.

하여 초기에는 설치에만 집중했다면 이제는 다중 노드 설치를 지나 Role Base 노드 설치로 높은 성능을 기대해보고자 한다.

찾아보고 알아본 기준은 대부분 Opensearch 홈페이지나 ChatGPT의 도움을 받았다. 작성해둔 내용이 부족하면... 하단에 링크들을 참고!

기본설치 2 Node 구성

Opensearch 사이트 설치예시 에서 Sample docker-compose.yml를 참고

위 링크에서 정말 기본형의 좋은 예시를 제공하고 있다. (초기학습때 알았더라면...)

environment (기본 옵션)

  • cluster.name=클러스터의 이름
  • node.name=컨테이너에서 실행될 노드의 이름
  • discovery.seed_hosts=클러스터를 탐색할때 찾을 노드들을 지정 (가능하면 모든 노드를 작성)
  • cluster.initial_cluster_manager_nodes=클러스터 매니저 역할을 가진 노드를 지정
  • node.roles=클러스터 룰 (클러스터매니저, 데이터, 수집, 비워두면 조정)
  • bootstrap.memory_lock=JVM 힙메모리 스와핑을 비활성화
  • OPENSEARCH_JAVA_OPTS=JVM 힙 크기의 최소 및 최대 값을 시스템 RAM의 최소 50%로 설정
  • OPENSEARCH_INITIAL_ADMIN_PASSWORD=패스워드

RAM, Memory 설정 힌트

OPENSEARCH_JAVA_OPTS 설정과 Docker compose 작성시의 deploy.resources.limits.memory 설정은 매우 밀접한 관계이다.

오픈서치에서 가이드 되고 있는 기준으로 살펴본다면, 구성시 최소 4G를 권장하고 있는데 이때의 JAVA_OPTS 설정은 -Xms4g -Xmx4g가 적절한 값이 된다. 이를 참고하여 노드 메모리 구성값을 계산하자.

Docker compose 작성공유

요약

아래의 구성은 `node.roles` 역할을 분산하여 작성한 내용이다.
기본적으로 4노드 구성이되며 단일역할은 `클러스터매니저1`, `조정1` 두개이고 
전체역할 `노드2` 구성해두었다. 고가용성을 위해서 클러스터매니저 Role을 
기본 3개를 권장하는 내용을 보았는데 ... 
(자료의 위치를 까먹었다) 

아무튼 해당내용에 추가적인 노드가 필요하다면 
`Data` 수행하는 노드를 추가하면 기대성능이 올라갈 것으로 추측된다.

opensearch-compose.yml

# opensearch.yml
# index.number_of_replicas: 1 # 로운 인덱스가 생성될 때 기본적으로 복제본 수가 1로 설정하면 데이터의 가용성이 향상

# 공통 환경 변수 설정 (YAML 앵커 사용)
x-opensearch-environment: &opensearch-environment
  cluster.name: opensearch-cluster
  bootstrap.memory_lock: "true"
  OPENSEARCH_JAVA_OPTS: "-Xms4g -Xmx4g"
  OPENSEARCH_INITIAL_ADMIN_PASSWORD: "X2commerce!1"

services:
  opensearch-m1:
    image: opensearchproject/opensearch:2.17.0
    container_name: opensearch-m1
    environment:
      <<: *opensearch-environment
      node.name: opensearch-m1
      node.roles: '[cluster_manager]'
      discovery.seed_hosts: opensearch-m1,opensearch-d1,opensearch-d2
      cluster.initial_cluster_manager_nodes: opensearch-m1,opensearch-d1,opensearch-d2
    deploy:
      resources:
        limits:
          memory: 8g
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data-m1:/usr/share/opensearch/data
      - ./conf/opensearch-plugins-install.sh:/usr/share/opensearch/opensearch-plugins-install.sh
    ports:
      - 9200:9200
      - 9600:9600
    networks:
      - opensearch-net
    entrypoint:
      - /bin/sh
      - -c
      - |
        /usr/share/opensearch/opensearch-plugins-install.sh
        /usr/share/opensearch/opensearch-docker-entrypoint.sh

  opensearch-d1:
    image: opensearchproject/opensearch:2.17.0
    container_name: opensearch-d1
    environment:
      <<: *opensearch-environment
      node.name: opensearch-d1
        #node.roles: '[cluster_manager,data]'
      discovery.seed_hosts: opensearch-m1,opensearch-d1,opensearch-d2
      cluster.initial_cluster_manager_nodes: opensearch-m1,opensearch-d1,opensearch-d2
    deploy:
      resources:
        limits:
          memory: 8g
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data
      - ./conf/opensearch-plugins-install.sh:/usr/share/opensearch/opensearch-plugins-install.sh
    networks:
      - opensearch-net
    entrypoint:
      - /bin/sh
      - -c
      - |
        /usr/share/opensearch/opensearch-plugins-install.sh
        /usr/share/opensearch/opensearch-docker-entrypoint.sh

  opensearch-d2:
    image: opensearchproject/opensearch:2.17.0
    container_name: opensearch-d2
    environment:
      <<: *opensearch-environment
      node.name: opensearch-d2
        #node.roles: '[cluster_manager,data]'
      discovery.seed_hosts: opensearch-m1,opensearch-d1,opensearch-d2
      cluster.initial_cluster_manager_nodes: opensearch-m1,opensearch-d1,opensearch-d2
    deploy:
      resources:
        limits:
          memory: 8g
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data2:/usr/share/opensearch/data
      - ./conf/opensearch-plugins-install.sh:/usr/share/opensearch/opensearch-plugins-install.sh
    networks:
      - opensearch-net
    entrypoint:
      - /bin/sh
      - -c
      - |
        /usr/share/opensearch/opensearch-plugins-install.sh
        /usr/share/opensearch/opensearch-docker-entrypoint.sh

  opensearch-c1:
    image: opensearchproject/opensearch:2.17.0
    container_name: opensearch-c1
    environment:
      <<: *opensearch-environment
      node.name: opensearch-c1
      node.roles: '[]'
      discovery.seed_hosts: opensearch-m1,opensearch-d1,opensearch-d2
      cluster.initial_cluster_manager_nodes: opensearch-m1,opensearch-d1,opensearch-d2
    deploy:
      resources:
        limits:
          memory: 8g
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data-c1:/usr/share/opensearch/data
      - ./conf/opensearch-plugins-install.sh:/usr/share/opensearch/opensearch-plugins-install.sh
    networks:
      - opensearch-net
    entrypoint:
      - /bin/sh
      - -c
      - |
        /usr/share/opensearch/opensearch-plugins-install.sh
        /usr/share/opensearch/opensearch-docker-entrypoint.sh

  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:latest
    container_name: opensearch-dashboards
    ports:
      - 5601:5601
    expose:
      - "5601"
    environment:
      OPENSEARCH_HOSTS: '["https://opensearch-c1:9200"]'
    networks:
      - opensearch-net

# 볼륨 설정
volumes:
  opensearch-data1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/opensearch-dir/data-d1
  opensearch-data2:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/opensearch-dir/data-d2
  opensearch-data-c1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/opensearch-dir/data-c1
  opensearch-data-m1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /data/opensearch-dir/data-m1

# 네트워크 설정
networks:
  opensearch-net: