본문 바로가기
Public Cloud/AWS - Experience

[AWS] Opensearch 설치 및 클러스터링 환경 구성

by ymkim 2025. 4. 15.

사내 Opensearch를 통해 Vector DB를 사용하여 유사 검색을 구현할 수 있는 환경을 구축해야 하는 경우가 존재하였다. 하여, 이번 포스팅에서는 Opensearch를 설치하고 클러스터링 하는 방법에 대해 간략히 알아보자. 자세한 내용은 생략하였으며, 설치 및 클러스터링에만 집중한다. 추가로, EC2에 cordi+master & data 노드 클러스터링 환경을 설정하는 스크립트도 있으니 참고 하면 된다.

우선 OpenSearch를 *.tar 파일 형태로 다운로드해보자. yum을 통한 설치 방법도 있지만, 이번에는 테스트 목적이며 폐쇄망 환경이기 때문에 tar 파일 기반으로 설치한다.

01. Opensearch 설치

(EC2) search-opensearch-c01 : cordi(01번) / master(01번)
(EC2) search-opensearch-c02 : cordi(02번) / master(01번)
(EC2) search-opensearch-c03 : cordi(03번) / master(03번)

(EC2) search-opensearch-d01 : data(01번)
(EC2) search-opensearch-d02 : data(02번)
(EC2) search-opensearch-d03 : data(03번)

총 6대의 EC2 인스턴스를 구성하였으며, 각 인스턴스에는 코디네이터(coordinate), 마스터(master), 데이터(data) 노드 역할을 나누어 배포할 예정이다. 코디네이터 노드와 마스터 노드를 동일한 EC2에 구성한 이유는 비용 절감을 위함이며, 비용에 여유가 있다면 마스터 노드를 별도의 인스턴스로 분리하는 구성을 권장한다. 이제 Opensearch tar 파일을 다운로드해보자.

01-1. Opensearch tar 파일 다운로드

# wget로 받는 경우(x86)
# wget로 받는 경우(arm)
wget https://artifacts.opensearch.org/releases/bundle/opensearch/2.18.0/opensearch-2.18.0-linux-x64.tar.gz
wget https://artifacts.opensearch.org/releases/bundle/opensearch/2.18.0/opensearch-2.18.0-linux-arm64.tar.gz

# curl로 받는 경우(x86)
# curl로 받는 경우(arm)
curl -O https://artifacts.opensearch.org/releases/bundle/opensearch/2.18.0/opensearch-2.18.0-linux-x64.tar.gz
curl -O https://artifacts.opensearch.org/releases/bundle/opensearch/2.18.0/opensearch-2.18.0-linux-arm64.tar.gz

01-2. tar 압축해제

tar -xvzf opensearch-2.18.0-linux-arm64.tar.gz

위에서 설치하는 Opensearch.tar.gz 파일 압축 해제를 진행 후 해당 경로로 이동한다.

01-3. 심볼릭 링크 추가

ln -s opensearch-2.18.0 opensearch

압축을 해제한 후, opensearch라는 심볼릭 링크를 생성한다. 이후 opensearch/config/opensearch.yml 파일을 확인하자. 이 파일은 OpenSearch 노드의 실행 설정을 담당하며, 본 구성에서는 하나의 EC2 서버에서 두 개의 프로세스를 통해 코디네이터 노드와 마스터 노드를 함께 구성할 예정이다. 이에 따라 설정 파일을 각각 수정해야 한다.

01-4. Java 설치

sudo yum install -y java-11-amazon-corretto
java --version

OpenSearch를 사용하려면 기본적으로 Java 11 이상이 설치되어 있어야 한다. 이에 따라 필자는 Amazon Corretto 11 버전을 EC2 서버에 설치하였다. 설치가 완료되면, 이후 클러스터링에 사용할 hosts 파일을 수정해보자.

01-5. /etc/hosts 수정

sudo vi /etc/hosts
# /etc/hosts
172.21.10.11    os-za-c01
172.21.10.12    os-zb-c02
172.21.10.13    os-zc-c03

172.21.10.21    os-za-m01
172.21.10.22    os-zb-m02
172.21.10.23    os-zc-m03

172.21.10.31    os-za-d01
172.21.10.32    os-zb-d02
172.21.10.33    os-zc-d03

