DEV/OS

Block/File/Object Storage 그리고 Goofys(Fuse)

행운개발자 2025. 4. 14. 22:40
728x90

저장소 시스템 종류

저장소 시스템 종류에는 크게 3가지가 있다.

  • block storage
  • file storage
  • object storage

세 가지 종류의 storage의 차이점을 이해해보자. 그리고 Fuse가 무엇이고 어떤 경우에 사용되는 것인지까지 이해해보자. 먼저 각 Storage에 대한 개념적인 설명이다.

block storage

HDD나 SSD처럼 서버에 물리적으로 연결되는 형태의 드라이브는 블록 저장소의 가장 흔한 형태이다. 블록 저장소는 raw block을 서버에 volume의 형태로 제공한다. 가장 유연하고 융통성이 놓은 저장소다. 서버는 raw block을 포맷한 다음 파일 시스템으로 이용하거나 애플리케이션에 블록 제어권을 넘겨버릴 수도 있다. 데이터베이스나 가상 머신 엔진 같은 애플리케이션은 raw block을 직접 제어하여 최대한의 성능을 끌어낸다.

블록 저장소는 서버에 물리적으로 직접 연결되는 저장소에 국한되지 않는다. 고속 네트워크를 통해 연결될 수도 있고, 업계 표준 연결 프로토콜인 FC(Fiber Channel)이나 iSCSI를 통해 연결될 수도 있다. 개념적으로 보자면 네트워크를 통해 연결되는 블록 저장소도 원시 블록을 제공한다는 점에서 다르지 않다. 서버 입장에서 보면 물리적으로 연결된 블록 저장소와 마찬가지로 동작한다.
네트워크를 통해서 연결되는 저장소라고 하면 NFS가 먼저 떠오르는데, NFS는 block storage가 아니가 file storage의 한 종류이다.

가상 머신, 데이터 베이스 같은 높은 성능이 필요한 애플리케이션에 사용된다.

file storage

파일 저장소는 블록 저장소 위에 구현된다. 파일과 디렉토리를 쉽게 다루는 데 필요한 더 높은 수준의 추상화를 제공한다. 데이터는 데이터의 계층으로 표현하는 디렉토리 안에 보관된다. 파일 저장소는 가장 널리 사용되는 범용 저장소 솔루션이다. SMB/CIFS나 NFS와 같은 파일 수준 네트워크 프로토콜을 사용하면 하나의 저장소를 여러 서버에 동시에 붙일 수도 있다. 파일 저장소를 사용하는 서버를 블록을 직접 제어하고, 볼륨을 포맷하는 등의 까다로운 작업을 신경 쓸 필요가 없다. 파일 저장소는 단순하기 때문에 폴더나 파일을 같은 조직 구성원에 공유하는 솔류션으로 사용하기 좋다.

범용적 파일 시스템 접근이 필요한 곳에 사용된다.

object storage

객체 저장소는 새로운 형태의 저장소다. 데이터 영속성을 높이고 대규모 애플리케이션을 지원하며 비용을 낮추기 위해 의도적으로 성능을 희생한다. 실시간으로 갱신할 필요가 없는 상대적으로 cold 데이터 보관에 초점을 맞추며 데이터 아카이브나 백업에 주로 쓰인다. 모든 데이터를 수평적 구조 내에 객체로 보관한다. 계층적 디렉터리 구조는 제공하지 않는다. 데이터 접근은 보통 RESTful API를 통한다. 다른 유형의 저장소에 비해 상대적으로 느리다.

바이너리 데이터, 구조화되지 않은 데이터의 저장에 사용된다.

Goofys

Goofys allows you to mount an S3 bucket as a filey system.

 

Goofys Github에 소개된 내용이다. file storage가 block storage 위에 구현되는 것은 이해할 수 있다. 그런데 object storage를 file system으로 mount할 수 있게 한다는 것은 무슨 뜻일까?

일단 아래와 같이 goofys를 실행하고 실행하면 아래와 같이 bucket에서 목록 조회하는 명령을 ls 로 할 수 있게 된다. 신기하다.

- goofys build
- go.mod 확인
- ~~go 1.14 다운로드 https://go.dev/dl/~~
    - 설치 후 cd {goofys} & go build 하면 go 1.17 필요하다고 나옴
- go 1.17 다운로드
- git clone
- go build
- go install
- ./goofys {bucketName} /Users/hwanseok/study/study-goofys

 

 

Goofys를 이해하기 위해서는 먼저 Fuse를 이해해야한다.

FUSE (Filesystem in Userspace) is an interface for userspace programs to export a filesystem to the Linux kernel

 

FUSE Github에 소개된 내용이다. 이해가 잘 되지 않는다. 우선 간단하게 알아보자.

Fuse

FileSysem은 일반적으로 Kernel mode에서 동작한다. 일반적으로 개발자들을 user mode에서 개발을 하고 File I/O가 필요한 경우 kernel mode의 기능을 사용한다. 그런데 FUSE는 filesystem이 usermode에서 동작하도록 도와주는 역할을 한다. 이제 FUSE에 대한 아래의 설명을 좀 더 이해가 잘 된다.

FUSE (Filesystem in Userspace) is an interface for userspace programs to export a filesystem to the Linux kernel. The FUSE project consists of two components: the fuse kernel module (maintained in the regular kernel repositories) and the libfuse userspace library (maintained in this repository). libfuse provides the reference implementation for communicating with the FUSE kernel module.

 

FUSE가 user mode에서 filesystem을 사용할 수 있는 역할을 하고, libfuse를 통해서 FUSE의 기능을 사용할 수 있다.

A FUSE file system is typically implemented as a standalone application that links with libfuse. libfuse provides functions to mount the file system, unmount it, read requests from the kernel, and send responses back. libfuse offers two APIs: a "high-level", synchronous API, and a "low-level" asynchronous API.

 

libfuse를 사용하면 kernel 모드의 read request를 읽을 수 있다는 부분이 인상깊다.

In both cases, incoming requests from the kernel are passed to the main program using callbacks. When using the high-level API, the callbacks may work with file names and paths instead of inodes, and processing of a request finishes when the callback function returns. When using the low-level API, the callbacks must work with inodes and responses must be sent explicitly using a separate set of API functions.

 

위 설명에는 좀 더 구체적으로 콜백을 사용해서 incoming request가 처리됨을 알려주고 있다. file name과 path를 사용해서 처리될 수도 있고, inode를 사용해서 처리될 수도 있다.

Goofys 다시보기

이제 대략적으로나마 Goofys의 동작 과정을 이해할 수 있다.

  1. User Mode의 Application에서 File List 명령어 호출
  2. Kernel mode에서 File List에 대한 이벤트 감지
  3. libfuse를 통해 Goofys에 정의된 Callback을 실행
  4. Goofys에서는 mount된 bucket에 대해서 AWS S3 list API 호출
  5. AWS S3 list API 호출의 결과를 libfuse에게 응답으로 전달

좀 더 깊게

여기서부터 좀 더 깊게 이해하려면 File System에 대한 개념을 다시 정리해보아야겠다.

728x90