Dynamic Subtree Partitioning

골덕·2024년 11월 26일
  • primary-copy caching strategy

    • 특정 메타데이터의 캐시 일관성 관리와 업데이트 직렬화를 단일 권한을 가진 MDS가 책임지도록 설계
      • 단일 MDS가 특정 메타데이터의 "Primary Copy"를 소유하고 책임
    • 기존 분산 파일 시스템은 directory와 file metadata 분산을 위해 static subtree-based partitioning(dynamic workloads에 취약) 또는 hash functions(locality에 손해)을 사용
  • dynamic subtree partitioning strategy

    • 각 MDS는 디렉토리 계층 내 메타데이터의 인기를 지수 시간 감쇠(Exponential Time Decay)를 적용한 카운터로 측정

      • 최근 워크로드 분포를 나타내는 가중 트리(Weighted Tree)를 유지
    • MDS 간 부하를 비교해 특정 MDS가 과부하 상태인 경우, 작업량이 많은 서브트리를 다른 MDS로 이전

      • 서브트리 크기는 부하에 따라 조정되며 locality를 유지하기 위해 가능한 큰 단위(coarse-grained)로 이동
      • 클라이언트 요청에 영향을 최소화하며 작업 처리
    • Long-Term Storage(OSD Cluster)Namespace Lock을 통해 안전한 마이그레이션 지원

      • Long-Term Storage를 활용해 MDS 간 데이터를 쉽게 이동
      • Namespace Lock은 디렉토리 트리 잠금을 통해 다른 클라이언트 요청을 제한
        • 특정 디렉토리 트리를 관리하는 MDS 외에는 변경 권한 없음
        • 잠금은 protocol broadcasting으로 관리
    • 기존 MDS(MDS1)의 메모리 캐시에 저장된 메타데이터를 새로운 MDS(MDS2)로 전송

      • 새로운 MDS는 전송받은 데이터를 자신의 저널에 기록
      • 양쪽(MDS1, MDS2)의 저널에 상태를 기록해 장애 시 복구 가능성 보장
        • mds는 기본적으로 메타데이터 업데이트 요청을 받으면 캐시 및 저널에 모두 저장한 후에 ack를 날린 다고 보면 되고 migration할때도 mds1의 메타데이터를 mds2에게 전송할때 당연히 캐시와 저널이 모두 이동
    • 마이그레이션은 2단계 커밋(Two-Phase Commit) 방식으로 진행

      • 준비 단계: MDS1이 데이터를 MDS2로 전송, MDS2는 저널에 기록 후 준비 완료를 알림
      • 클라이언트 요청이 여전히 MDS1으로 들어올 경우, MDS1은 작업을 처리하고 이를 MDS2로 동기화
      • 커밋 단계: MDS1이 소유권 이전 완료를 기록, MDS2는 Primary로 전환 후 클라이언 트 요청 처리
  • MDS1에서 소유권이 완전히 이전되기 전에 장애가 발생해도 Ceph는 복구를 보장합니다.

    • Prepare Phase 중:
      • MDS1의 소유권이 유지되며, OSD 데이터 또는 저널을 통해 복구 가능(다른 노드에서).
    • Commit Phase 중:
      • MDS2가 준비 상태라면 새로운 Primary로 전환.
  • The resulting subtree-based partition is kept coarse to minimize prefix replication overhead and to preserve locality

    • coarse
      • 한 mds에 최대한 많은 디렉토리를 담으려 함
        • 유저 요청이 /dir3/dir4/dir5/file 이렇게오면 한개씩 다 확인해야 함
          • 트리 경로 전체 탐색
    • prefix replication
      • 서브 트리가 새로운 MDS로 이동할 때, 해당 서브트리의 상위 디렉토리 어디에 속하는지 기본적인 정보를 함께 replication함
  • 메타데이터를 여러 MDS에 복제할 때, inode를 세 가지로 나눔
    • Security: 파일 소유자(owner)와 접근 권한(mode).
    • File: 파일 크기(size)와 마지막 수정 시간(mtime).
    • Immutable: 변하지 않는 정보(immutable), 예를 들어 inode 번호, 생성 시간(ctime), 데이터 레이아웃(layout).
  • 각 그룹(Security, File, Immutable)은 독립적인 락 시스템상태 관리 방식을 가짐.
    • 서로 다른 사용 및 업데이트 패턴을 최적화하기 위해.
    • 락 충돌(lock contention)을 최소화하고, 성능을 높이기 위해.
profile
다시 시작하는 개발자

0개의 댓글