opensearch.yml 파일을 보면 discovery.seed_hosts나 cluster.initial_cluster_manager_nodes에서 도메인 형식의 값을 사용하는 경우가 있다. 이 경우 해당 도메인이 실제 IP로 매핑되어야 클러스터 노드 간 통신이 가능하므로, 호스트 머신(EC2)의 /etc/hosts 파일에 IP와 도메인 매핑 정보를 추가해야 한다.

02. Opensearch 클러스터링 환경 구성

Opensearch 클러스터링을 구성하려면 jvm.options와 opensearch.yml 파일을 수정해야 한다. 먼저 코디네이터 노드와 마스터 노드에 대한 설정을 진행하고, 이후 데이터 노드 설정까지 이어서 구성하자. opensearch.yml의 옵션은 하단에 기재해두었으며, 목적에 맞게 잘 사용하면 된다.

02-1. opensearch.yaml - cordinate node 설정

파일 경로 : /home/ec2-user/apps-c/opensearch/config/opensearch.yml

----------------------------------------
# search-opensearch-c01
# opensearch.yaml (cordie node-01 config)
cluster.name: opensearch-test-cluster
node.name: os-za-c01

node.roles: []

path.data: /home/ec2-user/apps-c-data
path.logs: /home/ec2-user/apps-c-log

network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

discovery.seed_hosts:
  - 172.21.xx.xx:9400 # master node
  - 172.21.xx.xx:9400 # master node
  - 172.21.xx.xx:9400 # master node

cluster.initial_cluster_manager_nodes:
  - os-za-m01 # master node
  - os-zb-m02 # master node
  - os-zc-m03 # master node

plugins.security.disabled: true
----------------------------------------
# search-opensearch-c01
# opensearch.yaml (cordie node-02 config)
cluster.name: opensearch-test-cluster
node.name: os-zb-c02

node.roles: []

path.data: /home/ec2-user/apps-c-data
path.logs: /home/ec2-user/apps-c-log

network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

discovery.seed_hosts:
  - 172.21.xx.xx:9400 # master node
  - 172.21.xx.xx:9400 # master node
  - 172.21.xx.xx:9400 # master node

cluster.initial_cluster_manager_nodes:
  - os-za-m01 # master node
  - os-zb-m02 # master node
  - os-zc-m03 # master node

plugins.security.disabled: true
----------------------------------------
# search-opensearch-c01
# opensearch.yaml (cordie node-03 config)
cluster.name: opensearch-test-cluster
node.name: os-zc-c03

node.roles: []

path.data: /home/ec2-user/apps-c-data
path.logs: /home/ec2-user/apps-c-log

network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

discovery.seed_hosts:
  - 172.21.xx.xx:9400 # master node
  - 172.21.xx.xx:9400 # master node
  - 172.21.xx.xx:9400 # master node

cluster.initial_cluster_manager_nodes:
  - os-za-m01 # master node
  - os-zb-m02 # master node
  - os-zc-m03 # master node

