Skip to content
SON BLOG
Go back

목적에 맞는 OpenSearch Docker Compose 구성

Edit page

1. 개발/PoC 용 단일 노드 (docker-compose-poc.yml)

version: "3.8"
services:
  os:
    image: opensearchproject/opensearch:latest
    container_name: os-poc
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g
      - DISABLE_SECURITY_PLUGIN=true
    ports:
      - "9200:9200"
    ulimits:
      memlock: { soft: -1, hard: -1 }

설명: 최소 구성으로 빠르게 기능 시연, 테스트에 적합하다.

2. 개발/PoC + Performance Analyzer

version: "3.8"
services:
  os:
    image: opensearchproject/opensearch:latest
    container_name: os-poc-pa
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g
      - DISABLE_SECURITY_PLUGIN=true
    ports:
      - "9200:9200"
      - "9600:9600"
    ulimits:
      memlock: { soft: -1, hard: -1 }

설명: 9600 포트를 열어 성능 분석 모듈 사용 가능하다.


3. 테스트용 보안 비활성 단일 노드

version: "3.8"
services:
  os:
    image: opensearchproject/opensearch:latest
    container_name: os-nosec
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g
      - DISABLE_INSTALL_DEMO_CONFIG=true
      - DISABLE_SECURITY_PLUGIN=true
      - DISABLE_SECURITY_DASHBOARDS_PLUGIN=true
    ports:
      - "9200:9200"
    ulimits:
      memlock: { soft: -1, hard: -1 }

설명: 보안 모듈을 완전히 비활성화하여 개발 환경 접근성을 높인다.


4. 벡터 검색 PoC 단일 노드

version: "3.8"
services:
  os:
    image: opensearchproject/opensearch:latest
    container_name: os-vector-poc
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g
    ports:
      - "9200:9200"
    ulimits:
      memlock: { soft: -1, hard: -1 }

설명: 플러그인을 Dockerfile에서 추가 빌드하고 벡터 검색 테스트 가능하다.

5. 중규모 운영: 클러스터 관리자 · 데이터 노드 분리

version: "3.8"
services:
  master:
    image: opensearchproject/opensearch:latest
    container_name: os-master
    environment:
      - node.name=master
      - node.roles=cluster_manager
      - discovery.seed_hosts=master,data
      - cluster.initial_cluster_manager_nodes=master
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g
    ulimits:
      memlock: { soft: -1, hard: -1 }

  data:
    image: opensearchproject/opensearch:latest
    container_name: os-data
    environment:
      - node.name=data
      - node.roles=data,ingest
      - discovery.seed_hosts=master,data
      - cluster.initial_cluster_manager_nodes=master
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms4g -Xmx4g
    ulimits:
      memlock: { soft: -1, hard: -1 }

설명: 역할 분리를 통해 안정성과 처리 가능 성능 확보가 가능하다.

6. 중규모 운영: 다중 데이터 노드 + Dashboards

version: "3.8"
services:
  master:
    <<: *master-def

  data1:
    image: opensearchproject/opensearch:latest
    container_name: os-data1
    environment:
      - node.name=data1
      - node.roles=data,ingest
      - discovery.seed_hosts=master,data1,data2
      - cluster.initial_cluster_manager_nodes=master
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms4g -Xmx4g
    ulimits:
      memlock: { soft: -1, hard: -1 }
    volumes:
      - data1-vol:/usr/share/opensearch/data

  data2:
    <<: *data1
    container_name: os-data2
    environment:
      - node.name=data2
      - discovery.seed_hosts=master,data1,data2

  dashboards:
    image: opensearchproject/opensearch-dashboards:latest
    container_name: os-dash
    environment:
      - OPENSEARCH_HOSTS=["http://master:9200"]
    depends_on:
      - master
      - data1
      - data2
    ports:
      - "5601:5601"

volumes:
  data1-vol:
  data2-vol:

설명: 여러 데이터 노드로 색인·검색 요청 병렬 처리 가능하다.

7. 고가용성 3노드 클러스터 (docker-compose-ha.yml)

version: "3.8"
services:
  node1, node2, node3:
    image: opensearchproject/opensearch:latest
    environment:
      - node.name=<각각>
      - node.roles=cluster_manager,data,ingest
      - discovery.seed_hosts=node1,node2,node3
      - cluster.initial_cluster_manager_nodes=node1,node2,node3
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g
    ulimits:
      memlock: { soft: -1, hard: -1 }
    networks:
      - os-net

networks:
  os-net:
    driver: bridge

