상세 컨텐츠

본문 제목

MinIO 아키텍처와 핵심 개념 정리

> Tech

by Ryusstory 2025. 9. 13.

본문

MinIO의 공식 문서에 있는 아키텍처와 핵심 컨셉 내용들을 정리해봤습니다.

MinIO 아키텍처

MinIO 는 분산 시스템으로 최소 4개의 MinIO 호스트(노드)로 구성되며, 각 호스트는 프로덕션 환경에서는 동일한 하드웨어 사양을 가져야 합니다. 호스트의 디스크는 XFS 파일 시스템을 기반으로 JBOD 형태로 구성됩니다. 고가용성을 위한 Erasure Coding(EC)을 통해 객체를 데이터와 패리티 샤드(조각)으로 나누어 분산 저장합니다.

분산 배포

  • 최소 4노드: 프로덕션 환경에서는 최소 4개의 서버가 필요합니다
  • 동일한 사양의(homogeneous) 리소스: 모든 노드가 동일한 CPU, 메모리, 스토리지 구성을 가져야 합니다
  • 로컬 스토리지: NVMe나 SSD 같은 로컬 연결 스토리지를 권장합니다

네트워크 구성

요청을 받을 때는 로드밸런서를 통해서 각 호스트에 분배되는데, 호스트는 요청을 받아서 다른 호스트에 작업을 분배하게 됩니다.
로드 밸런싱에 대해서는 "최소 연결"이나 "라운드 로빈"방식을 권장하고 있습니다.
MinIO는 S3 API를 엄격하게 구현하기 때문에 AWS Signature 알고리즘을 사용하므로, 클라이언트에서 제공되는 헤더를 전달하도록 구성해야 합니다.

스토리지 구성

MinIO가 최고 성능을 내기 위해 아래 사항들을 권장하고 있습니다.

  • 로컬 스토리지(DAS): NVMe나 SSD를 PCI-E 컨트롤러에 직접 연결
  • JBOD 구성: RAID, 풀링 등의 하드웨어/소프트웨어 복원력계층 없이 XFS로 포맷된 드라이브
  • 캐싱 비활성화: 드라이브나 컨트롤러 레벨의 캐싱은 I/O 스파이크를 일으켜 예측 불가능한 성능 저하 초래

가용성과 복원력

MinIO의 복원력과 가용성은 Erasure Coding 기술을 기반으로 제공됩니다. MinIO는 각 객체를 데이터 및 패리티 샤드로 분할하고 해당 샤드를 단일 Erasure Set에 분산합니다

Erasure Coding

  • Erasure: 데이터 손실 상황.
  • Coding: 데이터를 변환하여 복구 정보 생성
  • Erasure Coding: 데이터 손실에도 복구 정보를 통해 원본 복구를 가능하게 하는 기술

Erasure Coding은 객체를 데이터(K)와 패리티(M) 샤드로 나누어서 저장하는 기술입니다. N (ERASURE SET SIZE) = K (DATA) + M (PARITY)
MinIO는 드라이브들을 Erasure Set이라는 단위로 그룹화 하고, 각 Erasure Set은 독립적으로 동작합니다.

핵심 동작원리를 설명하면 아래와 같고, 실제 데이터가 저장되고 복구되는 부분은 아래 이미지를 참조하면 이해하기 쉽습니다.

  • 객체 분할: 원본 파일을 여러 데이터 샤드로 분할
  • 패리티 생성: Reed-Solomon 알고리즘으로 패리티 샤드 생성
  • 분산 저장: 모든 샤드를 Erasure Set의 드라이브에 분산 저장

https://www.youtube.com/watch?v=VUxXH4uo4AY 자료

읽기/쓰기에 대한 쿼럼

MinIO는 쿼럼 개념을 통해 읽기/쓰기 가능 여부를 결정합니다.

  • 읽기 쿼럼: 패리티 수만큼 샤드 필요
  • 쓰기 쿼럼: 패리티가 50%인 경우 패리티+1