plugins.security.disabled: true
  • cluster.name
    • Opensearch의 클러스터명 지정
    • 해당 클러스터에 속한 노드는 모두 동일한 클러스터명을 가져야함
  • node.name
    • 클러스터내에 구동되는 노드 이름을 지정
    • 또한, 해당 이름은 고유해야 한다
  • node.roles
    • 해당 노드가 클러스터상에서 어떤 역할을 할지 지정
    • 노드 종류
      • cluster_manager: 클러스터 전반을 관리하는 마스터 노드
      • data: 실제 데이터를 저장하고, 검색 및 집계 처리 담당하는 데이터 노드
      • ingest: 파이프라인을 통한 전처리 담당 노드
      • coordinating_only: LB 역할을 하는 노드
  • path.data
    • Opensearch가 실제 검색 데이터를 저장하는 공간
    • 즉, DB 관점에서 보면 실제 데이터 파일이 물리적으로 저장되는 경로
    • 우리가 생성한 인덱스(Index), 샤드(Shard), 문서(Document) 등이 해당 경로에 저장됨
  • path.logs
    • Opensearch에서 발생하는 서버 로그를 저장하는 공간
    • 기본적으로 logrotate는 제공 되나, 확인 필요
  • network.host
    • Opensearch 노드가 어떤 Network Interface에 바인딩될지 결정하는 옵션
      • 0.0.0.0은 모든 네트워크 인터페이스에서 요청을 수신한다
    • 기본적으로 eth0(ethernet0)에는 public, private IP가 할당됨
    • Opensearch가 구동되고 있는, EC2의 Private IP 지정하는것이 일반적이다
    • network.host
      • data-node-1: 172.31.10.101
      • data-node-1: 172.31.10.102
      • data-node-1: 172.31.10.103
  • http.port
    • Opensearch가 REST API로 요청을 수신하는 포트
    • 즉, Opensearch와 Client 간의 HTTP(HyperText Protocol) 통신을 수행하기 위한 포트 지정
  • transport.tcp.port
    • Opensearch 노드 간 내부 통신에 사용하는 포트
    • 사용 방식
      • 🔨 클러스터 구성 : 다른 노드를 찾고, 해당 노드를 클러스터링에 합류시키는 경우 사용
      • 👑 마스터 선출 : 마스터 노드 선출 시 사용
      • ⚡️ 샤드 재배치 : 데이터 샤드를 다른 노드로 복제하거나 이동할 때 사용
      • 🔎 헬스 체크 : 노드 상태를 주기적으로 확인할 때 사용
  • discovery.seed_hosts
    • Opensearch의 노드(Node)가 클러스터에 처음 참여할 때, 연결할 마스터 노드들의 IP 목록을 지정하는 설정
    • cordi, master, data의 IP를 모두 넣을 수 있지만, 보편적으로는 master node의 IP를 넣어준다
    • 왜 해당 옵션을 설정해야 할까?
      • Opensearch 클러스터에 구성되는 노드들은 자기가 어떤 클러스터에 속해야 하는지 자동으로 판단할 수 없다. 그렇기에, 최초에 한번 내가 속해야 하는 클러스터가 어떤 클러스터인지 특정 노드(master node)에 요청을 보내서 클러스터 정보를 물어봐야 하기에 해당 옵션을 사용해야 한다
  • cluster.initial_cluster_manager_nodes
    • 클러스터를 처음 시작할 때 마스터 후보로 사용할 노드들의 이름(node.name)을 지정하는 설정
    • Opensearch가 최로 클러스터를 생성할 때, 어떤 노드를 마스터로 지정할지 결정하는 옵션

02-2. opensearch.yaml - master node 설정

----------------------------------------
# search-opensearch-c01
# opensearch.yaml (master node-01 config)
cluster.name: opensearch-test-cluster
node.name: os-za-m01

node.roles: [cluster_manager]

path.data: /home/ec2-user/apps-m-data
path.logs: /home/ec2-user/apps-m-log

network.host: 0.0.0.0
http.port: 9100
transport.tcp.port: 9400

discovery.seed_hosts:
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400

cluster.initial_cluster_manager_nodes:
  - os-za-m01
  - os-zb-m02
  - os-zc-m03

plugins.security.disabled: true
----------------------------------------
# search-opensearch-c01
# opensearch.yaml (master node-02 config)
cluster.name: opensearch-test-cluster
node.name: os-zb-m02

node.roles: [cluster_manager]

path.data: /home/ec2-user/apps-m-data
path.logs: /home/ec2-user/apps-m-log

network.host: 0.0.0.0
http.port: 9100
transport.tcp.port: 9400

discovery.seed_hosts:
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400

cluster.initial_cluster_manager_nodes:
  - os-za-m01
  - os-zb-m02
  - os-zc-m03

plugins.security.disabled: true
----------------------------------------
# search-opensearch-c01
# opensearch.yaml (master node-03 config)
cluster.name: opensearch-test-cluster
node.name: os-zc-m03

node.roles: [cluster_manager]

path.data: /home/ec2-user/apps-m-data
path.logs: /home/ec2-user/apps-m-log

network.host: 0.0.0.0
http.port: 9100
transport.tcp.port: 9400

discovery.seed_hosts:
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400

cluster.initial_cluster_manager_nodes:
  - os-za-m01
  - os-zb-m02
  - os-zc-m03

plugins.security.disabled: true

master node 구성이 완료 되었으면, data node 설정을 진행 하자.

02-3. opensearch.yaml - data node 설정

----------------------------------------
# search-opensearch-d01
# opensearch.yaml (data node-01 config)
cluster.name: opensearch-test-cluster
node.name: os-za-d01

node.roles: [data]

path.data: /home/ec2-user/apps-d-data
path.logs: /home/ec2-user/apps-d-log

network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

discovery.seed_hosts:
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400

cluster.initial_cluster_manager_nodes:
  - os-za-m01
  - os-za-m02
  - os-za-m03