설명: 복제(shard replica) 설정 시 한 노드 장애에도 자동 복구 가능하다.

8. ML/벡터 검색 분리 클러스터

version: "3.8"
services:
  data:
    image: opensearchproject/opensearch:latest
    container_name: os-data
    environment:
      - node.roles=data,ingest
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms4g -Xmx4g
    ulimits:
      memlock: { soft: -1, hard: -1 }

  ml:
    image: opensearchproject/opensearch:latest
    container_name: os-ml
    environment:
      - node.roles=ml
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g
      - plugins.ml_commons.only_run_on_ml_node=true
    ulimits:
      memlock: { soft: -1, hard: -1 }

설명: 벡터·ML 임베딩 처리만 전담하는 ML 노드를 분리해 자원 충돌 방지한다.

9. 대용량 벡터: on‑disk 모드

version: "3.8"
services:
  os:
    image: opensearchproject/opensearch:latest
    environment:
      - discovery.type=single-node
      - NODE_OPTIONS=-Dknn.engine=faissOnDisk
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms4g -Xmx4g
    ports:
      - "9200:9200"
    ulimits:
      memlock: { soft: -1, hard: -1 }

설명: faissOnDisk 모드로 메모리 절약하면서도 P90 응답 100–200ms 수준 유지 가능하다.

10. TLS 및 보안 구성 포함

version: "3.8"
services:
  os:
    image: opensearchproject/opensearch:latest
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - OPENSEARCH_JAVA_OPTS=-Xms2g -Xmx2g
      - plugins.security.ssl.http.enabled=true
      - plugins.security.ssl.http.keystore.type=jks
      - plugins.security.ssl.http.keystore.path=certs/http.jks
      - plugins.security.ssl.http.keystore.password=changeme
      - plugins.security.ssl.http.truststore.type=jks
      - plugins.security.ssl.http.truststore.path=certs/http.jks
      - plugins.security.ssl.http.truststore.password=changeme
    volumes:
      - ./certs:/usr/share/opensearch/config/certs:ro
    ports:
      - "9200:9200"
    ulimits:
      memlock: { soft: -1, hard: -1 }

설명: TLS 인증서를 마운트하여 보안 테스트 환경 구축이 가능하다.

구성 요약 표

#구성목적
1단일 노드 PoC기능 검증, 빠른 배포
2단일 노드 + Performance성능 진단 시스템
3단일 노드 + 보안 비활성접근이 쉬운 테스트 환경
4단일 노드 + 벡터 PoC벡터 검색 기능 테스트
5중규모(role 분리)역할 구분으로 안정적 운영 구조 확보
6다중 데이터 노드 + Dashboards부하 분산 시스템 구축
7HA 3노드 클러스터장애 복구 및 가용성 강화
8데이터 + ML 분리벡터/ML 워크로드 자원 분리 최적화
9벡터 on‑disk 모드대용량 벡터 색인 시 메모리 절약 및 성능 유지
10TLS 보안 구성 포함보안 테스트 환경 구축

결론 및 활용 팁

현재 쓰고 있는 docker-compose.yml

#
# sudo swapoff -a
# sudo vi /etc/sysctl.conf => vm.max_map_count=262144
# sudo sysctl -w vm.max_map_count=262144
# sudo sysctl -p
---
x-opensearch-environment: &opensearch-environment
  cluster.name: opensearch-cluster
  bootstrap.memory_lock: "true"
  OPENSEARCH_JAVA_OPTS: "-Xms4g -Xmx4g"
  OPENSEARCH_INITIAL_ADMIN_PASSWORD: "X2commerce!1"
  plugins.security.ssl.http.enabled: false

services:
  opensearch-node1:
    image: opensearchproject/opensearch:3
    container_name: opensearch-node1
    environment:
      <<: *opensearch-environment
      - node.name=opensearch-node1
      - discovery.seed_hosts=opensearch-node1,opensearch-node2
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
      - bootstrap.memory_lock=true
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536  # maximum number of open files for the OpenSearch user, set to at least 65536 on modern systems
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data
    ports:
      - 9200:9200
      - 9600:9600  # required for Performance Analyzer
    networks:
      - opensearch-net
  opensearch-node2:
    image: opensearchproject/opensearch:3
    container_name: opensearch-node2
    environment:
      <<: *opensearch-environment
      - node.name=opensearch-node2
      - discovery.seed_hosts=opensearch-node1,opensearch-node2
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
      - bootstrap.memory_lock=true
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data2:/usr/share/opensearch/data
    networks:
      - opensearch-net
  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:3
    container_name: opensearch-dashboards
    ports:
      - 5601:5601
    expose:
      - '5601'
    environment:
      OPENSEARCH_HOSTS: '["https://opensearch-node1:9200","https://opensearch-node2:9200"]'
    networks:
      - opensearch-net

