MinIO MNMD 배포 가이드

소개

MinIO 아키텍처

MinIO는 AWS S3를 대체할 수 있는 고성능 S3 호환 오브젝트 스토리지입니다. On-premise에서도 실행 가능한 오픈소스이며, 버킷 기반 스토리지가 필요할 때 사용할 수 있는 최적의 솔루션입니다.

이 글에서는 온프레미스에 MinIO를 MNMD(Multi Node Multi Drive) 방식으로 배포하는 방법을 다룹니다.

MinIO 배포 방식

MinIO는 총 3가지 배포 방식을 지원합니다.

방식 설명 용도 내결함성
SNSD 하나의 인스턴스, 하나의 디스크 개발/테스트 환경 없음
SNMD 하나의 인스턴스, 여러 디스크 저성능 요구 환경 전체 드라이브의 1/2 손실 허용
MNMD 여러 인스턴스, 여러 디스크 AI/ML, DataLake 전체 노드, 드라이브의 1/2 손실 허용

MNMD 배포 요구사항

인스턴스 요구사항

  • 최소 2개 이상의 인스턴스 (Ubuntu 20.04 사용)
  • 각 인스턴스에서 9000, 9001 포트 오픈
  • 모든 인스턴스의 timezone 동기화
  • XFS 포맷의 1TB 이상 디스크 2개 이상 마운트
  • 순차적 DNS (minio-1.example.com, minio-2.example.com) 또는 순차적 IP (192.168.0.10, 192.168.0.11) 사용

추가 인프라

  • 각 인스턴스로 트래픽을 분산할 프록시 인스턴스 (nginx, haproxy, traefik 등)
  • 선택: 메트릭 수집을 위한 Grafana 스택

MinIO Erasure Code Calculator에서 상세 용량 계산이 가능합니다.

디스크 세팅

모든 인스턴스에서 아래 설정을 진행합니다.

방화벽 설정

ufw enable
ufw allow 9000
ufw allow 9001

디스크 포맷 및 마운트

# 마운트할 디스크 정보 확인
fdisk --list

# 디스크를 XFS로 포맷하고 라벨 지정
mkfs.xfs /dev/sdb -L DISK1
mkfs.xfs /dev/sdc -L DISK2

# 마운트 포인트 생성
mkdir /mnt/disk1
mkdir /mnt/disk2

# 디스크 마운트
sudo mount -t xfs /dev/sdb /mnt/disk1
sudo mount -t xfs /dev/sdc /mnt/disk2

부팅 시 자동 마운트 설정

/etc/fstab 파일에 아래 내용을 추가합니다.

# <file system>  <mount point>  <type>  <options>         <dump>  <pass>
LABEL=DISK1      /mnt/disk1     xfs     defaults,noatime  0       2
LABEL=DISK2      /mnt/disk2     xfs     defaults,noatime  0       2

MinIO 설치 및 설정

패키지 설치

wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230518000536.0.0_amd64.deb -O minio.deb
sudo dpkg -i minio.deb

systemd 서비스 파일 생성

/etc/systemd/system/minio.service 파일을 생성합니다.

[Unit]
Description=MinIO
Documentation=https://min.io/docs/minio/linux/index.html
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/usr/local/bin/minio

[Service]
WorkingDirectory=/usr/local
User=minio-user
Group=minio-user
ProtectProc=invisible

EnvironmentFile=-/etc/default/minio
ExecStartPre=/bin/bash -c "if [ -z \"${MINIO_VOLUMES}\" ]; then echo \"Variable MINIO_VOLUMES not set in /etc/default/minio\"; exit 1; fi"
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES

Restart=always
LimitNOFILE=65536
TasksMax=infinity
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

사용자 및 권한 설정

groupadd -r minio-user
useradd -M -r -g minio-user minio-user
chown minio-user:minio-user /mnt/disk1 /mnt/disk2

환경 설정 파일 생성

/etc/default/minio 파일을 생성합니다.

# MinIO 볼륨 설정
# {1...2}는 192.168.0.11, 192.168.0.12를 의미
MINIO_VOLUMES="http://192.168.0.1{1...2}:9000/mnt/disk{1...2}/minio"

# 콘솔 포트 설정
MINIO_OPTS="--console-address :9001"

# 관리자 계정 설정
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minio-secret-key-CHANGE-ME

# 외부 접속 URL (프록시에서 리버스 프록시 설정)
MINIO_SERVER_URL="https://minio.example.com"

서비스 시작

sudo systemctl start minio.service
sudo systemctl enable minio.service

# 상태 확인
sudo systemctl status minio.service
journalctl -f -u minio.service

Traefik 프록시 설정

콘솔 페이지용 리버스 프록시

http:
  routers:
    minio:
      rule: "Host(`minio.example.com`)"
      service: minio
      tls:
        certresolver: certresolver

  services:
    minio:
      loadBalancer:
        servers:
          - url: "http://192.168.0.11:9001/"
          - url: "http://192.168.0.12:9001/"

API용 리버스 프록시

http:
  routers:
    minio-api:
      rule: "Host(`minio-api.example.com`)"
      service: minio-api
      tls:
        certresolver: certresolver

  services:
    minio-api:
      loadBalancer:
        servers:
          - url: "http://192.168.0.11:9000/"
          - url: "http://192.168.0.12:9000/"

메트릭 설정

MinIO 메트릭을 수집하려면 mc(MinIO Client) CLI를 사용합니다.

mc 설치

curl https://dl.min.io/client/mc/release/linux-amd64/mc \
  --create-dirs \
  -o $HOME/minio-binaries/mc

chmod +x $HOME/minio-binaries/mc
export PATH=$PATH:$HOME/minio-binaries/

mc --help

클러스터 연결

# 클러스터 alias 설정
mc alias set mycluster https://minio.example.com <id> <password>

# 클러스터 정보 확인
mc admin info mycluster

Prometheus 메트릭 설정

mc admin prometheus generate mycluster

출력되는 설정을 Prometheus 또는 Grafana Agent에 추가합니다.

scrape_configs:
- job_name: minio-job
  bearer_token: TOKEN
  metrics_path: /minio/v2/metrics/cluster
  scheme: https
  static_configs:
  - targets: [minio.example.com]

마무리

MinIO MNMD 구성은 고가용성과 확장성이 필요한 오브젝트 스토리지 환경에 적합합니다. Erasure Coding을 통해 전체 노드와 드라이브의 절반까지 장애를 허용하므로, AI/ML 워크로드나 DataLake 구축에 안정적으로 사용할 수 있습니다.