저렴한 클라우드 스토리지를 1PB 로컬 드라이브로 만들기 (JuiceFS 활용)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00이것은 Juice.FS입니다. 고성능 오픈 소스 분산 파일 시스템으로, 클라우드 객체 스토리지의 무한한 확장성과 로컬 파일 시스템의 모든 기능 및 속도를 제공하도록 설계되었습니다.
00:00:14이번 영상에서는 Juice.FS를 살펴보고, 어떻게 작동하는지 알아본 뒤, Juice.FS를 사용하여 나만의 로컬 고성능 NAS(Network Attached Storage) 솔루션을 구축하는 방법을 보여드리겠습니다.
00:00:24정말 흥미로울 테니 바로 시작해보죠.
00:00:30S3, Google Cloud Storage, Backblaze B2와 같은 표준 객체 스토리지는 비용 효율성이 매우 뛰어나지만, 이를 사용하려면 일반적으로 기존 애플리케이션 워크플로를 깨뜨리는 특수 API나 도구가 필요합니다.
00:00:48Juice.FS는 투명한 추상화 계층 역할을 합니다.
00:00:51데이터와 메타데이터를 분리하여 원시 데이터 청크는 클라우드 제공업체에 직접 보내고, 파일 시스템 레이아웃, 권한, 디렉터리 구조는 Redis, Postgres, TIKV와 같은 빠른 데이터베이스 내에서 관리합니다.
00:01:07Juice.FS가 기존 클라우드 게이트웨이나 일반 네트워크 파일 공유와 완전히 다른 점은 이러한 엄격한 아키텍처 분리와 강력한 다중 계층 캐싱 엔진에 있습니다.
00:01:19애플리케이션이 파일에 접근할 때마다 지연 시간이 긴 클라우드 네트워크 요청을 기다리게 하는 대신,
00:01:26Juice.FS는 파일을 작고 최적화된 블록으로 나누고 로컬 NVMe 또는 SSD 파티션을 핫 스크래치 공간으로 활용합니다.
00:01:35애플리케이션이 처음 데이터를 읽거나 쓸 때는 네트워크를 통해 통신하지만, 두 번째로 요청할 때는 로컬 스토리지에서 하드웨어 라인 속도로 즉시 제공합니다.
00:01:47이를 통해 레거시 애플리케이션, 데이터베이스, 머신러닝 학습 파이프라인, 컨테이너 환경을 코드를 한 줄도 수정하지 않고 객체 스토리지 위에서 직접 실행할 수 있습니다.
00:01:59이론적으로는 훌륭하게 들리는데, 직접 테스트해서 어떻게 작동하는지 확인해 봅시다.
00:02:04이번 데모에서는 로컬 NAS를 설정할 예정이며, 모든 데이터는 원격 S3 버킷에 저장하고 메타데이터 엔진으로는 Redis를 사용하겠습니다.
00:02:16가장 먼저 해야 할 일은 Docker로 Redis 인스턴스를 실행하는 것인데, 이 명령어로 쉽게 할 수 있습니다.
00:02:24그다음 juice.FS format 명령어를 실행하여 파일 시스템을 초기화해야 합니다.
00:02:29이 단계는 데이터베이스와 스토리지 버킷을 매핑하는 방법을 Juice.FS에 정확히 알려줍니다.
00:02:34Redis 연결 문자열, AWS S3 버킷 이름, 클라우드 액세스 자격 증명을 전달합니다.
00:02:41하지만 이 명령어를 실행하기 전에 S3 버킷과 액세스 키, 비밀 키를 미리 생성해 두었는지 확인하세요.
00:02:48저는 미리 만들어 두었습니다.
00:02:50이제 이 명령어를 실행해도 Juice.FS는 아직 S3 버킷 내부의 내용을 바꾸지는 않습니다.
00:02:56Redis 내부에 스토리지 스키마를 구성하고 새로운 가상 파일 시스템에 고유한 UUID를 할당할 뿐입니다.
00:03:03포맷 단계가 완료되면 juice.FS mount 명령어를 사용하여 로컬 머신에 장치를 마운트합니다.
00:03:10Juice.FS에 Redis 인스턴스를 지정하고 로컬 디렉터리 경로를 제공합니다.
00:03:15제 경우에는 홈 디렉터리 안의 폴더입니다.
00:03:18실행하기 전에 중요한 주의 사항이 하나 있습니다.
00:03:21Mac은 기본적으로 사용자 지정 파일 시스템을 지원하지 않기 때문에, Mac Fuse라는 커널 확장 유틸리티를 먼저 설치해야 합니다.
00:03:30이것이 Juice.FS가 Mac 운영 체제와 통신하는 데 필요한 기반 소프트웨어 훅을 제공합니다.
00:03:37그리고 여유 공간 비율 플래그를 함께 설정하는데, 기본값이 전체 드라이브의 20%로 설정되어 있어 꽤 높은 편이기 때문입니다.
00:03:47기본적으로 이는 캐시를 호스팅하는 로컬 드라이브의 용량이 특정 비율 아래로 떨어지면,
00:03:55새로운 캐시 파일 쓰기를 중단하고 가장 오래되었거나 가장 적게 액세스한 블록부터 적극적으로 삭제하도록 합니다.
00:04:01이렇게 하면 로컬 운영 체제의 디스크 공간이 완전히 부족해지는 것을 방지할 수 있습니다.
00:04:05좋습니다.
00:04:06이제 이 명령어를 실행해 보죠.
00:04:07실행하는 즉시 운영 체제는 표준 POSIX 호환 파일 시스템 마운트를 등록합니다.
00:04:15컴퓨터 입장에서는 1테라바이트의 사용 가능한 공간을 가진 거대한 외장 하드 드라이브를 연결한 것처럼 보입니다.
00:04:23이제 외장 드라이브처럼 이 디렉터리로 파일을 쉽게 드래그할 수 있습니다.
00:04:28S3 버킷 대시보드로 이동하면, Juice.FS가 파일을 저장하고 데이터 청크로 분할한 것을 볼 수 있습니다.
00:04:37이 모든 작업이 백그라운드에서 이루어지므로 사용자가 직접 힘든 작업을 할 필요가 없습니다.
00:04:42캐싱이 어떻게 작동하는지 보여드리기 위해 고전적인 터미널 명령어 DD를 사용하여 파일 시스템을 벤치마킹하겠습니다.
00:04:49DD를 사용해 본 적이 없다면, 이는 원시 데이터 복사에 사용되는 내장 유틸리티입니다.
00:04:55이 명령어에서 'if'는 입력 파일인데, Juice.FS 드라이브에 추가한 대형 영상 파일 중 하나를 가리킵니다.
00:05:03'of'는 출력 파일입니다.
00:05:06데이터를 실제로 복사하는 것이 아니라 벤치마크를 수행하는 것이므로, 데이터를 즉시 폐기하는 운영 체제의 블랙홀인 dev/null로 라우팅합니다.
00:05:17이번 예제에서는 벤치마크만 수행하는 것입니다.
00:05:19또한 Juice.FS가 데이터를 청크로 나누는 방식에 맞춰 블록 크기를 4메가바이트로 설정합니다.
00:05:25마지막으로 파일 전송에 정확히 얼마가 걸리는지 확인하기 위해 전체 라인 앞에 'time' 유틸리티를 붙입니다.
00:05:32엔터를 누르면 파일이 막 업로드되었기 때문에 '콜드 리드(Cold Read)'라고 불리는 과정이 시작됩니다.
00:05:38로컬 머신에는 아직 파일 복사본이 없기 때문입니다.
00:05:41그래서 Juice.FS는 인터넷을 통해 S3 버킷으로 접속하여 4메가바이트 데이터 청크를 하나씩 가져와 스트리밍해야 합니다.
00:05:50보시다시피 제 연결 환경에서는 첫 번째 실행에 상당히 오랜 시간이 걸립니다.
00:05:55하지만 같은 명령어를 두 번째로 실행할 때 무슨 일이 일어나는지 보세요.
00:05:59짠.
00:06:00여기 있습니다.
00:06:01터미널 프롬프트가 거의 즉시 반환됩니다.
00:06:03두 번째 실행은 1초도 걸리지 않았습니다. 이제 캐시에 저장되어 유기적으로 읽어오고 있기 때문입니다.
00:06:10이것이 바로 다중 계층 캐싱 엔진이 실제로 작동하는 방식입니다.
00:06:14Juice.FS는 첫 번째 실행 중에 청크를 다운로드하면서 조용히 로컬 NVMe 스크래치 디스크에 복사하고 있었습니다.
00:06:22하지만 두 번째 단계에서는 인터넷을 완전히 우회하여 로컬 하드웨어 라인 속도로 데이터를 직접 가져옵니다.
00:06:29즉, 클라우드의 무한하고 저렴한 저장 용량과 로컬 드라이브의 제로 지연 속도를 모두 누릴 수 있는 것입니다.
00:06:37이 데모에서는 영상 파일을 사용하여 기능을 보여드렸지만, 이는 거의 모든 실제 인프라 시나리오에 적용됩니다.
00:06:45컨테이너 환경을 관리하는 DevOps 엔지니어라면 Juice.FS를 사용하여 Kubernetes 클러스터 전반에 공유 영구 스토리지를 제공할 수 있습니다.
00:06:54모든 노드에 비싼 클라우드 블록 스토리지를 구매할 필요 없이, 모든 파드가 동일한 Juice.FS 볼륨을 동시에 마운트할 수 있습니다.
00:07:03설정 파일, 애플리케이션 자산, 사용자 업로드 파일을 전역적으로 공유하면서 비용은 매우 낮게 유지할 수 있습니다.
00:07:10또한 머신러닝과 데이터 과학 파이프라인에도 엄청난 이점이 있습니다.
00:07:14S3 버킷에 수백 기가바이트의 학습 이미지나 텍스트 데이터셋이 있을 때, ML 모델을 학습시키려면 일반적으로 전체 데이터셋을 먼저 로컬로 다운로드해야 하는데, 이는 시간과 저장 공간을 낭비하게 합니다.
00:07:30하지만 Juice.FS를 사용하면 학습 스크립트가 즉시 실행되기 시작합니다.
00:07:35파이프라인은 마운트를 통해 데이터를 순차적으로 읽고, Juice.FS는 백그라운드에서 고처리량 스트리밍과 로컬 캐싱을 처리하여 로컬 스토리지 병목 현상 없이 GPU를 완전히 활용하게 합니다.
00:07:49하나 더 보여드리고 싶은 멋진 기능이 있습니다.
00:07:51Better Stack을 사용하여 파일 시스템에 쉽게 메트릭을 연동할 수 있습니다.
00:07:55Juice.FS 볼륨을 마운트할 때마다 백그라운드에서 로컬 Prometheus 호환 메트릭 서버가 조용히 실행됩니다.
00:08:03브라우저에서 해당 URL로 이동하면 모든 메트릭을 일반 텍스트로 볼 수 있으며, 각 캐시 적중, 읽기 시간, S3 요청 오류가 실시간으로 추적됩니다.
00:08:13이 원격 측정 데이터를 대시보드로 직접 보내기 위해 Better Stack의 기본 Prometheus 스크래핑 기능을 사용할 수 있습니다.
00:08:21먼저 소스로 이동하여 Juice.FS를 소스로 연결해야 합니다.
00:08:25메트릭 탭에서 Prometheus 스크래프를 선택하고 소스 연결을 클릭하세요.
00:08:31이제 로그를 수집해야 합니다.
00:08:33그 전에 ngrok과 같은 도구를 사용하여 로컬 메트릭 포트에 대한 안전한 공개 터널을 열고 ngrok URL을 붙여넣어야 합니다.
00:08:43하지만 ngrok에서 작동하게 하려면 고급 옵션으로 이동하여 'ngrok-skip-browser-warning'이라는 사용자 지정 HTTP 헤더를 추가하고 true로 설정해야 합니다.
00:08:53이것이 ngrok에 경고 페이지를 완전히 우회하라고 지시하여 Better Stack이 몇 초마다 원시 메트릭을 안전하게 스크래핑할 수 있게 합니다.
00:09:01이제 메트릭이 자동으로 수집되기 시작할 것입니다.
00:09:05가장 멋진 부분을 보여드리겠습니다.
00:09:07이제 Better Stack의 AI SRE로 이동하여 AI SRE에게 캐시 성능이나 지연 시간, 시스템 처리량을 모니터링하는 대시보드를 만들어 달라고 요청할 수 있습니다.
00:09:19몇 초 안에 AI SRE가 Juice.FS에서 들어오는 모든 메트릭을 포함한 멋진 맞춤형 대시보드를 제작해 줄 것입니다.
00:09:27실시간으로 업데이트되는 것도 확인할 수 있습니다.
00:09:32정말 멋지지 않나요?
00:09:34이 작은 데모를 통해 Juice.FS가 최신 인프라 모니터링과 결합되었을 때 얼마나 강력한지 보여드렸기를 바랍니다.
00:09:41저렴한 표준 클라우드 스토리지 버킷을 하드웨어 라인 속도로 작동하는 무한 확장 가능한 로컬 드라이브로 바꾸고, 완전 자동화된 관찰 대시보드에 단 몇 분 만에 연결했습니다.
00:09:57자, 여기까지입니다.
00:09:58이것이 바로 Juice.FS의 핵심입니다.
00:10:00Juice.FS에 대해 어떻게 생각하시나요?
00:10:02써보셨나요?
00:10:03앞으로 사용하실 건가요?
00:10:04아래 댓글 섹션에 알려주세요.
00:10:06이런 기술적인 분석 영상이 마음에 드셨다면 영상 아래의 좋아요 버튼을 눌러주세요.
00:10:12그리고 저희 채널 구독도 잊지 마시고요.
00:10:15Better Stack의 Andrus였고, 다음 영상에서 뵙겠습니다.