예를 들어, 8개의 드라이브로 구성된 Erasure Set에서 EC:2 (데이터 6 + 패리티 2) 구성을 사용한다고 가정하면 6개의 데이터 샤드와 2개의 패리티 샤드가 생성되어 총 10개 드라이브에 분산 저장됩니다. 최소 샤드 8개만 확보되면 원본 데이터를 완벽하게 복원할 수 있습니다.
패리티의 비율이 50%인 경우에는 네트워크 등 문제로 완벽히 둘로 Erasure set이 나눠졌을 때 (Split-brain)시나리오를 방지하기 위해서 입니다.

테스트 용도 까지 포함한 케이스로 좀 더 표를 나눠봤습니다.

1개 노드, 각 노드 1TB 디스크 16개 (총 16개 드라이브) (공식 문서 설명)

읽기 쿼럼 : 읽기 작업을 위한 최소 드라이브 수
쓰기 쿼럼 : 쓰기 작업을 위한 최소 드라이브 수

Parity 용량 비율 읽기 쿼럼 쓰기 쿼럼
EC:4 12TB 75% 12 12
EC:6 10TB 62.5% 10 10
EC:8 8TB 50% 8 9

4개 노드, 각 노드 1TB 디스크 3개 (총 12개 드라이브)

Parity 용량 비율 읽기 쿼럼 쓰기 쿼럼
EC:3 9TB 75% 9 9
EC:4 8TB 66.7% 8 8
EC:5 7TB 58.3% 7 7
EC:6 6TB 50% 6 7

4개 노드, 각 노드 1TB 디스크 2개 (총 8개 드라이브)

Parity 용량 비율 읽기 쿼럼 쓰기 쿼럼
EC:2 6TB 75% 6 6
EC:3 5TB 62.5% 5 5
EC:4 4TB 50% 4 5

4개 노드, 각 노드 1TB 디스크 1개 (총 4개 드라이브)

Parity 용량 비율 읽기 쿼럼 쓰기 쿼럼
EC:1 3TB 75% 3 3
EC:2 2TB 50% 2 3

객체 힐링(Object Healing)

힐링은 MinIO의 자동 복구 기능입니다. 드라이브 수준, OS, 파일 시스템, Bit Rot 등 다양한 이유로 발생할 수 있는 손상되거나 손실된 데이터를 자동으로 복구해주는 매우 중요한 기능이며, 복구는 Erasure Coding을 통해서 이뤄집니다.

MinIO는 세 가지 상황에서 객체를 힐링합니다.

  • GET/HEAD 요청 중: 매 요청 중 손상 발견시 즉시 복구 (요청마다 데이터 샤드의 일관성을 확인, 패리티 일관성은 확인 안함)
  • 스캐너를 통한 힐링: 정기적인 백그라운드 스캔 (객체 이름 해시를 사용하여 1024 개체 중 하나를 선택하여 무결성 검사)
  • 수동 요청: mc admin heal 명령어를 통해 전체 시스템을 복구

객체 스캐너

객체 스캐너의 작업은 저장 매체와 처리량 등에 의해 영향을 받을 수 있으며, 객체 수와 크기가 증가함에 따라 더 많은 시간이 걸릴 수 있습니다. 스캐너 작업시 읽기/쓰기 요청이 들어오면 스캐너를 일시 중지하게 됩니다.

객체 스캐너가 처리하는 작업은 아래와 같습니다.

  • 드라이브 데이터 사용량 계산
  • 라이프사이클 관리와 객체 retention 수행
  • 버킷이나 사이트 복제 수행
  • 데이터/패리티 객체 확인 후 객체 힐링

객체 스캐너는 클러스터 단위와 버킷 단위로 작업을 나눠서 실행합니다.
클러스터 수준에서 스캐너는 모든 버킷을 그룹으로 분할하고 한번에 한 그룹씩 버킷을 스캔하고, 버킷 수준에서는 버킷 내부의 객체 이름을 해시기반으로 16회의 사이클로 나눠서 모든 객체를 한번씩 검사합니다. 마지막 스캔 이후에는 새로 추가된 객체를 스캔합니다.

관련글 더보기