plugins.security.disabled: true
----------------------------------------
# search-opensearch-d02
# opensearch.yaml (data node-02 config)
cluster.name: opensearch-test-cluster
node.name: os-zb-d02

node.roles: [data]

path.data: /home/ec2-user/apps-d-data
path.logs: /home/ec2-user/apps-d-log

network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

discovery.seed_hosts:
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400

cluster.initial_cluster_manager_nodes:
  - os-za-m01
  - os-za-m02
  - os-za-m03

plugins.security.disabled: true
----------------------------------------
# search-opensearch-d03
# opensearch.yaml (data node-03 config)
cluster.name: opensearch-test-cluster
node.name: os-zc-d03

node.roles: [data]

path.data: /home/ec2-user/apps-d-data
path.logs: /home/ec2-user/apps-d-log

network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

discovery.seed_hosts:
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400

cluster.initial_cluster_manager_nodes:
  - os-za-m01
  - os-za-m02
  - os-za-m03

plugins.security.disabled: true

이제 데이터 노드 설정까지 완료되었으므로, jvm.options 파일을 수정할 차례다. JVM 옵션은 각 EC2 인스턴스의 메모리 사양에 맞게 유연하게 조정해야 하며, 필자는 코디네이터와 마스터 노드에는 각각 4GB, 데이터 노드에는 8GB 메모리를 할당하였다. 설정을 마쳤다면 OpenSearch를 구동해보자. 기본적으로 /bin/opensearch 실행 파일을 통해 실행할 수 있지만, 보다 편리한 관리를 위해 실행과 중지를 지원하는 shell 스크립트를 구성하였다.

02-4. 실행 스크립트 생성

#!/bin/bash

# OpenSearch 실행 경로
COORDINATOR_PATH="/home/ec2-user/apps-c/opensearch-2.18.0/bin"
MASTER_PATH="/home/ec2-user/apps-m/opensearch-2.18.0/bin"

# JAVA_HOME
JAVA_HOME_PATH="/usr/lib/jvm/java-11-amazon-corretto.aarch64"

# 로그 디렉토리 설정
LOG_DIR="/home/ec2-user/opensearch-logs"
mkdir -p "$LOG_DIR"

# OpenSearch 시작 함수 (마스터 → 코디 순서)
start_opensearch() {
    echo "마스터 노드 시작 중..."
    cd "$MASTER_PATH"
    JAVA_HOME=$JAVA_HOME_PATH nohup ./opensearch -d > "$LOG_DIR/master.log" 2>&1 &
    sleep 10

    echo "코디네이터 노드 시작 중..."
    cd "$COORDINATOR_PATH"
    JAVA_HOME=$JAVA_HOME_PATH nohup ./opensearch -d > "$LOG_DIR/coordinator.log" 2>&1 &
}

# OpenSearch 종료 함수
stop_opensearch() {
    echo "OpenSearch 프로세스 종료 중..."
    pkill -f "opensearch"

    while pgrep -f "opensearch" > /dev/null; do
        echo "opensearch 종료 대기 중..."
        sleep 1
    done
    echo "모든 opensearch 프로세스 종료 완료"
}

# OpenSearch 재시작 함수
restart_opensearch() {
    stop_opensearch
    start_opensearch
}

# 사용법 안내
usage() {
    echo "사용법: $0 [s | r | k]"
    echo "  s : 시작"
    echo "  r : 재시작"
    echo "  k : 종료"
    exit 1
}

# 파라미터 처리
if [ $# -eq 0 ]; then
    usage
fi

case "$1" in
    s)
        echo "OpenSearch 시작 중..."
        start_opensearch
        ;;
    r)
        echo "OpenSearch 재시작 중..."
        restart_opensearch
        ;;
    k)
        echo "OpenSearch 종료 중..."
        stop_opensearch
        ;;
    *)
        usage
        ;;
esac

exit 0
#!/bin/bash

# OpenSearch 실행 경로
OPENSEARCH_PATH="/home/ec2-user/apps-d/opensearch/bin/opensearch"
JAVA_HOME="/usr/lib/jvm/java-11-amazon-corretto.aarch64"

# 로그 디렉토리 및 파일
LOG_DIR="/home/ec2-user/opensearch-logs"
LOG_FILE="$LOG_DIR/data-node.log"
mkdir -p "$LOG_DIR"