volumes:
  opensearch-data1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /home/tech/data/opensearch-dir/data-d1
  opensearch-data2:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /home/tech/data/opensearch-dir/data-d2

networks:
  opensearch-net:

아래는 제공하신 OpenSearch Docker Compose 구성 파일을 요소별로 분해하고 각 설정의 의미와 목적을 상세히 설명한 정리이다. 시스템 커널 설정부터 각 서비스 구성, 노드 설정, 네트워크, 볼륨까지 전반적으로 분석하였다.

1. 커널 설정 (호스트 측)

sudo swapoff -a
sudo vi /etc/sysctl.conf
# 추가: vm.max_map_count=262144
sudo sysctl -w vm.max_map_count=262144
sudo sysctl -p

2. 공통 환경 변수 정의 (x-opensearch-environment)

x-opensearch-environment: &opensearch-environment
  cluster.name: opensearch-cluster
  bootstrap.memory_lock: "true"
  OPENSEARCH_JAVA_OPTS: "-Xms4g -Xmx4g"
  OPENSEARCH_INITIAL_ADMIN_PASSWORD: "X2commerce!1"
  plugins.security.ssl.http.enabled: false
항목설명
cluster.name클러스터 이름. 여러 노드가 동일한 클러스터로 인식되도록 설정
bootstrap.memory_lock메모리를 락(lock) 걸어 스왑 방지. 성능 안정성 확보
OPENSEARCH_JAVA_OPTSJVM 힙 메모리 설정 (4GB로 고정). 시스템 메모리의 절반 이하로 설정 권장
OPENSEARCH_INITIAL_ADMIN_PASSWORD초기 admin 계정 비밀번호 설정
plugins.security.ssl.http.enabledHTTP 보안 비활성화 (기본 TLS OFF)

3. OpenSearch 노드 설정

(1) opensearch-node1 / opensearch-node2

공통

image: opensearchproject/opensearch:3
container_name: ...
environment:
  <<: *opensearch-environment
  - node.name=opensearch-nodeX
  - discovery.seed_hosts=opensearch-node1,opensearch-node2
  - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
  - bootstrap.memory_lock=true
ulimits:
  memlock:
    soft: -1
    hard: -1
  nofile:
    soft: 65536
    hard: 65536
항목설명
node.name노드 식별 이름. 클러스터 내 고유해야 함
discovery.seed_hosts초기 클러스터 탐색 대상 노드 목록. 클러스터 조인을 위해 반드시 설정
cluster.initial_cluster_manager_nodes클러스터 초기 매니저 노드 목록. 클러스터 생성 시 필수
ulimits.memlock메모리 락 제한을 무제한으로 설정하여 힙 메모리 고정 가능하게 함
ulimits.nofileOpenSearch가 열 수 있는 파일 수. 65536 이상 권장

추가 항목 (node1)

ports:
  - 9200:9200
  - 9600:9600
포트설명
9200REST API 및 클라이언트 요청 포트
9600Performance Analyzer(성능 분석 도구)용 포트

추가 항목 (volumes)

volumes:
  - opensearch-dataX:/usr/share/opensearch/data

4. Dashboards 설정

image: opensearchproject/opensearch-dashboards:3
container_name: opensearch-dashboards
ports:
  - 5601:5601
expose:
  - '5601'
environment:
  OPENSEARCH_HOSTS: '["https://opensearch-node1:9200","https://opensearch-node2:9200"]'
항목설명
OPENSEARCH_HOSTS연결 대상 OpenSearch 노드의 주소. HTTPS 사용 시 TLS 인증서 필요
5601Dashboards UI 포트 (Kibana와 유사)
expose내부 Docker 네트워크에서 열리는 포트 (호스트에는 직접 노출되지 않음)

5. 볼륨 설정

volumes:
  opensearch-data1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /home/tech/data/opensearch-dir/data-d1
  opensearch-data2:
    ...
항목설명
driver: local일반적인 Docker 호스트 볼륨 사용
type: none + o: bindDocker에서 외부 디렉토리를 직접 마운트
device실제 호스트 파일 시스템 경로. 디스크 분리/백업이 가능하게 구성됨

6. 네트워크 설정

networks:
  opensearch-net:

종합 판단