Key Takeaway

JuiceFS는 분산 파일 시스템과 다중 계층 캐싱을 사용하여 S3 같은 저렴한 객체 스토리지를 로컬 드라이브 수준의 빠른 성능을 가진 고성능 NAS로 변환한다.

Highlights

  • JuiceFS는 데이터와 메타데이터를 분리하여 원시 데이터는 클라우드 객체 스토리지에, 파일 시스템 구조와 권한 정보는 Redis, Postgres 등의 데이터베이스에 관리한다.

  • 로컬 NVMe 또는 SSD 파티션을 핫 스크래치 공간으로 활용하여 반복적인 데이터 접근 시 네트워크 지연 없이 하드웨어 라인 속도로 파일에 접근한다.

  • Mac OS에서 JuiceFS를 사용하기 위해서는 커널 확장 유틸리티인 Mac Fuse 설치가 필수적이다.

  • 캐시 호스팅 드라이브의 용량이 설정 비율 이하로 떨어지면, 가장 오래되거나 적게 사용된 블록을 자동으로 삭제하여 디스크 공간 부족을 방지한다.

  • 머신러닝 파이프라인에서 데이터셋 전체를 로컬로 다운로드할 필요 없이 마운트된 드라이브를 통해 즉시 데이터를 읽어 처리할 수 있다.

  • Prometheus 호환 메트릭 서버가 내장되어 있어 Better Stack과 같은 도구를 통해 실시간으로 캐시 성능과 지연 시간을 모니터링할 수 있다.