# OpenSearch 시작 함수
start_opensearch() {
    echo "OpenSearch 데이터 노드 시작 중..."
    JAVA_HOME=$JAVA_HOME nohup $OPENSEARCH_PATH -d > "$LOG_FILE" 2>&1 &
}

# OpenSearch 종료 함수
stop_opensearch() {
    echo "OpenSearch 데이터 노드 종료 중..."
    pkill -f "opensearch"

    while pgrep -f "opensearch" > /dev/null; do
        echo "OpenSearch 종료 대기 중..."
        sleep 1
    done

    echo "OpenSearch 데이터 노드 종료 완료"
}

# OpenSearch 재시작 함수
restart_opensearch() {
    stop_opensearch
    echo "OpenSearch 데이터 노드 재시작 중..."
    start_opensearch
}

# 사용법 출력
usage() {
    echo "사용법: $0 [s | r | k]"
    echo "  s : OpenSearch 시작"
    echo "  r : OpenSearch 재시작"
    echo "  k : OpenSearch 종료"
    exit 1
}

# 파라미터 확인
if [ $# -eq 0 ]; then
    usage
fi

case "$1" in
    s)
        start_opensearch
        ;;
    r)
        restart_opensearch
        ;;
    k)
        stop_opensearch
        ;;
    *)
        usage
        ;;
esac

exit 0

위 shell 스크립트는 EC2에서 실행되는 마스터 노드와 코디네이터 노드를 구동하는 역할을 한다. 마스터 노드가 먼저 실행되도록 구성되어 있으며, 마스터 노드의 구동이 완료된 후 코디네이터 노드가 순차적으로 실행된다.

03. Opensearch 환경 구성 shell script

03-1. search-opensearch-c01 - 03 실행 스크립트

#!/bin/bash
set -e

########################################
# 시스템 설정 및 기본 패키지 설치
########################################
sudo hostnamectl set-hostname search-opensearch-test-c01
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
sudo dnf update -y
sudo dnf install -y docker git vim unzip jq tree zip curl wget yum-utils --allowerasing
sudo systemctl enable --now docker
sudo usermod -aG docker ec2-user

########################################
# /etc/hosts 수정
########################################
sudo tee -a /etc/hosts > /dev/null <<EOF
172.21.xx.xx    os-za-m01
172.21.xx.xx    os-zb-m02
172.21.xx.xx    os-zc-m03

172.21.xx.xx    os-za-c01
172.21.xx.xx    os-zb-c02
172.21.xx.xx    os-zc-c03
EOF

echo "Opensearch 환경 구성 시작..."

########################################
# 디렉토리 생성
########################################
mkdir -p /home/ec2-user/apps-c
mkdir -p /home/ec2-user/apps-m

########################################
# OpenSearch tar 다운로드 및 압축 해제
########################################
cd /home/ec2-user/apps-c
wget https://artifacts.opensearch.org/releases/bundle/opensearch/2.18.0/opensearch-2.18.0-linux-arm64.tar.gz
tar -xvzf opensearch-2.18.0-linux-arm64.tar.gz
ln -s opensearch-2.18.0 opensearch

cd /home/ec2-user/apps-m
cp /home/ec2-user/apps-c/opensearch-2.18.0-linux-arm64.tar.gz .
tar -xvzf opensearch-2.18.0-linux-arm64.tar.gz
ln -s opensearch-2.18.0 opensearch

########################################
# Java 설치
########################################
sudo yum install -y java-11-amazon-corretto
java --version

########################################
# cordi 노드용 opensearch.yml 작성
########################################
cat <<EOF > /home/ec2-user/apps-c/opensearch/config/opensearch.yml
cluster.name: opensearch-test-cluster
node.name: os-za-c01

node.roles: []

path.data: /home/ec2-user/apps-c-data
path.logs: /home/ec2-user/apps-c-log

network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

discovery.seed_hosts:
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400

cluster.initial_cluster_manager_nodes:
  - os-za-m01
  - os-zb-m02
  - os-zc-m03
EOF

########################################
# master 노드용 opensearch.yml 작성
########################################
cat <<EOF > /home/ec2-user/apps-m/opensearch/config/opensearch.yml
cluster.name: opensearch-test-cluster
node.name: os-za-m01

node.roles: [cluster_manager]

path.data: /home/ec2-user/apps-m-data
path.logs: /home/ec2-user/apps-m-log

network.host: 0.0.0.0
http.port: 9100
transport.tcp.port: 9400

discovery.seed_hosts:
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400
  - 172.21.xx.xx:9400

