DAOS가 무엇이고,구성 요소, 작동방식 및 코드를 살펴본다.
분산형 비동기식 오브젝트 스토리지(DAOS)란 인텔에서 개발한 대규모로 분산된 비 휘발성 메모리(NVM)을 위해 처음부터 철저하게 고안된 오픈소스 소프트웨어로 정의된 오브젝트 저장소이다.
DAOS는 key-value 스토리지 인터페이스와 Transactional non-blocking I/O를 제공한다. 또한, 자가 복구 기능을 갖춘 고급 데이터 보호, E2E 무결성 비용을 최소화하기 위한 elastic storage와 세분화된 데이터 제어같은 기능을 제공하는 SCM(Storage Class Memory),NVMe(NVM express)와 같은 차세대 기술을 사용한다
첫번째는 비즈니스,정부,학계에서 데이터 중심 어플리케이션의 등장함에 따라 기존의 I/O모델이 한계를 넘어섰다. 최근 I/O 작업량은 정렬 안 되있고, 분열되어있는 데이터로 구성된 메타데이터의 비율이 증가하고 있다. 전통적인 저장공간 스택들은 많은 지연시간과 Alignment 제약으로 이러한 작업량에 대해 낮은 성능을 전달한다.
하지만, DAOS는 전세계에서 접근 가능한 오브젝트 어드레스 스페이스로 페브릭을 걸쳐 분산된 SCM과 NVMe 스토리지를 종합하여 성능 저하 없이 일관성, 가용성 및 복원력을 제공하는 완벽한 I/O 아키텍처이다.
두번째는 기하급수적인 데이터의 증가로, 분산 스토리지 시스템은 데이터센터의 중심이 되면서 병목현상도 초래했다. 긴 데이터 접근 시간, 낮은 확장성, 대규모 데이터셋 관리 어려움 및 쿼리 능력 결여는 단순히 일반적인 장애의 몇가지 예였다. 전통적인 스토리지 시스템은 Rotating media와 POSIZ을 위해 고안되었다. 이러한 스토리지 시스템은 주요 성능 병목현상을 보여진다. 그리고 이 시스템은 데이터모델과 차세대의 작업흐름을 지원하기 위한 발전이 어렵다.
컨테이너는 여러 컴퓨팅 노드에 POSIX 네임스페이스에서 공유된 대로 탑재될 수 있다. 이 기능은 native libdaos 라이브러리를 통해 파일과 디렉토리 추상화를 구현할 수 있는 libdfs 라이브러리에 의해 제공되고 있다. POSIX 에뮬레이션(emulation)은 직접 애플리케이션과 I/O 프레임워크에 직접 노출될 수 있다. (예를 들어, Spark와 텐서플로우와 같은 프레임워크, 또는 다른 저장공간 백엔드 플러긴을 지원하는 IOR와 mdtest와 같이).
또한, POSIX read/write operation을 위해 완전한 OS 우회를 전달함으로써, 몇몇 FUSE 성능 병목현상의 일부를 다루기 위한 interception 라이브러리와 선택적으로 합쳐진, FUSE 데몬을 통해 투명하게 노출될 수 있다.
성능은 DFS API를 직접 사용할 때 일반적으로 최고이다. IO interception 라이브러리는 최소한의 오버헤드를 가진 DFS API처럼 IO 명령어에 대해 같은 성능을 만들 수 있다. fuse/kernel 레이어를 우회하는 interception이 아니기 때문에 dfuse를 통한 메타데이터 명령어의 성능은(파일생성,삭제,이름변경 등) DFS API보다 훨씬 느릴 것이다.
libdfs란? DAOS File System(DFS)는 libdfs 라이브러리에서 구현된다, 그리고 DAOS 컨테이너를 계층적 네임스페이스로써 접근할 수 있도록 허락한다. libdfs는 files,directories 그리고 symbolic links를 지원하지만 hard links은 지원하지않는다. 접근 허가는 부모 pool로부터 상속된다. 그리고 a per-file or per-directory 기반으로 구현될 수 없다.
지원되는 명령어 Mount: create/open superblock and root object Un-mount: release open handles Lookup: traverse a path and return an open file/dir handle IO: read & write with an iovec Stat: retrieve attributes of an entry Mkdir: create a dir Readdir: enumerate all entries under a directory Open: create/Open a file/dir Remove: unlink a file/dir Move: rename Release: close an open handle of a file/dir Extended Attributes: set, get, list, remove
DFuse (DAOS FUSE) DFuse는 표준 libc/kernel/VFS POSIX 인프라스트럭처(infrastructure)을 통해 DAOS FIle System접근을 제공한다. 기존 애플리케이션은 수정없이 DAOS를 사용하는 걸 허락했다. 그리고 native DAOS 지원으로 애플리케이션을 업그레이드할 방법을 제공했다. 게다가 DFuse는 interception 라이브러리(liboil)를 제공한다. 애플리케이션의 재컴파일 또는 수정없이 I/O위한 OS우회를 제공하면서 POSIX 클라이언트에게 직접 DAOS 서버에게 전달하도록 허락한다.
DFuse Daemon dfuse 데몬은 DAOS에서 사용자 POSIX 접근을 제공하기 위해 노드당 싱글 인스턴스로 운영된다. 사용자 인증을 사용하여 실행해야하며 일반적으로 자원 매니저와 스케쥴러의 프롤로그 및 에필로그 스크립트의 일부로써 각 계산 노드로 실행되고 멈출 것이다.
제약사항 DFuse는 단일 유저로 제한된다. 루트를 포함해서 다른 유저들로부터 파일 시스템 엑세스가 허용되지않는다. 그 결과로, chown과 chgrp 호출은 지원하지않는다. 심볼릭 링크를 제외한, 하드 링크와 special device files은 지원되지 않으며 ACLs 또한 지원되지않는다. 터미널 창을 열어두거나 DFuse는 foreground에서 작동될 수 있다. 또는 시스템 데몬처럼 실행되도록 데몬화 할 수 있다. 하지만 이것을 하기 위해 그리고 여전히 DAOS를 접근하기 위해 daos_init()호출 전에 데몬화할 필요가 있다. 결국에 이것은 stdout/stderr 또는 리턴코드를 통해서 특정 종류의 시작오류를 보고할수 없음을 의한다. 초기에 DFuse가 시작할 때 failure을 더 잘 관찰하기위해서 foreground mode( --foreground)로 실행하길 추천된다. Inode는 DFuse에의해 로컬노드로 관리된다. 그래서 inode 번호는 세션동안에 노드에서 유지하지만, 그 번호가 접근 노드 간 또는 Dfuse의 재시작 간에 일관성을 보장하지 않는다.
DFuse를 통해 pool/container 리스트는 볼수 없다. readdir,ls 또는 다른 것을 사용한다면 DFuse는 ENOTSUP을 돌려준다.