Client Synchronization

골덕·2024년 11월 26일
  • POSIX 의미론(POSIX semantics)에서는:
    • 읽기 작업은 항상 이전에 쓰여진 데이터를 반영해야 하고,
    • 쓰기 작업은 원자적(atomic)이어야 하며, 동시에 수행된 겹치는 쓰기 작업은 특정 순서를 따라야 합니다.

이를 Ceph에 구현한다면...

  • 하나의 파일이 여러 클라이언트에 의해 열려, 여러 쓰기 작업 또는 읽기와 쓰기가 혼합된 작업이 수행될 경우, MDS는 이전에 부여했던 읽기 캐싱과 쓰기 버퍼링 capability를 회수. 이를 통해 해당 파일의 클라이언트 I/O 작업이 동기식(synchronous)으로 처리되도록 강제.

  • 이 방식에서는 각 애플리케이션의 읽기 또는 쓰기 작업이 OSD로부터 승인을 받을 때까지 대기하며, 업데이트 직렬화와 동기화의 부담은 해당 오브젝트를 저장하는 OSD로 전가됩니다.

  • 쓰기 작업이 여러 오브젝트 경계를 넘는 경우, 클라이언트는 영향을 받는 오브젝트에 대해 해당 OSD로부터 배타적 잠금(exclusive lock)을 획득하고, 쓰기 작업을 즉시 제출한 후 잠금을 해제하여 원하는 직렬화(serialization)를 달성할 수 잉슴. 대규모 쓰기 작업에서도 동일하게 오브젝트 잠금을 사용하여, 데이터를 Asynchronous flush하면서 latency을 완화.

    • osd의 업데이트 직렬화와 동기화 부담을 제거
  • synchronous i/o(POSIX의 엄격한 동기화 요구)는 자체적으로 일관성을 관리하는 HPC와 같은 응용에 대해 불필요한 성능 저하를 유발

  • Ceph는 이러한 hpc 응용에 대한 consistency relaxation을 지원

  • O_LAZY 플래그 : 파일을 열 때 사용되는 새로운 플래그로, 일관성(coherency) 요구를 완화(relax)할 수 있도록 허용합니다.

    • 공유 쓰기(shared-write)가 발생하더라도, 쓰기 버퍼링(write buffering)읽기 캐싱(read caching)을 허용하여 동기화를 줄임.
  • HPC 애플리케이션은 O_LAZY를 통해 성능을 최적화하지만, 필요에 따라 특정 시점에서 동기화를 수행해야 할 수 있습니다. 이를 위해 Ceph는 다음과 같은 추가 호출을 제공합니다
  • lazyio_propagate
    • 기능: 특정 바이트 범위(byte range)에 대해 쓰기 버퍼의 데이터를 객체 저장소(object store)로 플러시(flush)합니다.
      • 즉, 버퍼에 저장된 데이터를 실제 저장소에 기록합니다.
    • 사용 예:
      • 애플리케이션이 데이터가 디스크에 안전하게 기록되었는지 보장해야 할 때 호출.
  • lazyio_synchronize
    • 기능: 이전에 플러시된 데이터가 읽기 작업에서 반영되도록 보장합니다.
      • lazyio_propagate 이후, 클라이언트 간의 데이터 일관성(consistency)을 보장하기 위해 사용.
    • 사용 예:
      • 여러 클라이언트가 데이터 공유 작업을 수행할 때, 특정 시점에서 데이터가 최신 상태인지 확인하려는 경우.
  • Ceph의 동기화 모델은 클라이언트 간 읽기-쓰기와 공유 쓰기 작업에서 강한 일관성을 보장하기 위해 동기식 I/O를 사용합니다(쓰기 작업은 비동기적이나 락 설정/해제는 동기적).
  • 동시에, 성능을 중시하는 분산 애플리케이션을 위해 강한 일관성을 완화하는 옵션도 제공하여, 일관성과 성능 간의 균형을 맞추는 유연한 접근 방식을 채택합니다.
profile
다시 시작하는 개발자

0개의 댓글