cluster.initial_cluster_manager_nodes:
  - os-za-m01
  - os-zb-m02
  - os-zc-m03
EOF

echo "OpenSearch 설치 및 cordi/master 설정 완료"
  • 위 shell script의 경우 Opensearch를 구성하는 스크립트로 cordi, master node에 대한 환경 구성 시 사용
  • EC2 2번, 3번 서버의 경우에는 위 스크립트를 그대로 활용하되, opensearch.yml 설정만 서버에 맞게 수정하여 적용
  • Terraform을 통해 생성할 것이기에, shell script를 서버별로 구분하여 생성 후 사용

03-2. search-opensearch-d01 - 03 실행 스크립트

#!/bin/bash
set -e

################################
# 기본 환경 설정
################################
sudo hostnamectl set-hostname search-opensearch-test-d01
sudo rm -f /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

mkdir -p /home/ec2-user/apps-d
cd /home/ec2-user/apps-d

################################
# 필수 패키지 설치
################################
sudo dnf update -y
sudo dnf install -y tree telnet curl htop wget jq unzip git vim yum-utils --allowerasing
sudo dnf install -y docker || echo "docker already installed"
sudo dnf install -y java-11-amazon-corretto
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker ec2-user

################################
# OpenSearch 다운로드 및 설치
################################
OPENSEARCH_VERSION="2.18.0"
OPENSEARCH_TAR="opensearch-${OPENSEARCH_VERSION}-linux-arm64.tar.gz"
OPENSEARCH_DIR="opensearch-${OPENSEARCH_VERSION}"

cd /home/ec2-user/apps-d
curl -O "https://artifacts.opensearch.org/releases/bundle/opensearch/${OPENSEARCH_VERSION}/${OPENSEARCH_TAR}"

if [ -f "${OPENSEARCH_TAR}" ]; then
  tar -xvf "${OPENSEARCH_TAR}"
else
  echo "[ERROR] OpenSearch tar.gz 파일이 존재하지 않습니다."
  exit 1
fi

rm -f opensearch
ln -s "${OPENSEARCH_DIR}" opensearch
cd opensearch || { echo "[ERROR] opensearch 디렉토리로 이동 실패"; exit 1; }

################################
# 성능 및 안정성 설정
################################
# 1. 스왑 비활성화
# 이유: JVM 힙 메모리가 스왑 영역으로 밀려나면 성능 저하 및 GC 지연 가능성 있음
sudo swapoff -a

# 2. mmap 용량 확장
# 이유: OpenSearch는 많은 수의 memory-mapped files을 사용하므로 기본값(65530)으로는 부족
echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.conf
sudo sysctl -p
cat /proc/sys/vm/max_map_count

################################
# /etc/hosts 설정 (선택)
################################
sudo tee -a /etc/hosts > /dev/null <<EOF
172.21.x.x    os-za-m01
172.21.x.x    os-zb-m02
172.21.x.x    os-zc-m03

172.21.x.x    os-za-d01
172.21.x.x    os-zb-d02
172.21.x.x    os-zc-d03
EOF

################################
# opensearch.yml 생성 (Data Node 설정)
################################
cat <<EOF > /home/ec2-user/apps-d/opensearch/config/opensearch.yml
cluster.name: opensearch-test-cluster
node.name: os-za-d01

node.roles: [data]

path.data: /home/ec2-user/apps-d-data
path.logs: /home/ec2-user/apps-d-log

network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300

discovery.seed_hosts:
  - 172.21.x.x:9400 # master node
  - 172.21.x.x:9400 # master node
  - 172.21.x.x:9400 # master node

cluster.initial_cluster_manager_nodes:
  - os-za-m01 # master node
  - os-zb-m02 # master node
  - os-zc-m03 # master node
EOF

################################
# 완료 메시지
################################
echo ""
echo "OpenSearch Data 노드 설치 완료"
  • 위 shell script의 경우 Opensearch를 구성하는 스크립트로 data node에 대한 환경 구성 시 사용
  • EC2 2번, 3번 서버의 경우에는 위 스크립트를 그대로 활용하되, opensearch.yml 설정만 서버에 맞게 수정하여 적용

추가적으로 Opensearch dashboard의 경우 script를 사용하지 않고, 따로 설치하는 방향으로 진행 한다.

99. 참고 자료

 

Installing OpenSearch Dashboards

Installing OpenSearch Dashboards

opensearch.org