MinIO Site Replication

오늘은 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)까지 적용해본다면 더욱 좋을 거 같습니다.

저희 회사는 외부 사용자가 없다보니, 장애가 발생해도 크리티컬하지 않고 수동으로 갈아끼우면 되는 상황이기에 자동 장애 조치까지 다루지는 않겠습니다 :)