Timeline

JuiceFS 아키텍처와 작동 원리

  • JuiceFS는 클라우드 객체 스토리지의 확장성과 로컬 파일 시스템의 속도를 결합한 오픈 소스 분산 파일 시스템이다.
  • 데이터를 작고 최적화된 청크로 분할하여 클라우드에 저장하고 메타데이터는 빠른 데이터베이스에 별도로 관리한다.
  • 강력한 다중 계층 캐싱 엔진을 통해 첫 번째 데이터 접근 이후부터는 로컬 스토리지에서 즉시 데이터를 제공한다.

클라우드 객체 스토리지는 비용 효율적이지만 표준 애플리케이션과의 호환성이 부족하다. JuiceFS는 투명한 추상화 계층을 제공하여 코드를 수정하지 않고도 클라우드 스토리지를 로컬처럼 사용할 수 있게 한다. 로컬 NVMe 캐시를 활용하여 네트워크 지연 시간을 제거하는 것이 핵심 성능 비결이다.

로컬 NAS 구축 및 마운트 설정

  • Redis를 메타데이터 엔진으로 사용하고 AWS S3 버킷에 데이터를 저장하는 방식으로 구성한다.
  • juicefs format 명령어로 데이터베이스와 스토리지 버킷을 매핑하고 UUID를 할당한다.
  • Mac OS는 Mac Fuse 커널 확장을 설치해야 하며, 여유 공간 비율 플래그를 통해 디스크 공간 부족을 예방할 수 있다.

