Skip to main content

MongoDB (ReplicaSet)

오픈소스 기반 문서(Document) 저장을 위한 MongoDB 컴포넌트(복제본)

오픈소스 비관계형 데이터베이스 관리 시스템(DMBS)으로, 테이블과 행 대신 유연한 문서를 활용해 다양한 데이터 형식을 처리하고 저장합니다. NoSQL 데이터베이스 솔루션인 MongoDB는 관계형 데이터베이스 관리 시스템(RDBMS)을 필요로 하지 않으므로, 사용자가 다변량 데이터 유형을 손쉽게 저장하고 쿼리할 수 있는 탄력적인 데이터 저장 모델을 제공합니다. 이는 개발자의 데이터베이스 관리를 간소화할 뿐 아니라, 뛰어난 확장성을 갖춘 크로스 플랫폼 애플리케이션 및 서비스 환경을 구축합니다.

  • MongoDB는 데이터를 유연한 JSON 유사 문서에 저장합니다 . 즉, 필드가 문서에 따라 다를 수 있으며, 데이터 구조가 시간에 따라 변할 수 있습니다.
  • 문서 모델은 애플리케이션 코드의 객체들로 맵핑하며 , 데이터를 작업하기 쉽게 만듭니다.
  • 임시 쿼리, 인덱싱, 실시간 집합 강력한 데이터 액세스 및 분석 방법 제공.
  • MongoDB는 코어에서 배포된데이터베이스로, 매우 높은 가용성, 수평 확장, 지리적 분포가 빌트인되고 사용하기가 용이합니다.

Turaco에서는 마이크로서비스 아키텍처 구성 요소에서 필수적인 MongoDB를 간단한 몇가지 설정만으로 클러스터내에 설치해서 사용할 수 있도록 지원하고 있습니다.

본 챕터에서는 MongoDB(레플리카 셋) 컴포넌트 사용법에 대해 설명합니다.


컴포넌트 배치

MongoDB(레플리카 셋) 컴포넌트는 아키텍처 설계 화면 (이하 디자이너 화면)에서 좌측에 위치한 컴포넌트 목록에서 데이터베이스 카테고리에 있습니다.

  1. 설계화면 왼쪽 컴포넌트 리스트 화면에서 MongoDB 컴포넌트를 선택 후 디자이너 화면으로 드래그 & 드롭합니다.

컴포넌트배치

  1. 배치된 MongoDB 컴포넌트에 대한 이름과 설명을 입력 후 확인 버튼을 클릭합니다. 이름과 설명은 필수 입력값이며 입력하지 않으면 확인 버튼이 활성화되지 않습니다.

호스트

호스트 설정은 외부에 별도로 운영중인 MongoDB 데이터베이스가 이미 있는 경우, 해당 시스템을 사용하기 위한 옵션입니다. 외부에 이미 운영중인 시스템을 사용하기를 원할 경우, 해당 시스템에 대한 엔드포인트를 입력합니다.

info

호스트 항목에 엔드포인트를 입력하면 설계 후 애플리케이션 생성시 MongoDB 생성을 위한 리소스가 생성되지 않습니다. 백엔드 코드에 호스트에 입력한 엔드포인트가 주입되어 생성됩니다.


환경 설정

MongoDB ReplicaSet 구성은 아래와 같이 2부분으로 구성되어 있습니다.

  • 실행환경 구성
  • 복제환경 구성

각 구성에 대한 기본값을 적용 후 사용자의 의도에 맞게 구성값을 변경할 수 있습니다.

실행 환경 구성

Turaco에서는 데이터베이스 등과 같은 인스턴스를 생성할때 초기 환경값을 사용자가 수정해서 커스터마이징 할수 있게 지원하고 있습니다. 이러한 설정값을 지정하면, 애플리케이션 생성시 쿠버네티스의 ConfigMap 또는 Secret와 같은 리소스로 생성됩니다.

환경 설정은 필수로 입력해야하며 아래와 같은 순서로 속성값을 지정합니다.

  1. 환경 설정 속성창에서 환경 설정 추가를 위한 버튼을 클릭합니다. 클릭하게 되면 환경 설정을 위한 팝업창이 나타납니다.
  2. 환경 설정을 선택하기 위한 드롭다운 버튼을 클릭합니다. 드롭다운 메뉴에서 'Configuration' 항목을 선택합니다.
  3. 선택된 설정값을 가져오기 위해 '적용' 버튼을 클릭합니다.
  4. 선택된 값이 속성 창에 주입됩니다.

실행환경설정

실행 환경 설정은 ConfigMap으로 제공되며 전체 항목은 다음과 같습니다.

apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.mongodb.name }}-replicaset-common-scripts
namespace: {{ .Values.namespace }}
labels:
app.kubernetes.io/name: mongo-replicaset
helm.sh/chart: mongodb-13.9.4
app.kubernetes.io/instance: turaco
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: mongodb
data:
startup-probe.sh: |
#!/bin/bash
mongosh $TLS_OPTIONS --port $MONGODB_PORT_NUMBER --eval 'db.hello().isWritablePrimary || db.hello().secondary' | grep 'true'
readiness-probe.sh: |
#!/bin/bash
# Run the proper check depending on the version
[[ $(mongod -version | grep "db version") =~ ([0-9]+\.[0-9]+\.[0-9]+) ]] && VERSION=${BASH_REMATCH[1]}
. /opt/bitnami/scripts/libversion.sh
VERSION_MAJOR="$(get_sematic_version "$VERSION" 1)"
VERSION_MINOR="$(get_sematic_version "$VERSION" 2)"
VERSION_PATCH="$(get_sematic_version "$VERSION" 3)"
if [[ ( "$VERSION_MAJOR" -ge 5 ) || ( "$VERSION_MAJOR" -ge 4 && "$VERSION_MINOR" -ge 4 && "$VERSION_PATCH" -ge 2 ) ]]; then
mongosh $TLS_OPTIONS --port $MONGODB_PORT_NUMBER --eval 'db.hello().isWritablePrimary || db.hello().secondary' | grep 'true'
else
mongosh $TLS_OPTIONS --port $MONGODB_PORT_NUMBER --eval 'db.isMaster().ismaster || db.isMaster().secondary' | grep 'true'
fi
ping-mongodb.sh: |
#!/bin/bash
mongosh $TLS_OPTIONS --port $MONGODB_PORT_NUMBER --eval "db.adminCommand('ping')"

복제환경 구성

실행환경설정

복제 환경 설정 구성 또한 ConfigMap으로 제공되며 전체 항목은 다음과 같습니다.

apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Values.mongodb.name }}-replicaset-scripts
namespace: {{ .Values.namespace }}
labels:
app.kubernetes.io/name: mongo-replicaset
helm.sh/chart: mongodb-13.9.4
app.kubernetes.io/instance: turaco
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: mongodb
data:
setup.sh: |-
#!/bin/bash

. /opt/bitnami/scripts/mongodb-env.sh
. /opt/bitnami/scripts/libfs.sh
. /opt/bitnami/scripts/liblog.sh
. /opt/bitnami/scripts/libvalidations.sh

if is_empty_value "$MONGODB_ADVERTISED_PORT_NUMBER"; then
export MONGODB_ADVERTISED_PORT_NUMBER="$MONGODB_PORT_NUMBER"
fi

info "Advertised Hostname: $MONGODB_ADVERTISED_HOSTNAME"
info "Advertised Port: $MONGODB_ADVERTISED_PORT_NUMBER"

