소개

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 구축에 안정적으로 사용할 수 있습니다.