Distributed Systems

MinIO의 힐링(Healing) 메커니즘

2025-12-274 min read

MinIO의 힐링(Healing) 메커니즘

MinIO의 힐링 메커니즘은 분산 스토리지 환경에서 데이터 내구성을 보장하기 위한 핵심 기능입니다. 이 메커니즘은 디스크 장애, 손상된 메타데이터, 불완전한 쓰기 등을 감지하고 자동으로 복구합니다.

1. 힐링 프로세스 개요

힐링은 다음과 같은 단계로 진행됩니다:

func (er *erasureObjects) healObject(ctx context.Context, bucket, object, versionID string, opts madmin.HealOpts) (result madmin.HealResultItem, err error) {
    // 1. 객체 메타데이터 수집
    // 2. 객체 손상 여부 확인
    // 3. 필요시 데이터 복구
    // 4. 복구된 데이터 재배포
}

2. 손상 감지 메커니즘

디스크 상태 모니터링

MinIO는 지속적으로 디스크 상태를 확인합니다:

func diskErrToDriveState(err error) (state string) {
    if err == nil {
        return madmin.DriveStateOk
    }
    switch {
    case errors.Is(err, errDiskNotFound):
        return madmin.DriveStateOffline
    case errors.Is(err, errCorruptedFormat):
        return madmin.DriveStateCorrupt
    // ... 기타 상태 확인
    }
    return madmin.DriveStateUnknown
}

객체 무결성 확인

checkObjectWithAllParts 함수는 객체의 모든 부분이 올바르게 존재하는지 확인합니다:

func checkObjectWithAllParts(ctx context.Context, onlineDisks []StorageAPI, partsMetadata []FileInfo,
    errs []error, latestMeta FileInfo, filterByETag bool, bucket, object string,
    scanMode madmin.HealScanMode) (dataErrsByDisk map[int][]int, dataErrsByPart map[int][]int) {
    // 각 디스크에서 객체 부분 확인
    // 누락되거나 손상된 부분 식별
    // 디스크별, 부분별 오류 매핑
}

3. 힐링 결정 로직

MinIO는 다음 조건에 따라 힐링이 필요한지 결정합니다:

func shouldHealObjectOnDisk(erErr error, partsErrs []int, meta FileInfo, latestMeta FileInfo) (bool, bool, error) {
    switch {
    case erErr != nil:
        // 디스크 오류 발생 시 힐링 필요
        return true, false, nil
    case !meta.IsValid():
        // 메타데이터가 유효하지 않은 경우 힐링 필요
        return true, false, nil
    case meta.XLV1:
        // 구 버전 형식의 경우 업그레이드 필요
        return true, false, nil
    case meta.ModTime.Before(latestMeta.ModTime):
        // 메타데이터가 최신이 아닌 경우 힐링 필요
        return true, false, nil
    // ... 기타 조건
    }
    
    // 데이터 부분 손상 확인
    for _, err := range partsErrs {
        if err != 0 {
            return true, false, nil
        }
    }
    
    return false, false, nil
}

4. 데이터 복구 과정

쿼럼 기반 데이터 복구

MinIO는 충분한 수의 정상 디스크가 있을 때 손상된 데이터를 복구합니다:

func (e Erasure) Heal(ctx context.Context, writers []io.Writer, readers []io.ReaderAt, totalLength int64, prefer []bool) (derr error) {
    // 병렬로 데이터 블록 읽기
    // 리드-솔로몬 알고리즘으로 누락/손상된 블록 복구
    // 복구된 데이터를 해당 디스크에 쓰기
}

메타데이터 복구

객체 메타데이터 복구는 별도로 처리됩니다:

func writeAllMetadata(ctx context.Context, disks []StorageAPI, origbucket, bucket, prefix string, files []FileInfo, quorum int) ([]StorageAPI, error) {
    // 모든 디스크에 메타데이터 쓰기 시도
    // 쿼럼 충족 확인
}

5. 자동 힐링 스캐너

MinIO는 백그라운드에서 스캐너를 실행하여 손상된 객체를 식별합니다:

func (er erasureObjects) nsScanner(ctx context.Context, buckets []BucketInfo, wantCycle uint32, updates chan<- dataUsageCache, healScanMode madmin.HealScanMode) error {
    // 네임스페이스 스캔
    // 객체 상태 확인
    // 필요시 힐링 큐에 추가
}

6. 댕글링(Dangling) 객체 처리

댕글링 객체는 메타데이터는 있지만 실제 데이터가 없거나 불완전한 객체입니다:

func isObjectDangling(metaArr []FileInfo, errs []error, dataErrsByPart map[int][]int) (validMeta FileInfo, ok bool) {
    // 메타데이터와 실제 데이터 상태 비교
    // 불일치 발견 시 댕글링 객체로 판단
}

MinIO는 댕글링 객체를 감지하면 자동으로 삭제하거나 복구합니다:

func (er erasureObjects) deleteIfDangling(ctx context.Context, bucket, object string, metaArr []FileInfo, errs []error, dataErrsByPart map[int][]int, opts ObjectOptions) (FileInfo, error) {
    // 댕글링 객체 감지
    // 복구 가능성 평가
    // 복구 불가능하면 안전하게 제거
}

7. 성능 최적화

병렬 힐링

여러 객체와 디스크를 동시에 힐링하여 성능을 최적화합니다:

func (z *erasureServerPools) HealObjects(ctx context.Context, bucket, prefix string, opts madmin.HealOpts, healObjectFn HealObjectFn) error {
    // 병렬로 객체 스캔
    // 동시에 여러 객체 힐링
}

힐링 추적 및 메트릭

func healTrace(funcName healingMetric, startTime time.Time, bucket, object string, opts *madmin.HealOpts, err error, result *madmin.HealResultItem) {
    // 힐링 작업 추적
    // 성능 및 결과 메트릭 수집
}

결론

MinIO의 힐링 메커니즘은 분산 환경에서 데이터 일관성과 내구성을 보장하는 핵심 기능입니다. 디스크 오류, 데이터 손상, 메타데이터 불일치 등 다양한 장애 상황을 감지하고, 리드-솔로몬 이레이저 코딩을 통해 자동으로 복구함으로써 데이터 손실 없이 시스템이 지속적으로 작동하도록 합니다.

Share

Related Articles

Comments

이 블로그는 제가 알고 있는 것들을 잊지 않기 위해 기록하는 공간입니다.
직접 작성한 글도 있고, AI의 도움을 받아 정리한 글도 있습니다.
정확하지 않은 내용이 있을 수 있으니 참고용으로 봐주세요.

© 2026 Seogyu Kim