13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] FIO

  • [k8s] Kubernetes 스토리지: Longhorn vs Rook-Ceph 성능 벤치마크

    [k8s] Kubernetes 스토리지: Longhorn vs Rook-Ceph 성능 벤치마크

    안녕하세요, 13년차 서버실 지킴이입니다. 🤓

    Kubernetes(쿠버네티스) 환경에서 애플리케이션을 운영하다 보면, 영구 스토리지(Persistent Storage)의 중요성을 정말 뼈저리게 느끼게 됩니다. Pod(파드)가 재시작되거나 다른 노드로 옮겨가도 데이터는 안전하게 보존되어야 하니까요. 특히 저처럼 홈랩(Homelab)에서 이것저것 실험하며 삽질을 즐기는 사람이라면, 안정적이고 성능 좋은 스토리지를 찾는 데 꽤 많은 시간을 투자하게 되죠. 저도 그랬거든요! 🤔

    오늘은 제가 직접 홈랩에서 Longhorn(롱혼)과 Rook-Ceph(룩-세프) 두 가지 Kubernetes 영구 스토리지 솔루션을 설치하고, FIO(Flexible I/O Tester) 벤치마크 툴로 성능을 비교해본 경험을 공유해드리려고 합니다. 과연 어떤 녀석이 제 환경에 더 적합했을까요? 저의 삽질 여정을 따라오시면서 여러분의 Kubernetes 스토리지 선택에 도움이 되시길 바랍니다!

    왜 영구 스토리지가 필요할까요?

    Kubernetes는 기본적으로 컨테이너화된 애플리케이션을 배포하고 관리하는 데 최적화되어 있어요. 그런데 컨테이너는 휘발성(ephemeral)이라는 특징을 가지고 있거든요. 즉, 컨테이너가 죽거나 재시작되면 그 안에 저장된 데이터는 사라져 버린다는 뜻이죠. 데이터베이스나 파일 서버처럼 데이터를 영구적으로 보관해야 하는 애플리케이션에는 치명적일 수 있습니다.

    이런 문제를 해결하기 위해 Kubernetes에서는 영구 볼륨(Persistent Volume, PV)과 영구 볼륨 클레임(Persistent Volume Claim, PVC)이라는 개념을 도입했어요. 쉽게 말해, 스토리지 시스템으로부터 저장 공간을 할당받아 Pod가 데이터를 안정적으로 쓰고 읽을 수 있게 해주는 기능이라고 보시면 됩니다. 그리고 이런 영구 볼륨을 동적으로 프로비저닝(provisioning)해주는 역할을 하는 것이 바로 CSI(Container Storage Interface) 드라이버를 기반으로 하는 분산 스토리지 솔루션들이죠. 오늘 다룰 Longhorn과 Rook-Ceph가 바로 그런 친구들입니다.

    Kubernetes 영구 스토리지 아키텍처 개요

    Kubernetes 클러스터에서 영구 스토리지가 어떻게 작동하는지 대략적인 아키텍처를 그려봤어요. Pod가 PVC를 요청하면, CSI 드라이버가 백엔드 스토리지 시스템에 PV를 생성하고 Pod에 연결해주는 방식이죠. 이 과정에서 Longhorn이나 Rook-Ceph 같은 분산 스토리지 솔루션이 그 백엔드 역할을 하는 겁니다.

    Longhorn과 Rook-Ceph, 넌 누구니?

    본격적인 벤치마크에 앞서, 두 솔루션에 대해 간략하게 알아볼까요? 저도 처음엔 이름만 듣고 뭐가 뭔지 헷갈렸거든요. 😅

    Longhorn (롱혼)

    • 특징: Rancher Labs에서 개발한 오픈소스 분산 블록 스토리지 솔루션이에요. Kubernetes 위에서 컨테이너 형태로 동작하며, 각 노드의 로컬 스토리지를 모아 분산 볼륨을 생성합니다. CSI 드라이버를 기본으로 제공해서 Kubernetes와 통합이 정말 쉬워요. 제가 직접 써보니, 설치도 비교적 간단하고 웹 UI가 직관적이어서 관리하기 편하더라고요. 홈랩이나 소규모 환경에 많이 추천되는 이유를 알겠더군요.
    • 장점: 가벼움, 설치 및 관리 용이, 스냅샷/백업/복원 기능 내장, DR(재해 복구) 지원.

    Rook-Ceph (룩-세프)

    • 특징: Rook는 Kubernetes 네이티브 스토리지 오케스트레이터이고, Ceph(세프)는 강력하고 성숙한 오픈소스 분산 스토리지 시스템이에요. Rook는 Ceph를 Kubernetes 클러스터 위에 배포하고 관리하는 오퍼레이터(Operator) 역할을 합니다. 오브젝트 스토리지(Object Storage), 블록 스토리지(Block Storage), 파일 스토리지(File Storage)를 모두 지원하는 만능 재주꾼이죠. 다만, Ceph 자체가 워낙 복잡한 시스템이라 Rook를 통해 배포해도 초기 설정과 관리에 공수가 좀 들어가는 편이에요. 대규모 프로덕션 환경에서 많이 사용됩니다.
    • 장점: 뛰어난 확장성, 높은 가용성, 다양한 스토리지 타입 지원, 강력한 성능(하드웨어에 따라).

    두 솔루션의 주요 특징을 표로 정리해봤어요.

    구분 Longhorn Rook-Ceph
    개발사/기반 Rancher Labs / 분산 블록 스토리지 Rook (오퍼레이터) + Ceph (분산 스토리지)
    스토리지 타입 블록 스토리지 블록, 오브젝트, 파일 스토리지
    설치 난이도 쉬움 (Helm) 중간 ~ 어려움 (kubectl apply)
    관리 UI 직관적인 웹 UI Ceph Dashboard (별도 설치), Grafana 연동
    확장성 중간 (수십 TB 규모) 매우 높음 (페타바이트 규모)
    주요 사용처 홈랩, 소규모 개발/테스트, 엣지 컴퓨팅 대규모 프로덕션, 클라우드 인프라

    벤치마크 환경 구축하기

    저의 홈랩 환경은 다음과 같았습니다. 실제 벤치마크 결과는 하드웨어 스펙, 네트워크 환경, Kubernetes 설정 등에 따라 크게 달라질 수 있다는 점을 미리 말씀드려요! ⚠️

    • Kubernetes Cluster: 3 Node (1 Master, 2 Worker)
    • OS: Ubuntu Server 22.04 LTS
    • CPU: Intel i5-10400 (각 노드당 6코어 12스레드)
    • RAM: 32GB (각 노드당)
    • Storage: NVMe SSD 500GB (각 노드당, 스토리지용으로 할당)
    • Network: 1Gbps Ethernet

    벤치마크 툴로는 FIO (Flexible I/O Tester)를 사용했어요. FIO는 디스크 I/O 성능을 측정하는 데 널리 사용되는 강력한 도구예요. 순차 읽기/쓰기, 랜덤 읽기/쓰기 등 다양한 패턴으로 I/O를 발생시켜 실제 워크로드와 유사한 환경을 만들 수 있거든요.

    Longhorn 설치 및 설정

    Longhorn은 Helm(헬름) 차트를 이용하면 정말 쉽게 설치할 수 있어요. 저도 처음엔 혹시나 복잡할까 봐 걱정했는데, 생각보다 너무 간단해서 놀랐어요. 🎉

    1. Helm Repository 추가:
      helm repo add longhorn https://charts.longhorn.io
      helm repo update
      
    2. Longhorn 설치: (기본 설정으로 설치했습니다)
      helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace
      
    3. Longhorn UI 접속:

      설치가 완료되면, Longhorn UI에 접속할 수 있도록 Ingress(인그레스, 외부 트래픽 진입점)나 NodePort(노드포트)를 설정해줘요. 저는 간단하게 NodePort로 열어서 접속했어요.

      kubectl -n longhorn-system get svc longhorn-frontend
      # 출력되는 NodePort를 확인하여 접속
      
    4. StorageClass 확인 및 볼륨 생성:

      Longhorn이 설치되면 기본적으로 longhorn이라는 StorageClass(스토리지클래스)가 생성돼요. 이걸 이용해서 PVC를 생성하고 Pod에 마운트하면 끝입니다.

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: longhorn-pvc
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: longhorn
        resources:
          requests:
            storage: 10Gi
      

    Longhorn 웹 UI에 접속하면 현재 클러스터의 스토리지 상태, 노드별 디스크 사용량, 볼륨 목록 등을 한눈에 확인할 수 있어요. 시각적으로 깔끔하고 직관적이라서 관리하기 정말 편하더라고요. 💡

    Longhorn 웹 UI 대시보드 화면

    Longhorn 대시보드 화면이에요. 생성된 볼륨, 노드의 스토리지 상태 등을 쉽게 확인할 수 있어요.

    Rook-Ceph 설치 및 설정

    Rook-Ceph는 Longhorn보다 설정할 부분이 많아서, 처음엔 “이게 다 뭔가…” 싶었어요. 하지만 공식 문서(Official Documentation)를 차근차근 따라가면 충분히 설치할 수 있어요. 저는 helm 대신 kubectl apply -f 방식으로 진행했습니다.

    1. Rook Operator 배포:

      먼저 Rook Operator를 배포해요. 이 오퍼레이터가 Ceph 클러스터를 관리하는 역할을 합니다.

      git clone --single-branch --branch v1.11.x https://github.com/rook/rook.git
      cd rook/deploy/examples
      kubectl create -f crds.yaml -f common.yaml -f operator.yaml
      
    2. Ceph Cluster 배포:

      Ceph 클러스터를 배포해요. 이 과정에서 어떤 디스크를 Ceph 스토리지로 사용할지 지정해줘야 해요. 저는 각 워커 노드의 NVMe SSD를 사용하도록 설정했습니다.

      kubectl create -f cluster.yaml
      

      cluster.yaml 파일에서 storage 섹션에 useAllNodes: true와 useAllDevices: true를 설정하여 모든 노드의 모든 디바이스를 사용하도록 했어요. 실제 운영 환경에서는 특정 디스크만 사용하도록 명시하는 것이 좋습니다.

    3. Ceph Block Pool 및 StorageClass 생성:

      Ceph 클러스터가 안정화되면, 블록 스토리지를 위한 CephBlockPool(세프 블록 풀)과 StorageClass를 생성해요.

      kubectl create -f csi/rbd/storageclass.yaml
      

      storageclass.yaml 파일은 다음과 비슷하게 생겼을 겁니다.

      apiVersion: ceph.rook.io/v1
      kind: CephBlockPool
      metadata:
        name: replicapool
        namespace: rook-ceph
      spec:
        failureDomain: host
        replicated:
          size: 3 # 데이터 복제본 수
      ---
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: rook-ceph-block
      provisioner: rook-ceph.rbd.csi.ceph.com
      parameters:
        clusterID: rook-ceph
        pool: replicapool
        imageFormat: "2"
        imageFeatures: "layering"
        csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
        csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
        csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
        csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
      reclaimPolicy: Delete
      allowVolumeExpansion: true
      mountOptions:
        - discard
      
    4. PVC 생성:

      Longhorn과 마찬가지로, 생성된 rook-ceph-block StorageClass를 이용해 PVC를 생성해요.

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: rook-ceph-pvc
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: rook-ceph-block
        resources:
          requests:
            storage: 10Gi
      
    Rook-Ceph on Kubernetes 클러스터 구성도

    Rook-Ceph 클러스터의 내부 구성도예요. Ceph의 여러 구성요소(MON, OSD, MGR)가 Pod 형태로 Kubernetes 클러스터 위에서 동작하는 것을 볼 수 있어요.

    FIO 벤치마크 실행 및 결과 분석

    두 스토리지 솔루션의 PVC를 각각 생성한 후, FIO를 실행할 Pod를 띄워 벤치마크를 진행했어요. 저는 주로 랜덤 읽기/쓰기(Random Read/Write)와 순차 읽기/쓰기(Sequential Read/Write) 성능을 중점적으로 살펴봤습니다. 블록 크기(Block Size)는 4KB와 1MB로 다양하게 테스트해봤거든요.

    FIO Pod를 위한 YAML 예시예요. 이 Pod가 PVC를 마운트하여 FIO 테스트를 수행합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: fio-test-pod
    spec:
      restartPolicy: Never
      containers:
      - name: fio-container
        image: ghcr.io/fio/fio:latest # FIO 이미지를 사용합니다.
        command: ["/bin/bash", "-c"]
        args:
          - |
            mkdir -p /mnt/data
            fio --name=random-write --ioengine=libaio --iodepth=64 --rw=randwrite --bs=4k --size=1G --numjobs=1 --runtime=60 --group_reporting --filename=/mnt/data/testfile
            fio --name=random-read --ioengine=libaio --iodepth=64 --rw=randread --bs=4k --size=1G --numjobs=1 --runtime=60 --group_reporting --filename=/mnt/data/testfile
            fio --name=sequential-write --ioengine=libaio --iodepth=16 --rw=write --bs=1M --size=2G --numjobs=1 --runtime=60 --group_reporting --filename=/mnt/data/testfile_seq
            fio --name=sequential-read --ioengine=libaio --iodepth=16 --rw=read --bs=1M --size=2G --numjobs=1 --runtime=60 --group_reporting --filename=/mnt/data/testfile_seq
        volumeMounts:
        - name: test-volume
          mountPath: /mnt/data
      volumes:
      - name: test-volume
        persistentVolumeClaim:
          claimName: longhorn-pvc # 또는 rook-ceph-pvc
    

    여러 번의 테스트를 통해 제가 관찰한 결과는 대략 이랬어요. (⚠️ 이 수치는 제 특정 홈랩 환경에서 얻은 결과이며, 환경에 따라 크게 달라질 수 있음을 다시 한번 강조합니다!)

    테스트 항목 (4KB BS) Longhorn (평균) Rook-Ceph (평균) 비고
    랜덤 쓰기 IOPS 약 1,500 ~ 2,500 약 3,000 ~ 5,000 Rook-Ceph가 우위
    랜덤 쓰기 대역폭 (MB/s) 약 6 ~ 10 약 12 ~ 20 Rook-Ceph가 우위
    랜덤 읽기 IOPS 약 2,000 ~ 3,500 약 4,000 ~ 6,500 Rook-Ceph가 우위
    랜덤 읽기 대역폭 (MB/s) 약 8 ~ 14 약 16 ~ 26 Rook-Ceph가 우위
    테스트 항목 (1MB BS) Longhorn (평균) Rook-Ceph (평균) 비고
    순차 쓰기 대역폭 (MB/s) 약 80 ~ 120 약 150 ~ 250 Rook-Ceph가 우위
    순차 읽기 대역폭 (MB/s) 약 100 ~ 150 약 200 ~ 300 Rook-Ceph가 우위

    결과를 보면, 제 홈랩 환경에서는 Rook-Ceph가 전반적으로 Longhorn보다 더 높은 IOPS와 대역폭 성능을 보여줬어요. 특히 작은 블록 크기의 랜덤 I/O에서 Ceph의 강점이 두드러지더라고요. Longhorn은 복제본(replica) 수가 늘어날수록 성능 하락이 좀 더 눈에 띄는 경향이 있었고, Ceph는 안정적으로 성능을 유지했습니다.

    Longhorn과 Rook-Ceph FIO 벤치마크 결과 비교 그래프

    Longhorn과 Rook-Ceph의 FIO 벤치마크 결과를 시각적으로 비교한 그래프예요. Rook-Ceph가 전반적으로 높은 성능을 보였습니다.

    삽질 경험과 트러블슈팅 ⚠️

    솔직히 말씀드리면, 순조롭게만 진행된 건 아니었어요. 삽질 좀 했습니다 ㅎㅎ. 몇 가지 기억에 남는 경험을 공유해볼게요.

    • Longhorn: 네트워크 대역폭과 복제본 수
      처음 Longhorn을 설치하고 테스트했을 때, 생각보다 성능이 안 나와서 당황했어요. 알고 보니, Longhorn은 네트워크를 통해 볼륨 데이터를 복제(replication)하기 때문에, 노드 간 네트워크 대역폭이 정말 중요하더라고요. 제 1Gbps 네트워크 환경에서는 복제본 수를 3개로 설정했을 때 쓰기 성능이 꽤 많이 떨어지는 것을 확인했어요. 복제본 수가 늘어날수록 안정성은 높아지지만, 그만큼 네트워크 오버헤드(overhead)가 커져서 성능에 영향을 미친다는 점! 홈랩에서는 2개로 줄여서 사용하니 훨씬 나아졌습니다.
    • Rook-Ceph: OSD 인식 문제와 초기 설정
      Rook-Ceph는 초기 설정이 Longhorn보다 훨씬 복잡했어요. 특히 OSD(Object Storage Daemon)가 디스크를 제대로 인식하지 못해서 한참을 헤맸거든요. 디스크가 이미 파티셔닝(partitioning)되어 있거나, 이전에 다른 용도로 사용된 흔적이 남아있으면 Rook-Ceph가 제대로 디스크를 잡지 못하는 경우가 있더라고요. ceph-volume lvm zap --destroy /dev/sdX 같은 명령어로 디스크를 완전히 초기화해주거나, lsblk -f 명령어로 디스크의 파일 시스템(filesystem) 정보를 꼼꼼히 확인해서 해결했어요. Ceph의 CRD(Custom Resource Definition)와 설정 파일에 대한 이해가 필요하다는 것을 다시 한번 깨달았습니다.

    결론 및 선택 가이드

    제 홈랩 벤치마크 경험을 바탕으로 Longhorn과 Rook-Ceph에 대한 저의 생각을 정리해봤어요.

    솔루션 장점 단점 추천 시나리오
    Longhorn
    • 설치 및 관리가 매우 쉬움
    • 직관적인 웹 UI 제공
    • 스냅샷, 백업, 재해 복구 기능 내장
    • 가벼운 리소스 사용
    • 네트워크 대역폭에 민감 (복제본 수 증가 시)
    • Rook-Ceph 대비 낮은 최대 성능
    • 블록 스토리지에 한정
    • 홈랩, 개발/테스트 환경
    • 소규모 프로덕션 (수십 TB 이하)
    • 간편한 관리와 사용성을 중시할 때
    Rook-Ceph
    • 최고 수준의 성능 (적절한 하드웨어 시)
    • 뛰어난 확장성 (페타바이트 규모)
    • 블록, 오브젝트, 파일 스토리지 모두 지원
    • 엔터프라이즈급 안정성과 기능
    • 설치 및 설정 난이도가 높음
    • 초기 학습 곡선이 김
    • 상대적으로 많은 리소스 사용
    • 문제 발생 시 트러블슈팅 복잡
    • 대규모 프로덕션 환경
    • 고성능, 고가용성이 필수적인 경우
    • 다양한 스토리지 타입이 필요한 경우

    제 홈랩에서는 아무래도 설치 및 관리의 용이성 때문에 Longhorn에 손이 더 자주 가더라고요. 하지만 성능 자체만 놓고 본다면 Rook-Ceph가 확실히 우위를 점했어요. 결국 어떤 Kubernetes 스토리지 솔루션을 선택할지는 여러분의 환경과 요구사항에 따라 달라진다는 것이 저의 결론입니다.

    여러분도 직접 설치해보시고, 여러분의 워크로드에 맞는 벤치마크를 수행해보시면 좋은 인사이트를 얻으실 수 있을 거예요. 저의 삽질 경험이 여러분의 시행착오를 조금이나마 줄여줄 수 있다면 좋겠습니다! 😊

    다음 글에서는 Kubernetes에서 Grafana(그라파나)와 Prometheus(프로메테우스)를 이용해 스토리지 성능을 모니터링하는 방법에 대해 다뤄볼 예정이에요. 기대해주세요!

    Longhorn과 Rook-Ceph 중 어떤 솔루션이 당신에게 맞을지 요약한 인포그래픽입니다.

  • [Proxmox] Ceph 스토리지 성능 벤치마크: HDD vs SSD, 홈랩에서 직접 해보니

    [Proxmox] Ceph 스토리지 성능 벤치마크: HDD vs SSD, 홈랩에서 직접 해보니

    [Proxmox] Ceph 스토리지 성능 벤치마크: HDD vs SSD, 홈랩에서 직접 해보니

    안녕하세요, 13년차 서버실 지킴이입니다. 오늘은 제가 홈랩에서 직접 겪고 실험해 본 Proxmox Ceph 스토리지 성능 벤치마크 이야기를 풀어볼까 합니다. 특히 많은 분이 궁금해하시는 HDD와 SSD OSD의 성능 차이에 대해 집중적으로 다뤄볼 거예요.

    분산 스토리지(Distributed Storage)하면 역시 Ceph가 떠오르죠? 고가용성(High Availability)과 확장성(Scalability) 덕분에 엔터프라이즈 환경은 물론, 저처럼 홈랩을 운영하는 인프라 엔지니어들에게도 매력적인 솔루션입니다. 그런데 Ceph를 막상 구축하고 나면 이런 고민에 빠지게 됩니다. ‘과연 어떤 디스크를 써야 최적의 성능을 낼 수 있을까?’ 특히 가상 머신(VM)이나 데이터베이스(DB)처럼 랜덤 I/O가 많은 워크로드에서는 스토리지 성능이 정말 중요하거든요.

    그래서 제가 직접 Proxmox Ceph 환경에서 HDD와 SSD OSD의 성능을 비교 벤치마크 해봤습니다. 여러분의 Ceph 스토리지 구축에 도움이 되셨으면 좋겠네요! 💡

    Proxmox Ceph 클러스터 아키텍처 다이어그램: 3개 노드와 Ceph OSD 구성

    Proxmox Ceph 클러스터 아키텍처 다이어그램: 3개의 Proxmox 노드가 Ceph OSD를 구성하고 VM에 스토리지를 제공하는 모습입니다.

    Ceph 스토리지, 그리고 OSD의 역할

    먼저, Ceph와 OSD(Object Storage Daemon)가 무엇인지 간단하게 짚고 넘어갈게요. Proxmox VE (Virtual Environment)는 오픈소스 가상화 플랫폼이고, 이 Proxmox 환경 위에서 Ceph는 강력한 분산 스토리지 시스템으로 동작합니다. Ceph의 핵심은 바로 OSD인데요, 쉽게 말해 Ceph 클러스터의 ‘일꾼’이라고 보시면 됩니다. 실제 데이터를 저장하고 관리하는 디스크 하나하나가 OSD가 되는 거죠. OSD 하나의 성능이 전체 클러스터의 성능을 결정합니다.

    특히 Ceph의 최신 스토리지 엔진인 BlueStore를 사용하면, 데이터와 별도로 메타데이터(Metadata)와 쓰기-선행 로그(Write-Ahead Log, WAL), RocksDB 같은 내부 DB를 관리하는데요. 이들을 고성능 디스크로 분리해주면 OSD 성능이 크게 올라갑니다. 이번 벤치마크에서는 OSD 전체를 HDD 또는 SSD로 구성해서 비교해봤습니다.

    홈랩 Ceph 클러스터 실전 구현

    제 홈랩 환경은 Proxmox 노드 3개로 구성되어 있습니다. 이 3개의 노드에 각각 Ceph OSD를 하나씩 생성해서 클러스터를 구성했어요. Proxmox VE의 웹 UI(User Interface)는 Ceph 설치와 OSD 생성을 정말 쉽고 직관적으로 할 수 있게 해줍니다. 처음엔 이게 뭔가 싶었는데, 클릭 몇 번으로 클러스터 구성이 끝나더라고요. 정말 편합니다!

    1. Ceph OSD 생성

    • HDD OSD 구성: 각 노드에 장착된 일반 3.5인치 HDD를 Ceph OSD로 추가했습니다.
    • SSD OSD 구성: 그리고 테스트를 위해 SATA SSD를 각 노드에 추가하여 Ceph OSD로 구성했습니다. BlueStore도 당연히 사용했고요.

    OSD가 제대로 생성되었는지 확인하는 명령어는 다음과 같습니다.

    
    ceph status
    ceph osd tree
    

    Proxmox VE 웹 UI에서 Ceph OSD를 생성하는 화면입니다. 디스크 선택, BlueStore 엔진 사용 여부 등을 설정할 수 있습니다.

    2. 벤치마크 VM 준비

    성능 벤치마크는 FIO (Flexible I/O Tester) 도구를 썼습니다. FIO는 다양한 I/O 패턴(Random Read/Write, Sequential Read/Write 등)과 블록 사이즈(Block Size), 큐 깊이(Queue Depth)를 조절하여 실제 워크로드와 유사한 환경을 만들 수 있어서 아주 유용하거든요. Proxmox에서 VM을 하나 만들고, Ceph RBD(RADOS Block Device) 스토리지를 붙여준 다음 그 VM 안에서 FIO를 실행했어요.

    간단한 FIO 명령어 예시입니다.

    
    fio --name=randwrite --ioengine=libaio --iodepth=64 --rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=1 --runtime=60 --group_reporting
    

    ⚠️ 삽질 경험담: 주의사항 및 트러블슈팅

    이런 벤치마크를 진행하다 보면 꼭 삽질을 하게 되죠. 저도 예외는 아니었습니다. ㅎㅎ

    • 네트워크 대역폭의 중요성: Ceph는 분산 스토리지 시스템인 만큼, 노드 간 통신이 매우 중요합니다. 처음엔 1GbE(기가비트 이더넷)로 테스트했는데, 아무리 SSD OSD를 써도 성능이 기대 이하였습니다. Ceph 성능의 병목(Bottleneck)이 바로 네트워크였던 거죠. 결국 10GbE 환경으로 바꾸고 나서야 제대로 된 성능을 뽑아낼 수 있었습니다. 혹시 Ceph 성능이 안 나온다면, 제일 먼저 네트워크 대역폭을 의심해보세요!

    • 디스크 속도 편차: Ceph 클러스터는 가장 느린 OSD의 속도에 맞춰지는 경향이 있습니다. 모든 OSD 디스크의 성능이 균일해야 클러스터 전체의 성능을 최대로 끌어올릴 수 있습니다. 이 점도 꼭 기억해주세요.

    • FIO 설정의 중요성: FIO 옵션을 어떻게 주느냐에 따라 결과가 천차만별입니다. 실제 사용하려는 워크로드가 랜덤 I/O인지 순차(Sequential) I/O인지, 블록 사이즈는 어떤지, 큐 깊이는 어느 정도인지 등을 잘 고려해서 설정해야 의미 있는 벤치마크 결과를 얻을 수 있습니다. 무작정 높은 수치만 쫓기보다는, ‘우리 환경에 맞는’ 벤치마크를 하는 게 중요하거든요.

    Ceph 스토리지 성능 벤치마크 결과: HDD vs SSD

    자, 이제 가장 궁금해하실 벤치마크 결과입니다. 제가 설정한 FIO 시나리오(블록 사이즈 4k, 큐 깊이 64)에서 HDD OSD와 SSD OSD의 IOPS (Input/Output Operations Per Second), Throughput (처리량), Latency (지연 시간)를 측정했습니다.

    HDD OSD 성능 결과

    • 랜덤 읽기/쓰기 IOPS: 500 ~ 1,000 IOPS 수준
    • 순차 읽기/쓰기 Throughput: 80 ~ 150 MB/s 수준
    • 평균 Latency: 10 ~ 30 ms (밀리초)

    역시 HDD는 랜덤 I/O 성능이 많이 떨어지는 것을 볼 수 있습니다. 순차 I/O는 그나마 괜찮은 편이지만, 현대적인 가상화 환경에서는 부족함이 많죠.

    SSD OSD 성능 결과

    • 랜덤 읽기/쓰기 IOPS: 10,000 ~ 20,000 IOPS 수준 (HDD 대비 10배 이상!)
    • 순차 읽기/쓰기 Throughput: 400 ~ 500 MB/s 수준
    • 평균 Latency: 0.5 ~ 1 ms (밀리초)

    결과는 압도적이었습니다. 특히 랜덤 I/O 성능에서는 HDD와 비교할 수 없는 수준을 보여줬습니다. Latency 또한 매우 낮아서, 가상 머신이나 데이터베이스처럼 지연 시간에 민감한 워크로드에 SSD OSD가 얼마나 중요한지 다시 한번 깨달았네요.

    Proxmox Ceph 스토리지 HDD vs SSD 성능 벤치마크 결과 그래프 (IOPS, Throughput, Latency 비교)

    FIO 벤치마크를 통해 얻은 HDD OSD와 SSD OSD의 IOPS, Throughput, Latency 비교 그래프입니다.

    지표 HDD OSD (대략적) SSD OSD (대략적) 비고
    랜덤 I/O IOPS 500 ~ 1,000 10,000 ~ 20,000 SSD가 약 10~20배 우위
    순차 I/O Throughput 80 ~ 150 MB/s 400 ~ 500 MB/s SSD가 약 3~5배 우위
    평균 Latency 10 ~ 30 ms 0.5 ~ 1 ms SSD가 훨씬 낮은 지연 시간

    마무리하며: Ceph 스토리지, 현명한 선택을 위한 가이드

    이번 벤치마크로 HDD와 SSD의 성능 차이가 정말 큰 걸 다시 한번 느꼈습니다. 특히 가상화 환경에서 VM을 운영하거나, 데이터베이스, 웹 서비스 등 랜덤 I/O가 많고 지연 시간에 민감한 서비스에는 SSD OSD가 필수라는 결론을 내릴 수 있어요.

    물론 HDD OSD도 장점이 있습니다. 단위 용량당 가격이 저렴해서 대용량 아카이빙(Archiving) 스토리지, 백업(Backup) 스토리지, 또는 순차 I/O 위주의 워크로드에는 여전히 좋은 선택이 될 수 있거든요. 하지만 고성능을 요구하는 메인 스토리지로는 이제 SSD를 대체하기 어렵습니다. 예산과 서비스의 목적에 맞춰서 현명하게 디스크를 선택하는 것이 중요하겠죠.

    저도 이번 벤치마크를 진행하면서 많은 걸 배웠습니다. 특히 네트워크의 중요성이나 FIO 설정의 디테일까지 다시 한번 되새기게 되었네요. 다음번에는 NVMe SSD로 OSD를 구성해서 성능이 얼마나 나올지, 그리고 WAL/DB를 분리했을 때의 효과는 어떨지 한번 파헤쳐 볼까 합니다. 기대해주세요! 🎉

    Ceph 스토리지 HDD vs SSD OSD 장단점 및 활용 시나리오 요약 인포그래픽

    Ceph 스토리지에서 HDD와 SSD OSD의 장단점 및 각각의 활용 시나리오를 요약한 인포그래픽입니다.