카테고리 없음

MinIO(Object Storage)의 개념 및 이해

코코무 2025. 4. 1. 15:07

MinIO?

오픈 소스로 제공되는 *분산 스토리지 솔루션으로, *클라우드 네이티브 환경에서 *S3 호환 API를 통해 데이터를 저장하고 관리할 수 있게 해준다. 주로 대규모 데이터 저장, 백업, 분석 용도로 사용되며, 경량화된 구조 덕분에 간편하게 배포하고 확장성 있게 구성할 수 있다.

*분산 스토리지: 하나의 물리적인 저장장치(하드디스크 등)에 데이터를 저장하는 게 아니라, 여러 대의 컴퓨터나 저장장치에 데이터를 나눠 저장하는 방식

*클라우드 네이티브 환경: 클라우드에서 태어난 애플리케이션을 위한 환경. 주로 Kubernates, 컨테이너(Docker), 자동화된 배포 같은 기술 사용.

*S3 호환 API: 아마존의 오브젝트 스토리지 서비스인 S3와 같은 방식(프로토콜, 명령어, URL 등)으로 동작하는 API. PUT, GET, DELETE 같은 명령어 사용. → RESTful API

 

쉽게 말해, 서버 여러 대를 묶어서 하나처럼 사용할 수 있게 해주고, S3처럼 데이터를 저장하고 불러오는 방식으로 쉽게 관리할 수 있게 도와준다(분산시켜 저장하기).

 

AWS S3와 100% 호환되므로, MinIO 스토리지로 사용하다가 S3 스토리지로 마이그레이션 하더라도 애플리케이션 코드를 수정하지 않아도 된다.

또한, AWS SDK(Python, Java, Node 등)로 MinIO에 바로 접근이 가능하다.

분산 스토리지, 왜 사용할까?
"데이터가 많아지면 어떻게 저장할까?" → 단일 디스크 또는 서버 저장 방식은 하드디스크가 고장나면 전체 데이터가 소실될 수 있고, 용량이 한계를 넘으면 스토리지 전체를 다시 구성해야 한다.

- 확장성: 데이터가 많아져도 서버나 디스크를 더 추가하면 됨(수평 확장)
- 고가용성: 한 노드(서버)가 고장 나도 다른 노드에 복사본이 있어서 장애 복구가 쉬움
- 속도 개선: 동시에 여러 노드가 데이터를 처리해서 속도가 빠라질 수 있음
- 신뢰성: 데이터가 여러 곳에 복제되어 있어서 유실 위험이 낮음

예를 들어, 사진 1,000장을 저장하고 싶은데 하드디스크 한 개에 다 넣으면 그 하드가 고장 나면 끝이다.
그런데 분산 스토리지를 쓰면 사진 500장은 서버 A에, 사진 501~1000장은 서버 B에 저장하면 된다. 그리고 이 두 서버가 서로 백업도 해주고 있다. 이렇게 되면 데이터가 안전하다!


오브젝트 스토리지(Object Storage)?

현대의 애플리케이션은 대용량의 비정형 데이터(이미지, 동영상, 로그 등)를 빠르게 저장하고 유연하게 관리할 수 있는 저장소를 요구한다. 기존의 파일 스토리지(File Storage)나 블록 스토리지(Block Storage)로는 이러한 요구를 완전히 충족하기에는 쉽지 않다.

그래서 등장한 것이 바로 오브젝트 스토리지다.

 

MinIO와 오브젝트 스토리지를 함께 다뤄야 하는 이유는, 오브젝트 스토리지가 MinIO의 기반이 되기 때문이다.

 

MinIO는 객체 저장 방식인 오브젝트 스토리지를 실제로 구현한 소프트웨어로, 오브젝트 스토리지의 원리를 실제로 사용할 수 있게 만든 실체(프로그램)이다.

 

객체의 구성 요소

1. 데이터: 실제 저장하려는 콘텐츠(이미지, 영상, 텍스트 등)

2. 메타데이터: 파일에 대한 정보(생성일, 권한, 설명, 커스텀 속성 등)

3. 고유 식별자: 객체를 구분하기 위한 고유 키(URL이나 UUID 같은 개념)

 

사진 한 장을 저장한다고 하자.

파일 스토리지에서는 그냥 폴더에 이름을 붙여 저장한다.

오브젝트 스토리지는 그 사진을 택배 박스에 담고 외부에 운송장(메타데이터)을 붙이고 추적번호(식별자)를 붙여 저장하는 방식이다.

그래서 찾을 때 폴더 경로가 아니라 추적번호를 통해 찾는다.

 

 