Docker를 통해 Redis 인스턴스를 먼저 실행한 후 파일 시스템을 포맷하고 마운트한다. 마운트 과정에서 디스크 공간의 20%를 캐시 비우기 기준으로 설정하여 로컬 운영 체제의 안정성을 확보한다. 마운트가 완료되면 컴퓨터는 1TB 용량의 외장 드라이브가 연결된 것처럼 인식한다.

캐싱 벤치마크 및 활용 사례

  • 첫 번째 파일 읽기(콜드 리드)는 네트워크를 통해 데이터를 가져오지만, 두 번째부터는 로컬 캐시에서 즉시 반환된다.
  • Kubernetes 환경에서 공유 영구 스토리지를 제공하여 비용 절감과 데이터 일관성을 유지한다.
  • 머신러닝 학습 시 데이터를 별도 다운로드할 필요 없이 고처리량 스트리밍으로 GPU 병목 현상을 방지한다.

DD 유틸리티를 통한 벤치마크 결과, 데이터가 캐싱된 이후 파일 접근 속도는 1초 미만으로 단축된다. 이는 데이터 로컬 복사본이 없을 때는 클라우드에서 가져오고, 그와 동시에 로컬 스크래치 디스크에 저장하는 방식 덕분이다. 이러한 특성은 대규모 데이터가 필요한 ML 파이프라인에서 특히 유용하다.

시스템 모니터링 및 자동화

  • JuiceFS는 볼륨 마운트 시 Prometheus 호환 메트릭을 실시간으로 자동 생성한다.
  • ngrok을 사용하여 로컬 메트릭 서버에 안전한 터널을 생성하고 외부 모니터링 툴에 데이터를 전달한다.
  • AI SRE를 활용하여 수집된 메트릭을 바탕으로 지연 시간 및 처리량을 보여주는 대시보드를 자동 제작할 수 있다.

Better Stack과 같은 모니터링 솔루션과 결합하여 캐시 적중률과 요청 오류를 실시간 추적한다. ngrok 설정 시 경고 페이지를 우회하도록 헤더를 조정하여 원활한 스크래핑을 보장한다. 최종적으로 AI 도구를 통해 인프라 상태를 시각화하는 대시보드를 수 초 내에 구성할 수 있다.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video