오늘은 MinIO의 고가용성을 챙길 수 있는 방법 중 하나인 Site Replication에 대해 알아보고 구축해보겠습니다.
Site Replication은 여러 독립된 MinIO 클러스터(사이트)를 하나로 묶어 데이터뿐만 아니라 설정까지 통째로 동기화하는 기능입니다.
주요 특징은 다음과 같습니다.
- 전체 동기화: 데이터(Object)는 물론이고 IAM 사용자, 그룹, 정책(Policy), 버킷 설정까지 모든 사이트가 동일하게 유지됩니다.
- Active-Active 지원: 기본적으로 모든 사이트에서 읽기/쓰기가 가능하며, 한곳에서 변경된 내용은 다른 모든 사이트로 자동 전송됩니다. (질문하신 Active-Passive 구성도 이를 통해 구현됩니다.)
- 자동 장애 복구: 특정 사이트가 다운되었다가 복구되면, 중단된 동안의 변경 사항을 자동으로 감지하여 다시 동기화(Resync)합니다.
- 간편한 확장: mc admin replicate add 명령 한 번으로 새로운 사이트를 기존 복제 그룹에 추가할 수 있습니다.
저는 두 개의 서버를 이용하여 구축해보았습니다.
A 서버 docker-compose.yml 파일
services:
minio:
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
container_name: minio-main
hostname: minio-main
restart: unless-stopped
ports:
- "9000:9000"
- "9002:9002"
volumes:
- /volume1/minio-data:/data
- /volume1/docker/minio/logs:/logs
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: minio123
MINIO_SITE_NAME: main-site
MINIO_SERVER_URL: "http://<A서버 HOST 주소>:9000"
MINIO_BROWSER: "on"
command: server /data --console-address ":9002"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 10s
retries: 3
B 서버 docker-compose.yml 파일
services:
minio:
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
container_name: minio-slave
hostname: minio-slave
restart: unless-stopped
ports:
- "9000:9000"
- "9002:9002"
volumes:
- /volume1/minio-data:/data
- /volume1/docker/minio/logs:/logs
environment:
MINIO_ROOT_USER: minio
MINIO_ROOT_PASSWORD: minio123
MINIO_SITE_NAME: slave-site
MINIO_SERVER_URL: "http://<B 서버 HOST 주소>:9000"
MINIO_BROWSER: "on"
command: server /data --console-address ":9002"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 10s
retries: 3
두 도커 컴포즈 파일을 모두 실행한 뒤 A 서버에서 다음 명령어를 사용하여 사이트를 등록합니다.
`mc alias set minio-main http://<A 서버 HOST 주소>:9000 minio minio123`
`mc alias set minio-slave http://<B 서버 HOST 주소>:9000 minio minio123`
그 다음 복제를 활성화 시켜주면 끝입니다.
` mc admin replicate add minio-main minio-slave`
`mc admin replicate info minio-main`를 사용하여 잘 연결되었는지 확인할 수 있습니다.
잘 연결되었다면, 저와 같이 기존의 A 서버에 이미 데이터가 존재하는 경우에는 다음 명령어를 사용하여 강제로 데이터 동기화를 진행하면 됩니다.
`mc admin replicate resync start minio-main minio-slave`
그리고 `mc admin replicate resync status minio-main minio-slave`를 통해 진행 상황을 확인할 수 있습니다.
마무리
이렇게 MinIO Site Replication에 대해 알아보고 직접 구축해보았습니다.
여기서 외부 로드밸런서나 DNS 서비스를 사용하여 자동 장애 조치(Automated Failover)까지 적용해본다면 더욱 좋을 거 같습니다.
저희 회사는 외부 사용자가 없다보니, 장애가 발생해도 크리티컬하지 않고 수동으로 갈아끼우면 되는 상황이기에 자동 장애 조치까지 다루지는 않겠습니다 :)