# Check for existing replica set in case there is no data in the PVC
# This is for cases where the PVC is lost or for MongoDB caches without
# persistence
current_primary=""
if is_dir_empty "${MONGODB_DATA_DIR}/db"; then
info "Data dir empty, checking if the replica set already exists"
current_primary=$(mongosh admin --host "{{ .Values.mongodb.name }}-replicaset-0.{{ .Values.mongodb.name }}-replicaset-headless.{{ .Values.namespace }}.svc.cluster.local:{{ .Values.mongodb.port.container_port }},{{ .Values.mongodb.name }}-replicaset-1.{{ .Values.mongodb.name }}-replicaset-headless.{{ .Values.namespace }}.svc.cluster.local:{{ .Values.mongodb.port.container_port }}" --authenticationDatabase admin -u $MONGODB_ROOT_USER -p $MONGODB_ROOT_PASSWORD --eval 'db.runCommand("ismaster")' | awk -F\' '/primary/ {print $2}')

if ! is_empty_value "$current_primary"; then
info "Detected existing primary: ${current_primary}"
fi
fi

if ! is_empty_value "$current_primary" && [[ "$MONGODB_ADVERTISED_HOSTNAME:$MONGODB_ADVERTISED_PORT_NUMBER" == "$current_primary" ]]; then
info "Advertised name matches current primary, configuring node as a primary"
export MONGODB_REPLICA_SET_MODE="primary"
elif ! is_empty_value "$current_primary" && [[ "$MONGODB_ADVERTISED_HOSTNAME:$MONGODB_ADVERTISED_PORT_NUMBER" != "$current_primary" ]]; then
info "Current primary is different from this node. Configuring the node as replica of ${current_primary}"
export MONGODB_REPLICA_SET_MODE="secondary"
export MONGODB_INITIAL_PRIMARY_HOST="${current_primary%:*}"
export MONGODB_INITIAL_PRIMARY_PORT_NUMBER="${current_primary#*:}"
export MONGODB_SET_SECONDARY_OK="yes"
elif [[ "$MY_POD_NAME" = "{{ .Values.mongodb.name }}-replicaset-0" ]]; then
info "Pod name matches initial primary pod name, configuring node as a primary"
export MONGODB_REPLICA_SET_MODE="primary"
else
info "Pod name doesn't match initial primary pod name, configuring node as a secondary"
export MONGODB_REPLICA_SET_MODE="secondary"
export MONGODB_INITIAL_PRIMARY_PORT_NUMBER="$MONGODB_PORT_NUMBER"
fi

if [[ "$MONGODB_REPLICA_SET_MODE" == "secondary" ]]; then
export MONGODB_INITIAL_PRIMARY_ROOT_USER="$MONGODB_ROOT_USER"
export MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD="$MONGODB_ROOT_PASSWORD"
export MONGODB_ROOT_PASSWORD=""
export MONGODB_EXTRA_USERNAMES=""
export MONGODB_EXTRA_DATABASES=""
export MONGODB_EXTRA_PASSWORDS=""
export MONGODB_ROOT_PASSWORD_FILE=""
export MONGODB_EXTRA_USERNAMES_FILE=""
export MONGODB_EXTRA_DATABASES_FILE=""
export MONGODB_EXTRA_PASSWORDS_FILE=""
fi

exec /opt/bitnami/scripts/mongodb/entrypoint.sh /opt/bitnami/scripts/mongodb/run.sh
setup-hidden.sh: |-
#!/bin/bash

. /opt/bitnami/scripts/mongodb-env.sh

echo "Advertised Hostname: $MONGODB_ADVERTISED_HOSTNAME"
echo "Advertised Port: $MONGODB_ADVERTISED_PORT_NUMBER"
echo "Configuring node as a hidden node"
export MONGODB_REPLICA_SET_MODE="hidden"
export MONGODB_INITIAL_PRIMARY_ROOT_USER="$MONGODB_ROOT_USER"
export MONGODB_INITIAL_PRIMARY_ROOT_PASSWORD="$MONGODB_ROOT_PASSWORD"
export MONGODB_INITIAL_PRIMARY_PORT_NUMBER="$MONGODB_PORT_NUMBER"
export MONGODB_ROOT_PASSWORD=""
export MONGODB_EXTRA_USERNAMES=""
export MONGODB_EXTRA_DATABASES=""
export MONGODB_EXTRA_PASSWORDS=""
export MONGODB_ROOT_PASSWORD_FILE=""
export MONGODB_EXTRA_USERNAMES_FILE=""
export MONGODB_EXTRA_DATABASES_FILE=""
export MONGODB_EXTRA_PASSWORDS_FILE=""
exec /opt/bitnami/scripts/mongodb/entrypoint.sh /opt/bitnami/scripts/mongodb/run.sh

복제 노드 수 설정

MongoDB ReplicaSet 컴포넌트는 하나의 마스터 노드와 여러개의 읽기 복제 노드로 구성되며, 읽기 복제 노드의 수를 설정합니다.

기본값은 2로 설정되어 있습니다. (마스터노드 1개 - 복제본 2개)


포트 설정

7. 포트 정보는 3가지 정보를 반드시 입력해야 합니다.
     미 입력시 컨테이너 실행 후 정상적으로 접속이 되지 않을 수 있습니다.

  • 프로토콜 -> 통신시 사용할 프로토콜 설정(현재는 http만 지원)
  • 입력포트 -> 서비스 입력 포트로 사용
  • 타겟포트 -> 서비스 출력 포트이며 컨테이너의 입력 포트로 주입


스토리지 설정

컨테이너는 로컬 스토리지를 사용할 수 있으나 컨테이너의 특성상 재시작되거나 삭제되는 경우 저장된 데이터가 같이 삭제됩니다.이러한 특성 때문에 외부에 영구 볼륨을 설정하고 저장을 해야 데이터가 유실되지 않고 보관이 됩니다.

Turaco에서는 운영 환경에서 많이 사용하는 2가지 스토리지 클래스를 지원합니다.

  • NFS 기반의 스토리지 클래스 (tlc-nfs-sc)
  • Disk 기반의 스토리지 클래스 (tlc-block-sc)
info

Turaco에서 MongoDB 컴포넌트에서 스토리지 클래스 및 접근모드는 아래와 같이 고정값으로 지정되어 있으며 수정할 수 없습니다.

  • 접근모드 -> ReadWriteOnce
  • 스토리지 클래스 -> tlc-block-sc

8. 스토리지 설정에는 아래와 같이 3개의 속성이 있습니다.

  • 접근 모드 -> 스토리지 접근 모드 선택
  • 볼륨 크기 -> 볼륨 크기 입력(ex. 5Gi)
  • 스토리지 클래스 -> 스토리지 클래스 이름 입력(기본값 유지 추천)

접근 모드는 아래와 같이 3가지 속성이 있는데, MongoDB 컴포넌트에서는 고정(ReadWriteOnce)되어 있습니다.

  • ReadWriteMany -> 여러개의 컨테이너에서 읽고 쓸수 있음
  • ReadWriteOnce -> 하나의 컨테이너에서만 읽고 쓸수 있음
  • ReadOnlyMany -> 여러개의 컨테이너에서 읽을 수 있음