EBOFS

골덕·2024년 11월 25일

Extent and B-tree based Object File System(EBOFS)

ext3와 같은 로컬 파일 시스템을 기반으로 설계된 분산 파일 시스템은 Object Workload에 부적합

  • 기존 kernel interface는 object update가 disk에 안전하게 commit되었는지 확인이 어려움.
  • 게다가, POSIX interface는 데이터와 메타데이터를 원자적으로 업데이트하지 못함.
    • POSIX에서는 데이터와 메타데이터(예: 파일 크기, 권한, 수정 시간 등)를 별도로 업데이트하기 때문에, 두 작업이 동시에 보장되지 않음.
      • 단일 노드에서 요구되는 일관성은 분산 환경에 비해 덜함 (데이터와 메타데이터를 비동기적 처리하여 얻는 성능이 더 중요).
    • Ceph의 RADOS는 강력한 일관성을 보장하기 위해 데이터와 메타데이터 업데이트가 항상 동기화되어야 함
  • 이를 해결하려면 동기식 쓰기(synchronous writes) 또는 저널링(journaling)을 사용해야 하지만, 이는 지연(latency)성능 손실을 초래.

Ceph OSD는 EBOFS를 통해 Local Object Storage를 관리

  • 위 커널의 제약을 제거하기 위해, user space에 raw block device와 직접 상호작용하는 새로운 오브젝트 스토리지 인터페이스와 업데이트 방식(update semantics)을 구현.

    • user space approach를 통해 리눅스 VFS(Virtual File System)와 page cache와의 interaction을 피해 오버헤드 제거.
    • 데이터 업데이트는 먼저 메모리 캐시에서 처리하여 빠른 반응 속도를 제공하며, 디스크 쓰기는 비동기로 수행하여 최적화된 I/O 스케줄링을 지원.
    • 이 방식은 업데이트 직렬화와 비동기 디스크 커밋을 분리함으로써 성능, 데이터 일관성, 그리고 안정성을 모두 확보.
  • atomic transactions을 지원

    • 어떻게?
  • 일반적인 커널 파일 시스템은 데이터 업데이트를 일정 시간 동안 메모리에 보관한 후, 나중에 디스크에 기록하는 lazy flush를 하는 반면, EBOFS는 적극적으로 디스크 쓰기를 스케줄링함

    • 대신, 디스크 스케줄러의 I/O 큐를 길게 구성하고, 지속되는 업데이트로 인해 무효화된 I/O 작업들을 취소함으로서 디스크 I/O 효율성을 최대한 높임.
    • 스케줄링에 있어 워크로드에 따른 우선순위를 조정한다거나, QoS 보장을 제공할 수 있음.
      • 시스템 전체의 I/O를 관리하는 커널 스케줄러는 특정 워크로드 우선처리를 위한 정책 설정이나 QoS 설정이 어려움
  • EBOFS는 B-tree 서비스로서 디스크에서 오브젝트를 검색하고, 블록 할당을 관리하며, 컬렉션(Placement Group)을 인덱싱함.

    • 블록 할당은 Extent(시작 위치와 길이 pair) 단위로 수행
      • 기존 block list 방식보다 메타데이터를 더 압축
    • 빈 블록(Extent)은 크기별로 그룹화되고, 위치별로 정렬
      • 쓰기 위치 근처의 빈 공간을 빠르게 찾음
      • 관련 데이터와 가까운 위치에 데이터를 배치하여 데이터 지역성(locality)을 유지
      • 장기적으로 조각화(fragmentation)를 최소화
    • 오브젝트별 block allocation 정보를 제외한 모든 메타데이터는 메모리에 유지
      • 메타데이터는 크기가 작아 대규모 볼륨에서도 충분히 메모리에 저장 가능하며, 액세스 속도를 높이고 설계를 단순화 함.
      • 메타데이터 : 오브젝트 인덱스, Placement Group 인덱스
  • EBOFS는 Copy-on-Write를 적극적으로 사용

    • 기존 데이터를 수정하지 않고, 항상 디스크의 미할당 영역에 copy한 후 새 데이터를 씀
    • 데이터의 일관성과 안전성을 높임
  • 참고 (다 운영 체제가 자체적으로 제공하는 것)

사용자 공간

POSIX 인터페이스 (open, read, write 등)

  • open("file.txt", O_RDWR) → sys_open()
  • read(fd, buf, size) → sys_read()
  • write(fd, buf, size) → sys_write()
    ⇅ (시스템 콜)

커널 공간

  • 시스템 콜 인터페이스: POSIX 호출을 커널 내부 함수로 변환
    • sys_open(), sys_read(), sys_write()
  • VFS (Virtual File System): 파일 시스템 요청 추상화 및 라우팅
    • VFS open → ext4_lookup()
    • VFS read/write → ext4_read_inode(), ext4_write_block()
  • 파일 시스템 드라이버 (ext4, XFS 등): 실제 파일 시스템 작업 수행
    • ext4_read_inode(): 데이터 블록 확인
    • ext4_write_block(): 데이터 쓰기
  • 블록 디바이스 계층: 디스크 I/O 요청 스케줄링 및 디스크 드라이버 호출
    • bio_submit(): 블록 I/O 생성 및 처리

하드웨어 (Disk, SSD 등)

  • 디스크 드라이버가 디스크 장치와 명령 전송
profile
다시 시작하는 개발자

0개의 댓글