항목설정 수준평가
클러스터 구성2노드다중 노드 기반 최소 클러스터 구성
자원 설정JVM 힙 4GB중간 규모 이상 처리량 가능
성능 모니터링9600 포트 활성화Performance Analyzer 사용 가능
보안 설정TLS 비활성내부망 전용 또는 개발용 환경에 적합
디스크 마운트로컬 경로 지정운영 데이터 지속성 확보
확장성높음3번째 노드 추가 시 고가용성 구성 완성 가능

필요 시 다음 항목도 추가 구성 가능하다.

여기에 ML 노드를 추가하면?

현재 구성에 ML 전용 노드 (opensearch-ml-node)를 하나 추가하려면, 아래와 같이 Docker Compose에 노드를 하나 더 정의하고 node.roles=ml을 설정하면 된다.

이 노드는 ML 추론 전용이며, text embedding, 벡터 생성 등에 활용된다.

services:
  opensearch-node1:
    image: opensearchproject/opensearch:3
    container_name: opensearch-node1
    environment:
      <<: *opensearch-environment
      - node.name=opensearch-node1
      - discovery.seed_hosts=opensearch-node1,opensearch-node2,opensearch-ml-node
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
    ...

  opensearch-node2:
    image: opensearchproject/opensearch:3
    container_name: opensearch-node2
    environment:
      <<: *opensearch-environment
      - node.name=opensearch-node2
      - discovery.seed_hosts=opensearch-node1,opensearch-node2,opensearch-ml-node
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
    ...

  opensearch-ml-node:
    image: opensearchproject/opensearch:3
    container_name: opensearch-ml-node
    environment:
      <<: *opensearch-environment
      - node.name=opensearch-ml-node
      - node.roles=ml
      - discovery.seed_hosts=opensearch-node1,opensearch-node2,opensearch-ml-node
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
      - plugins.ml_commons.only_run_on_ml_node=true
      - plugins.ml_commons.task_dispatch_policy=round_robin
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data-ml:/usr/share/opensearch/data
    networks:
      - opensearch-net

volumes:
  opensearch-data1:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /home/tech/data/opensearch-dir/data-d1
  opensearch-data2:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /home/tech/data/opensearch-dir/data-d2
  opensearch-data-ml:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /home/tech/data/opensearch-dir/data-ml

주요 변경사항 요약

항목설명
node.roles=mlML 전용 노드로 설정하여 색인, 검색 등의 작업은 하지 않고 ML 태스크만 처리함
plugins.ml_commons.only_run_on_ml_node=trueML 태스크가 이 노드에서만 실행되도록 제한
discovery.seed_hosts모든 노드에서 ml 노드를 포함하여 클러스터에 조인하도록 설정
cluster.initial_cluster_manager_nodesML 노드는 manager가 아니므로 여기에 포함되지 않음
plugins.ml_commons.task_dispatch_policy=round_robinML 태스크 분산 방식 설정 (옵션)

OpenSearch에서 ML 전용 노드만 사용되도록 설정하려면, 다음 2가지 설정이 핵심이다.

1. node.roles: ml

- node.roles=ml

2. plugins.ml_commons.only_run_on_ml_node: true

- plugins.ml_commons.only_run_on_ml_node=true

예시 요약

  opensearch-ml-node:
    environment:
      - node.roles=ml
      - plugins.ml_commons.only_run_on_ml_node=true

이렇게 설정하면 ML 태스크(text_embedding, model_predict, model_train) 등은 오직 opensearch-ml-node에서만 처리된다.

추가 옵션 (선택)

설정 키설명예시
plugins.ml_commons.task_dispatch_policy여러 ML 노드가 있을 때 태스크 분산 방식round_robin 또는 least_load
plugins.ml_commons.native_memory_thresholdML 태스크 실행 전, 메모리 점유율 기준90 (90% 이상이면 거부)
plugins.ml_commons.max_ml_task_per_node동시에 수행할 수 있는 ML 태스크 개수2 등등

결론

“해당 ML 노드만 ML 태스크를 수행” 하도록 하려면 반드시 다음 두 가지를 같이 설정해야 한다.

  1. node.roles=ml → ML 이외의 역할 제거

  2. plugins.ml_commons.only_run_on_ml_node=true → ML 노드에서만 태스크 실행 제한

이 구성을 통해 운영 클러스터의 색인·검색 성능에 영향을 주지 않고 ML 기능을 안정적으로 분리할 수 있다.


Edit page
Share this post:

Previous Post
OpenSearch 성능 벤치마크와 TPS별 서버 구성 가이드
Next Post
OpenSearch 벡터 인덱스 생성 가이드 — k-NN 인덱스 설정과 매핑