기존 저장 방식과의 비교

구분 파일 스토리지 블록 스토리지 오브젝트 스토리지
저장 단위 파일 블록 객체
식별 방식 경로 기반 오프셋 기반 고유 ID 기반
성능 고속 읽기/쓰기 고성능 DB용 대규모 데이터에 최적화
확장성 제한적 복잡 뛰어남 (수평 확장)
용도 일반 파일 저장 데이터베이스 클라우드, 백업, 미디어 등

 

오브젝트 스토리지는 수백만 개의 이미지, 영상, 문서 저장 / 백업 및 로그 아카이브 / *AI/ML 학습 데이터 저장 / 클라우드 기반 앱에서 정적 자산 관리 등의 상황에 쓰이기 적합하다.


MinIO의 아키텍처와 구성 방식(MinIO가 오프젝트 스토리지를 구현하는 방식)

 

1. 기본 구성: Standalone 모드

  • 가장 단순한 형태
  • 단일 서버에 MinIO를 설치하여 파일을 저장
  • 실습/개발 환경용으로 적합
  • /data 폴더를 오브젝트 저장소로 사용
  • 웹 콘솔 자동 제공(기본 포트: 9000, 9090)

2. 분산 모드

  • 여러 대의 서버(노드)와 디스크에 데이터를 분산 저장
  • 서버 장애가 나도 데이터는 안전하게 보존 가능
  • 수평 확장 가능(서버 추가 → 용량 자동 증가)

MinIO의 분산 오브젝트 스토리지 구조 예시

  • 예시: 4대의 서버, 각 서버에 4개의 디스크 → 총 16개의 디스크를 하나의 스토리지로 사용
    • 여러 개의 서버와 디스크를 묶어, 하나의 거대한 스토리지처럼 보이게 한다.
    • 수평 확장이 가능해서 서버를 늘리면 저장 용량, 처리 성능도 같이 늘어나고, 디스크를 더 꽂으면 자동으로 새로운 공간이 확보된다.
    • 내결함성: 16개의 디스크 중, 몇 개가 망가져도 전체 데이터는 안전하다(Erasure Coding).
  • 내부적으로 *Erasure Coding 사용해서 데이터를 나눠 저장하고 일부가 손실되어도 복구할 수 있게 설계되어 있음(데이터 복구 및 무결성 보장)
    • 디스크를 *JBOD, *JBOF로 사용하는 경우 보호 가능하다.
    • 데이터 중복 수준을 설정할 수 있고, 데이터를 N개의 조각으로 나누고 M개의 패리티 조각을 생성한다.

*Erasure Coding: RAID와 유사한 개념, 장애 복구용 데이터 분산 저장

*JBOD(Just a Bunch of Disks): 여러 개의 디스크를 하나의 서버에 직접 연결

*JBOF(Just a Bunch of Flash): 여러 개의 SSD(플래시 디스크)를 외장 장치 형태로 구성

  • 분산 모드에서는 모든 노드가 데이터의 일관성을 유지해야 함
    • 파일이 업로드된 직후, 어느 노드에서 읽더라도 동일한 내용을 봐야 함
  • strong consistency 모델을 따름(모든 노드에 쓰기 성공해야 그게 성공한 것)
  • IAM 정책, 정책 기반 버킷 접근 제어, user/token 기반 인증
  • 이벤트 기반 처리로 이벤트 발생 시, 외부 시스템에 이벤트 전송 가능
    • 새로운 이미지 업로드 시, Lambda/Kafka/Webhook으로 자동 처리
    • 데이터 파이프라인에 연동하기 매우 유용
  • MinIO는 Operator 기반으로 Kubernetes에 최적화되어 있음

 

주요 구성 요소와 실행 구조

구성 요소 역할
minio 서버 오브젝트 저장 및 API 제공
mc (MinIO Client) 버킷/객체 관리 CLI 도구
웹 콘솔 시각적으로 관리할 수 있는 UI
API AWS S3 API와 100% 호환됨
Gateway 모드 (선택) 기존 S3, GCS, Azure에 프록시처럼 연결 가능

  • 사용자는 S3 API로 요청
  • MinIO는 데이터를 여러 서버에 나눠 저장하고 요청 처리
  • 내부적으로 복제, 무결성 체크, 복구까지 자동 실행

 

MinIO 클러스터

분산 모드를 실무에서 실제로 구성하고 사용하는 형태로, 여러 대의 MinIO 서버를 네트워크로 묶어, 하나의 통합된 오브젝트 스토리지 시스템처럼 작동하도록 만든 구성이다.