13년차의 서버실

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

[태그:] Proxmox ZFS

  • [Proxmox] Proxmox ZFS, 왜 선택해야 할까? 성능·안정성·운영 분석

    [Proxmox] Proxmox ZFS, 왜 선택해야 할까? 성능·안정성·운영 분석

    Proxmox ZFS, 왜 선택해야 할까? 성능, 안정성, 운영 관점 분석

    Proxmox ZFS를 처음 검토할 때는 보통 CPU나 메모리보다 스토리지에서 먼저 막히더라고요. VM은 뜨는데 백업이 길어지고, 디스크 한 장이 수상해 보여도 어디부터 봐야 할지 감이 안 잡히는 식입니다. 저도 처음엔 “여기까지 꼭 ZFS로 가야 하나?” 싶었는데, 오래 써보니 핵심은 최고 속도보다 문제가 생겼을 때 상태를 읽기 쉬운 구조를 만든다는 점이었습니다.

    그래서 이 글은 “ZFS가 좋다더라” 수준에서 끝내지 않겠습니다. ZFS 성능이 어떤 워크로드에서 살아나는지, ZFS 안정성이 왜 높게 평가되는지, 그리고 Proxmox 스토리지를 설계할 때 초기에 뭘 잘못 고르면 나중에 오래 고생하는지까지 실무 기준으로 정리해보겠습니다. 결론부터 말하면 이 조합은 만능은 아니지만, 설계를 제대로 하면 꽤 오래 편합니다.

    Proxmox ZFS 기반 홈랩 스토리지 아키텍처 개요

    Proxmox 호스트, ZFS 풀(pool), VM 디스크, 백업 스토리지가 한눈에 보이는 구조도입니다.

    왜 Proxmox ZFS를 많이 선택할까요

    제가 Proxmox에서 ZFS를 높게 보는 이유는 기능 수보다 운영 일관성 때문입니다. VM 디스크가 어느 풀에 있고, 스냅샷이 어디 계층에서 관리되고, 장애가 났을 때 어떤 명령으로 상태를 확인해야 하는지가 한 체계 안에 들어옵니다. RAID 컨트롤러, 파일시스템, 논리 볼륨을 따로따로 추적할 때보다 훨씬 덜 산만하죠.

    특히 Proxmox 같은 가상화 환경에서는 아래 세 가지가 크게 작용합니다.

    • 스냅샷과 복제 흐름이 자연스럽습니다. 작업 전 스냅샷, 테스트 후 롤백, 다른 노드로 복제까지 같은 철학으로 움직입니다.
    • 풀 상태를 읽기 쉽습니다. 디스크가 느린지, 깨졌는지, 일부만 이상한지 판단 포인트가 zpool status와 zpool iostat에 비교적 잘 드러납니다.
    • 설계 실수가 초기에 드러납니다. 이건 불편해 보여도 사실 장점입니다. ZFS는 “대충 붙여도 되겠지”를 잘 용서하지 않거든요.

    반대로 ZFS가 덜 맞는 환경도 분명합니다. 메모리 여유가 거의 없고, 디스크를 즉흥적으로 하나씩 늘려야 하고, 운영 점검을 거의 하지 않는 환경이라면 단순한 LVM 계열이 더 편할 때도 있습니다. 그래서 저는 Proxmox ZFS를 성능 기능이 아니라 운영 모델의 선택으로 보는 편입니다.

    Proxmox ZFS를 이해할 때 먼저 봐야 할 구조

    용어 정의보다 중요한 건 어느 계층이 성능과 장애 허용을 좌우하느냐입니다.

    1. pool(풀)은 관리 단위입니다

    여러 디스크 묶음 전체를 가리키는 가장 큰 저장소입니다. Proxmox에서는 여기 위에 VM 디스크, 컨테이너 루트 디스크, 스냅샷이 올라갑니다. 운영자가 보는 용량, 상태, scrub 대상도 이 계층입니다.

    2. vdev는 성격을 결정합니다

    실제로 성능과 복구 가능성은 pool보다 vdev 구조가 더 크게 좌우됩니다. mirror인지 RAIDZ1인지 RAIDZ2인지에 따라 랜덤 I/O 성격이 달라지고, 디스크 고장 시 복구 여유도 달라집니다. 같은 풀 이름이라도 내부 vdev 구성이 다르면 체감이 완전히 달라집니다.

    3. dataset과 zvol은 용도가 다릅니다

    파일 단위 관리에는 dataset이, 블록 디바이스처럼 쓰는 VM 디스크에는 zvol이 더 직접적입니다. Proxmox의 로컬 ZFS 스토리지는 VM 이미지와 컨테이너 데이터를 ZFS 계층에서 관리하며, VM 디스크는 보통 블록 볼륨 성격으로 다뤄집니다. 여기서 중요한 건 VM은 작은 랜덤 I/O가 많다는 점입니다. 그래서 파일 아카이브에 유리한 구성과 VM에 유리한 구성이 갈립니다.

    4. scrub는 “점검”이지 “백업”이 아닙니다

    scrub는 풀 데이터를 읽으면서 체크섬을 검증하고, 중복 데이터가 있는 구성에서는 손상 블록 복구에 도움을 줍니다. 이 기능이 강한 이유는 “데이터가 있다”와 “데이터가 멀쩡하다”를 구분해주기 때문입니다. 운영해보면 이 차이가 생각보다 큽니다.

    제가 실무에서 특히 중요하게 보는 포인트는 이겁니다. ZFS는 데이터를 저장하는 시스템이면서, 동시에 상태를 해석할 단서를 남기는 시스템입니다. 장애를 없애준다기보다, 장애를 더 빨리 좁혀가게 해주는 쪽에 가깝습니다.

    성능 관점에서 보면, Proxmox ZFS는 “빠르다”보다 “구조를 탄다”가 맞습니다

    ZFS 성능을 한 줄로 단정하면 거의 항상 틀립니다. 같은 SSD라도 mirror인지 RAIDZ인지, sync 쓰기가 많은지, 압축이 잘 먹는지에 따라 결과가 크게 달라집니다. 제가 체감한 기준은 단순했습니다. VM이 많이 붙는 Proxmox 스토리지는 랜덤 I/O 관점에서 봐야 한다는 점입니다.

    구성 어울리는 워크로드 강점 약점 제가 권하는 용도
    Single Disk 테스트, 임시 랩 구성 간단, 실험 빠름 장애 허용 없음, 운영 검증용으론 취약 학습용, 일회성 검증
    Mirror VM, DB, 잦은 랜덤 I/O 랜덤 읽기 IOPS에 유리, 복구 판단 쉬움, 교체 절차 단순 가용 용량 효율이 낮음 Proxmox VM 스토리지의 기본 후보
    RAIDZ1 백업 저장, 파일 공유 용량 효율이 좋음 작은 랜덤 쓰기 많은 VM엔 답답할 수 있음 VM보다 백업/아카이브 쪽
    RAIDZ2 대용량 장기보관, 안정성 우선 디스크 장애 허용 폭이 넓음 쓰기 특성이 무겁고 설계 판단을 더 보수적으로 해야 함 중요 백업 풀, 대용량 저장소

    VM 스토리지에 mirror를 자주 권하는 이유는 단순히 “더 빠르다”여서가 아닙니다. 랜덤 I/O, 장애 추적, 디스크 교체 절차, 성능 편차 예측 가능성까지 합치면 운영 총비용이 낮기 때문입니다. RAIDZ는 용량 효율은 좋지만, VM 여러 대가 동시에 작은 블록을 읽고 쓰는 환경에서는 생각보다 거칠게 느껴질 수 있습니다.

    그리고 실제로 많이 놓치는 설정이 몇 가지 있습니다.

    • ashift: 물리 섹터 특성과 맞지 않으면 쓰기 증폭과 성능 손해를 볼 수 있습니다.
    • compression=lz4: CPU 부담이 비교적 낮고 I/O를 줄여, 로그나 텍스트 비중이 있는 VM에서 체감이 좋아질 때가 많습니다.
    • atime=off: 읽을 때마다 메타데이터 쓰기를 줄여 불필요한 I/O를 덜 만듭니다.
    • autotrim=on: SSD 기반 풀이면 장기 운용 시 상태 유지에 도움이 됩니다.
    • sync 특성: 데이터베이스, NFS, 일부 애플리케이션은 동기식 쓰기 비중이 높아 체감 성능이 갑자기 달라질 수 있습니다.

    제 경험상 ZFS가 느리다고 말하는 사례 중 적지 않은 비중이, 사실은 RAIDZ를 VM 스토리지로 써서 랜덤 I/O가 막힌 경우이거나, 동기식 쓰기 워크로드를 일반 파일서버 감각으로 올린 경우였습니다. ZFS 자체보다 구조 선택이 원인인 경우가 많다는 얘기죠.

    안정성은 왜 평가가 높을까요

    ZFS 안정성이 높게 평가되는 이유는 “절대 안 깨진다”가 아니라, 깨졌을 때 조용히 넘어가지 않게 설계돼 있다는 데 있습니다. 체크섬 기반 검증, 중복 데이터에서의 복구 가능성, 풀 상태와 오류 카운트 노출이 합쳐지면서 운영자가 놓치기 쉬운 문제를 빨리 수면 위로 끌어올립니다.

    저는 이 점을 꽤 높게 봅니다. SSD 한 장이 완전히 죽는 고전적인 장애보다, 간헐적 읽기 오류, 케이블 접촉 불량, 특정 시간대만 치솟는 I/O 지연 같은 애매한 문제가 실제 운영에서는 더 귀찮더라고요. 이럴 때 VM 내부 오류만 보면 원인 추적이 길어지는데, ZFS는 적어도 스토리지 계층에서 “뭔가 이상하다”는 신호를 먼저 주는 편입니다.

    다만 여기에는 오해도 많습니다.

    • 스냅샷은 백업이 아닙니다. 같은 풀 안에 있으면 풀 자체 장애나 운영 실수에서 자유롭지 않습니다.
    • 구성이 잘못되면 보호도 없습니다. single disk 풀은 손상 감지는 해도, 복구할 다른 사본이 없으면 자동 복구를 기대하면 안 됩니다.
    • 메모리가 부족하면 운영 체감이 나빠질 수 있습니다. 안정성과는 별개로 캐시 여유가 없으면 답답하다는 느낌이 반복될 수 있습니다.

    그래서 저는 안정성을 이렇게 정의합니다. 장애를 막는 기술이라기보다, 장애를 설명하고 복구 경로를 남기는 기술입니다. 운영자 입장에서는 이 차이가 꽤 큽니다.

    Proxmox 스토리지를 실제로 구성할 때 먼저 정할 것들

    디스크를 꽂고 바로 zpool create부터 치면 나중에 되돌리기 정말 귀찮습니다. 저는 Proxmox ZFS를 만들기 전에 아래 세 가지부터 정합니다.

    1. 이 풀이 VM용인지, 백업용인지
    2. 확장을 같은 형태의 vdev 추가로 할 건지, 큰 디스크 교체 업그레이드로 갈 건지
    3. 주 저장 장치가 SSD인지 HDD인지

    이걸 먼저 정하면 mirror와 RAIDZ 판단이 훨씬 빨라집니다. 아래는 SSD 두 장을 VM용 mirror 풀로 만드는 예시입니다. 핵심은 /dev/sdX 대신 /dev/disk/by-id/를 쓰고, 필요한 속성을 생성 시점에 같이 넣는 겁니다.

    lsblk -o NAME,SIZE,TYPE,MODEL,SERIAL
    ls -l /dev/disk/by-id/ | grep -E 'ata|nvme'
    
    zpool create -f \
      -o ashift=12 \
      -o autotrim=on \
      -O compression=lz4 \
      -O atime=off \
      -O xattr=sa \
      tank mirror \
      /dev/disk/by-id/ata-Samsung_SSD_1 \
      /dev/disk/by-id/ata-Samsung_SSD_2
    
    zpool status tank
    zfs list

    왜 이렇게 하느냐고요? 이유는 단순합니다.

    • ashift=12: 4K 섹터 계열 장치에 무난하게 많이 쓰는 선택입니다.
    • autotrim=on: SSD 풀이라면 장기 운영 시 도움이 됩니다.
    • compression=lz4, atime=off: 실사용에서 무난한 기본값으로 많이 잡습니다.
    • xattr=sa: 구형 풀이나 호환성을 직접 관리하는 환경에서는 명시해두면 확인이 쉽습니다. 다만 최신 OpenZFS 계열에서는 이미 기본값인 경우도 있어요.
    • by-id 경로 사용: 재부팅이나 하드웨어 변경 후 /dev/sdX 순서 변동 리스크를 줄입니다.

    그 다음은 Proxmox에 스토리지를 등록합니다. 웹 UI로 해도 되지만, 저는 설정 확인이 편해서 CLI도 같이 봅니다.

    pvesm add zfspool tank-vm \
      -pool tank \
      -content images,rootdir \
      -sparse 1
    
    pvesm status
    cat /etc/pve/storage.cfg
    zfspool: tank-vm
        pool tank
        content images,rootdir
        sparse 1

    content images,rootdir는 VM 디스크와 컨테이너 루트 디스크를 저장하겠다는 의미고, sparse 1은 씬 프로비저닝과 연결됩니다. 저는 여기서 한 번 더 확인합니다. 이 풀이 VM용이면 images가 들어가 있는지, 백업용이면 아예 다른 저장소로 분리하는 게 맞는지를요.

    Proxmox ZFS 스토리지 설정과 미러 디스크 구성 이미지

    스토리지 등록 화면이나 디스크 두 개를 미러로 묶는 구성을 설명하는 이미지가 들어가면 이해가 빨라집니다.

    운영하면서 꼭 보는 명령어와 읽는 순서

    스토리지는 만드는 순간보다, 느려졌을 때 어디를 먼저 보느냐가 더 중요합니다. 저는 보통 아래 순서대로 봅니다.

    zpool status -v
    zpool iostat -v 1
    zfs get compression,atime,xattr,recordsize,volblocksize tank
    pvesm status
    journalctl -k -n 100 --no-pager

    명령마다 해석 포인트가 다릅니다.

    • zpool status -v: 첫 줄의 state를 봅니다. ONLINE이 아니면 성능 튜닝보다 상태 복구가 먼저입니다.
    • zpool iostat -v 1: vdev와 개별 디스크 편중을 봅니다. 특정 장치만 유독 바쁘거나 응답이 수상하면 병목 가능성이 큽니다.
    • zfs get ...: 의도한 속성이 실제로 적용됐는지 확인합니다. 생성 후 누락된 경우가 생각보다 흔합니다.
    • pvesm status: Proxmox가 해당 스토리지를 usable하게 보고 있는지 확인합니다. ZFS는 정상인데 Proxmox 등록이 꼬인 경우도 있거든요.
    • journalctl -k: 케이블, 컨트롤러, I/O 에러 같은 커널 레벨 힌트를 봅니다.

    판단 순서도 중요합니다. 저는 늘 1) ONLINE 여부, 2) 오류 증가 여부, 3) 특정 디스크 편중, 4) 워크로드 특성 순서로 봅니다. 이 순서를 지키면 “ZFS가 느린가?” 같은 뭉뚱그린 질문이 “특정 디스크가 느린가?”, “sync 쓰기 때문에 밀리는가?” 같은 실행 가능한 질문으로 바뀝니다.

    예를 들어 백업 시간대에 VM이 버벅인다면, CPU가 널널할 때 저는 먼저 zpool iostat -v 1를 켭니다. 여기서 디스크가 포화되면 원인은 거의 스토리지 계층입니다. 반대로 디스크가 한가하면 백업 방식, 네트워크, 게스트 내부 I/O 패턴을 봐야겠죠. 이거 진짜 편한 게, 잘못 의심할 대상을 빨리 지워준다는 점입니다.

    ⚠️ 제가 자주 본 주의사항과 트러블슈팅

    매뉴얼에는 적혀 있어도 운영하다 보면 왜 이게 문제인지 체감이 늦게 오는 포인트가 있습니다. 아래는 제가 특히 자주 본 실패 모드입니다.

    1. 디스크 이름만 믿고 작업하는 문제

    근본 원인은 단순합니다. Linux의 /dev/sdX 이름은 영구 식별자가 아니기 때문입니다. 리부팅, HBA 변경, 디스크 추가 후 순서가 바뀌면 같은 sdb라고 믿고 작업했다가 다른 디스크를 건드릴 수 있습니다.

    ls -l /dev/disk/by-id/ | grep -E 'ata|nvme'
    
    zpool create -f tank mirror \
      /dev/disk/by-id/ata-Samsung_SSD_xxx \
      /dev/disk/by-id/ata-Samsung_SSD_yyy

    이건 편의가 아니라 사고 방지 습관입니다. 저도 이 규칙을 안 지켰을 때 교체 작업에서 괜히 더 오래 붙잡힌 적이 있었습니다.

    2. 용량 확장을 RAID 카드 감각으로 생각하는 문제

    근본 원인은 vdev 구조를 나중에 자유롭게 바꿀 수 있을 거라는 기대입니다. ZFS는 하드웨어 RAID처럼 아무 디스크나 한 장씩 붙여 모양을 쉽게 바꾸는 방식과는 거리가 있습니다. 최근 OpenZFS에서는 RAIDZ 확장 기능이 들어왔지만, 여전히 시간도 걸리고 제약도 있어 처음 설계를 대충 해도 된다는 뜻은 아닙니다.

    제가 운영 기준으로 내리는 판단은 이렇습니다.

    상황 더 나은 선택 이유
    VM이 중심이고 반응성 중요 Mirror 랜덤 I/O 대응과 장애 처리 절차가 단순합니다
    백업 저장이 중심이고 용량 효율 중요 RAIDZ1/RAIDZ2 가용 용량 확보에 유리합니다
    앞으로 디스크를 같은 쌍으로 늘릴 수 있음 Mirror vdev 추가 확장 전략이 예측 가능합니다
    디스크 추가 계획이 불규칙하고 제각각 ZFS 신중 검토 구조 제약 때문에 중간에 답답해질 가능성이 큽니다

    3. 스냅샷을 백업처럼 쌓는 문제

    근본 원인은 스냅샷의 비용이 낮아 보여서입니다. 너무 쉽게 찍히다 보니 보존 정책 없이 쌓이기 쉽습니다. 그런데 스냅샷이 많아질수록 운영자는 “무엇을 남길지”보다 “무엇을 지워도 되는지” 판단하는 데 시간을 쓰게 됩니다.

    그래서 저는 스냅샷 규칙을 아주 단순하게 둡니다.

    • 수동 스냅샷은 작업 전후처럼 목적이 분명할 때만 만듭니다.
    • 자동 스냅샷은 보존 개수와 이름 규칙을 먼저 정합니다.
    • 장기 보존은 스냅샷이 아니라 별도 백업 저장소로 보냅니다.

    4. scrub를 안 돌려서 이상 징후를 늦게 보는 문제

    근본 원인은 당장 눈에 띄는 장애가 없으니 미루게 된다는 점입니다. 그런데 ZFS의 장점은 문제가 터진 뒤보다, 아직 큰 사고가 되기 전에 상태를 읽는 데 있습니다. scrub를 미루면 그 장점을 스스로 줄이는 셈이죠.

    zpool scrub tank
    zpool status tank

    scan: 항목에서 scrub 진행 여부와 마지막 완료 기록을 봅니다. 에러가 보이면 거기서 멈추지 말고, 디스크 SMART 정보와 커널 로그까지 같이 확인하는 게 좋습니다. 실제 원인이 ZFS보다 SSD 자체, 케이블, 전원, 컨트롤러인 경우도 꽤 많더라고요.

    5. 동기식 쓰기 워크로드를 가볍게 보는 문제

    근본 원인은 “일반 파일 복사도 괜찮았으니 서비스도 괜찮겠지”라는 추정입니다. 하지만 데이터베이스, NFS, 일부 애플리케이션은 sync 쓰기 비중이 높습니다. 이 경우 평소에는 조용하다가 특정 서비스만 유독 느려 보일 수 있습니다. 여기서 필요한 건 막연한 튜닝이 아니라, 그 서비스가 실제로 어떤 쓰기 패턴을 갖는지 확인하는 일입니다.

    Proxmox ZFS 운영 중 장애 디스크 점검과 교체 흐름

    풀 상태가 ONLINE, DEGRADED로 바뀌는 모습과 디스크 교체 절차를 설명하는 시각 자료 위치입니다.

    검증은 어떻게 해야 할까: “된다”보다 “운영 가능하다”를 확인해야 합니다

    구성을 마쳤다면 단순 마운트 확인에서 끝내지 않는 게 좋습니다. 저는 최소한 아래 순서로 검증합니다.

    1. Proxmox가 스토리지를 정상 인식하는지 확인합니다.
    2. 테스트 VM 하나를 만들어 해당 ZFS 풀에 디스크를 올립니다.
    3. 스냅샷 생성과 삭제가 정상 동작하는지 봅니다.
    4. 백업 작업 중 체감 성능이 무너지는지 확인합니다.
    5. zpool status와 zpool iostat로 상태와 편중을 읽습니다.
    qm create 9000 --name zfs-test --memory 2048 --net0 virtio,bridge=vmbr0
    qm set 9000 --scsi0 tank-vm:32
    qm start 9000
    qm snapshot 9000 baseline
    qm listsnapshot 9000
    vzdump 9000 --mode snapshot --storage <backup-storage-name>

    이 단계에서 제가 보는 기준은 속도 숫자보다 일관성입니다.

    • 스냅샷 생성이 안정적으로 되는지: 한 번 되고 한 번 실패하면 저장소 등록 방식이나 설정부터 다시 봐야 합니다.
    • 백업 시 전체 VM 반응성이 무너지는지: 백업 저장소 분리, 시간대 분산, VM용 풀 구조 재검토가 필요할 수 있습니다.
    • 장애 시 상태가 읽히는지: 홈랩이라면 테스트 디스크를 오프라인 처리해 출력이 어떻게 달라지는지 보는 공부가 꽤 도움이 됩니다.

    제가 중요하게 보는 시나리오 하나를 들자면, 백업은 성공하는데 특정 시간대마다 게스트 OS가 갑자기 느려지는 경우입니다. 이때 많은 분들이 Proxmox 전체 문제로 보는데, 실제로는 백업 I/O와 VM I/O가 같은 풀에서 경쟁하는 구조 문제인 경우가 적지 않습니다. 이런 상황에선 튜닝보다 역할 분리가 더 크게 먹힙니다.

    Proxmox ZFS 검증 결과와 상태 확인 대시보드

    가상머신이 ZFS 스토리지에서 동작하고, 상태 명령어 결과가 정상인 모습을 함께 보여주는 검증 이미지입니다.

    어떤 환경에 추천하고, 어디엔 덜 맞을까

    이쯤 되면 선택 기준이 꽤 선명해집니다.

    환경 추천도 이유
    홈랩에서 VM 여러 대 운영 높음 스냅샷, 복제, 상태 확인이 운영 학습과 실사용 모두에 유리합니다
    중소규모 Proxmox 가상화 서버 높음 스토리지 상태를 읽기 쉽고 장애 대응 절차를 표준화하기 좋습니다
    백업/아카이브 저장소 중간 이상 RAIDZ 계열로 용량 효율을 챙길 여지가 있습니다
    메모리 여유가 매우 적은 장비 신중 운영 체감이 떨어질 수 있어 더 단순한 구성이 나을 수 있습니다
    디스크를 아무 규칙 없이 자주 덧붙여야 하는 환경 신중 ZFS의 구조 제약이 장점보다 먼저 불편으로 느껴질 수 있습니다

    여기서 제가 실제로 가장 많이 권하는 구성은 이렇습니다.

    • VM 중심: SSD 2개 이상 mirror 기반 ZFS
    • 백업 중심: 별도 저장소, 필요하면 RAIDZ 계열 검토
    • 역할 분리: OS용, VM용, 백업용을 가능하면 나눔

    특히 “모든 걸 한 풀에 몰아넣는” 설계는 초반엔 단순해 보여도 운영 후반에는 원인 분리가 어려워집니다. 저도 결국은 VM 스토리지와 백업 스토리지를 분리했을 때 제일 편했습니다. 느려지는 이유를 읽기 쉬워졌거든요.

    마무리: 제가 실제로 추천하는 선택 기준

    Proxmox ZFS는 모든 서버에 자동 정답인 기술은 아닙니다. 그래도 VM 중심 운영, 스냅샷 활용, 상태 가시성, 장애 대응 속도를 중요하게 본다면 상당히 강한 선택지입니다. 현업과 홈랩에서 반복해서 느낀 건, ZFS는 초반 진입장벽 대신 장기 운영 편의성을 준다는 점이었어요.

    그래서 제 권고는 분명합니다.

    • VM 위주의 홈랩이나 소규모 가상화 서버라면, 먼저 mirror 기반 Proxmox ZFS를 검토하는 쪽이 무난합니다.
    • 백업/아카이브 비중이 크고 용량 효율이 중요하다면, VM용 풀과 분리한 뒤 RAIDZ 계열을 고려하는 편이 낫습니다.
    • 메모리 여유가 거의 없고 디스크 확장 계획이 자주 바뀌는 장비라면, ZFS를 억지로 넣기보다 더 단순한 스토리지 구성이 운영 비용이 낮습니다.

    한 문장으로 요약하면 이렇습니다. 성능 수치만 보면 판단이 흔들릴 수 있지만, 운영 피로도까지 넣어 보면 Proxmox ZFS의 장점은 꽤 선명합니다. 특히 “장애가 났을 때 내가 빨리 읽고 대응할 수 있는가”를 중요한 기준으로 두신다면, 이 조합은 생각보다 만족도가 오래 갑니다.

    Proxmox 스토리지 비교나 백업 분리 전략도 같이 보시면 판단이 더 쉬워집니다. 다음 글에서는 mirror와 RAIDZ를 실제 운영비 관점에서 더 세밀하게 비교해보겠습니다.

    어떤 환경에 ZFS가 잘 맞는지, 미러와 RAIDZ 중 무엇을 고를지 한눈에 정리하는 요약 이미지입니다.

    FAQ: 실무에서 자주 묻는 포인트

    Proxmox에서 ZFS면 무조건 빠른가요?

    아닙니다. 풀 구조, 디스크 종류, 워크로드 특성이 더 중요합니다. 특히 VM처럼 작은 랜덤 I/O가 많으면 mirror가 더 유리한 경우가 많습니다.

    스냅샷만 있으면 백업은 필요 없나요?

    아니요. 스냅샷은 같은 스토리지 안의 시점 보존이고, 백업은 별도 위치에 독립적으로 남겨두는 개념입니다. 둘은 대체 관계가 아닙니다.

    처음 시작한다면 가장 무난한 구성은 뭔가요?

    테스트와 실사용을 같이 염두에 둔다면, SSD 2개를 mirror로 묶은 ZFS 풀이 가장 이해하기 쉽고 운영 실수도 적습니다. 여기서 감을 잡고 역할 분리를 넓혀가는 편이 실패가 적더라고요.

    RAIDZ를 VM 스토리지로 쓰면 안 되나요?

    못 쓰는 건 아닙니다. 다만 VM 여러 대가 작은 블록을 자주 읽고 쓰는 환경에서는 기대한 체감이 안 나올 수 있습니다. 용량 효율보다 반응성이 중요하면 mirror 쪽이 대체로 덜 후회됩니다.

    문제가 생기면 제일 먼저 뭘 봐야 하나요?

    저는 zpool status -v로 상태를 먼저 보고, 그다음 zpool iostat -v 1로 병목과 편중을 확인합니다. 그 후에야 Proxmox 설정과 게스트 내부 문제를 의심합니다.

  • [Proxmox] ZFS 스토리지 1년 운영 회고: 성능, 안정성, 그리고 후회되는 점

    [Proxmox] ZFS 스토리지 1년 운영 회고: 성능, 안정성, 그리고 후회되는 점

    [Proxmox] ZFS 스토리지 1년 운영 회고: 성능, 안정성, 그리고 후회되는 점

    안녕하세요, 13년차 서버실 주인장입니다. 오늘은 제가 홈랩에서 Proxmox VE (Virtual Environment)와 ZFS를 조합한 스토리지 시스템을 1년간 운영해본 솔직한 경험담을 풀어볼게요. 많은 분들이 홈랩 서버를 구축하거나 작은 규모의 프로덕션 환경에서 가상화를 고민할 때, 스토리지 구성이 가장 큰 고민이 되더라고요. 저 역시 그랬거든요. 특히 데이터의 안정성과 성능이라는 두 마리 토끼를 잡으려다 보면, Proxmox ZFS 스토리지 조합이 매력적인 선택지로 다가오기 마련입니다.

    13년차 인프라 엔지니어로서 직접 경험한 Proxmox ZFS 스토리지의 성능, 안정성, 그리고 솔직히 ‘아, 이건 좀 후회된다’ 싶었던 점들까지 가감 없이 공유해드리겠습니다. 제 삽질 경험이 여러분의 시행착오를 줄이는 데 조금이나마 도움이 되었으면 좋겠어요. 💡


    왜 Proxmox ZFS를 선택했을까?

    제가 Proxmox ZFS 스토리지 조합을 선택한 이유는 명확했어요. 바로 데이터 무결성(Data Integrity)과 유연한 스토리지 관리 기능 때문이었죠. ZFS는 단순한 파일 시스템을 넘어, 자체적으로 볼륨 관리 기능과 RAID 기능을 포함하고 있습니다. 특히 다음과 같은 점들이 저를 매료시켰어요.

    • Copy-on-Write (CoW): 데이터를 덮어쓰지 않고 새로운 블록에 저장하기 때문에, 데이터 손상 위험이 현저히 줄어들더라고요.
    • 스냅샷(Snapshots): 특정 시점의 파일 시스템 상태를 저장할 수 있어서, VM이나 컨테이너 백업 및 롤백이 정말 편리합니다. Proxmox와의 연동은 정말 환상적이었죠.
    • 데이터 스크러빙(Data Scrubbing): 주기적으로 데이터의 무결성을 검사하고 손상된 데이터를 자동으로 복구합니다. 이 덕분에 몇 번 안심했네요.
    • RAID-Z: 소프트웨어 RAID 기능으로, 하드웨어 RAID 컨트롤러 없이도 안정적인 다중 디스크 구성을 할 수 있어요.

    Proxmox는 이런 ZFS의 강력한 기능을 웹 UI에서 손쉽게 관리할 수 있도록 통합해놨어요. 처음엔 CLI(Command Line Interface)로만 ZFS를 다루다가, Proxmox의 간편함에 감탄했었죠.


    저의 Proxmox ZFS 스토리지 구성

    제 홈랩 서버는 인텔 i5-8500 CPU에 32GB RAM을 사용하고 있어요. 스토리지 구성은 다음과 같았습니다.

    1. 데이터 풀 (Data Pool): 4TB HDD 4개로 RAIDZ1 풀 구성
    2. L2ARC (Level 2 Adaptive Replacement Cache): 250GB SATA SSD 1개
    3. SLOG (Separate Log Device): 처음에는 없었으나, 나중에 128GB NVMe SSD 추가

    처음엔 RAIDZ1으로도 충분하다고 생각했어요. 디스크 하나가 죽어도 데이터 손실 없이 버틸 수 있으니까요. L2ARC는 저렴한 SATA SSD로 시작해서 캐싱 효과를 보려고 했고, SLOG는 VM의 쓰기 성능에 큰 영향을 준다고 해서 나중에 추가해봤습니다. 이 구성으로 1년 동안 다양한 VM (Ubuntu, Windows Server), 컨테이너 (Docker, LXC), 그리고 여러 서비스들을 운영했어요.

    제 Proxmox ZFS 홈랩 스토리지 구성 다이어그램입니다. HDD로 데이터 풀을 구성하고, SSD를 L2ARC와 SLOG로 활용했어요.


    1년 운영 후 성능 분석

    실제로 1년간 Proxmox ZFS 스토리지를 사용해보니, 예상보다 훨씬 만족스러운 부분도 있었고, 아쉬운 부분도 명확했습니다.

    ARC (Adaptive Replacement Cache) 효과

    ZFS는 시스템 RAM을 캐시로 정말 활용하는 ARC (Adaptive Replacement Cache) 덕분에 자주 접근하는 데이터는 정말 빠르게 읽을 수 있더라고요. 32GB RAM 중 상당 부분을 ARC가 사용했는데, 웹서버나 DB 서버처럼 특정 데이터를 반복적으로 요청하는 VM에서는 HDD임에도 불구하고 SSD에 버금가는 읽기 성능을 보여주더라고요. ARC hit ratio가 90% 이상을 유지할 때는 정말 쾌적했습니다. 🎉

    L2ARC (Level 2 ARC)의 활용

    RAM이 아무리 많아도 모든 데이터를 캐시할 수 없죠. 그래서 저렴한 SATA SSD를 L2ARC (Level 2 ARC)로 추가해봤는데, 생각보다 효과가 좋더라고요. 주로 사용되는 VM이나 컨테이너의 데이터가 L2ARC에 캐시되면서, 초기 로딩 시간이나 간헐적인 I/O 성능이 눈에 띄게 개선되는 걸 체감했습니다. 물론 NVMe SSD만큼은 아니지만, 비용 대비 성능 향상은 정말 분명했어요.

    SLOG (Separate Log Device)의 중요성

    가장 큰 성능 향상을 가져온 건 바로 SLOG (Separate Log Device)였습니다. 처음에는 SLOG 없이 운영했는데, VM의 동기 쓰기(Synchronous Write) 작업이 많아지자 I/O 대기 시간이 길어지는 문제가 발생하더라고요. 특히 데이터베이스나 로그를 많이 쓰는 서비스에서 체감 성능 저하가 심했습니다. 나중에 NVMe SSD를 SLOG로 추가하고 나니, 쓰기 성능이 정말 비약적으로 향상되었어요. VM I/O가 많은 경우에는 SLOG용 NVMe SSD는 거의 필수라고 생각합니다. 신세계를 경험했네요! ✨

    결론적으로, 일반적인 웹서버, 개발 환경 VM, 파일 서버 등을 돌리는 데는 Proxmox ZFS 스토리지가 충분한 성능을 제공했어요. 물론 고성능 NVMe RAID 풀에 비할 바는 아니지만, 홈랩 환경에서는 정말 차고 넘치는 수준이었죠.

    Proxmox 웹 UI ZFS 스토리지 대시보드 및 성능 모니터링 화면

    Proxmox 웹 UI에서 ZFS 스토리지의 상태와 성능을 모니터링하는 화면입니다. ARC Hit Ratio와 I/O 대역폭을 확인할 수 있어요.


    예상치 못한 안정성 경험 (그리고 삽질)

    ZFS의 가장 큰 장점 중 하나는 바로 데이터 무결성(Data Integrity)이잖아요? 실제로 1년간 운영하면서 이 부분에서 몇 번 감탄했어요.

    주기적인 Pool Scrub의 위력

    저는 한 달에 한 번씩 zpool scrub 명령어를 통해 풀 스크럽(Pool Scrub)을 돌렸습니다. 이게 정말 중요하더라고요. 한번은 스크럽 중 미세한 데이터 불일치를 감지하고 자동으로 복구하는 걸 로그를 통해 확인했어요. 만약 ZFS가 아니었다면 알지도 못하고 지나갈 뻔한 문제였죠. ⚠️

    디스크 장애와 RAIDZ1의 복구 경험

    불행인지 다행인지, 1년 사이에 4개 중 하나의 HDD가 고장 났어요. S.M.A.R.T. 경고가 뜨고, zpool status 명령어로 확인해보니 DEGRADED 상태가 되었더군요. 하지만 RAIDZ1으로 구성했기에 디스크 하나가 죽어도 데이터는 안전하게 보호되었습니다. 데이터를 잃을 걱정 없이 새 디스크를 주문할 수 있었죠.

    새 디스크가 도착하고 교체하는 과정에서 제가 삽질 좀 했습니다. 🤦‍♂️ 핫스왑(Hot-swap)이 되는 케이스가 아니라서 서버를 끄고 디스크를 교체했는데, 그 과정에서 명령어 사용이 미숙해서 잠시 헤맸어요. 정확한 zpool replace 명령어를 아는 게 정말 중요하더라고요.

    # 1. zpool status 명령어로 죽은 디스크의 경로 확인
    # 예: /dev/sdb
    root@proxmox:~# zpool status storage_pool
    
    # 2. 새 디스크를 서버에 장착 (예: /dev/sdc)
    
    # 3. 죽은 디스크를 새 디스크로 교체 시작
    root@proxmox:~# zpool replace storage_pool /dev/sdb /dev/sdc
    
    # 4. 교체 진행 상황 확인
    root@proxmox:~# zpool status storage_pool
    # reslivering이 완료되면 'ONLINE' 상태로 돌아옵니다.
    

    교체 후 리실버링(Resilvering)이 완료되고 풀이 다시 ONLINE 상태가 되었을 때의 안도감이란… 드디어 됐다! ✅ ZFS는 똑똑하지만, 관리자의 정확한 명령이 필수라는 걸 다시 한번 느꼈어요.


    후회되는 점과 개선 방향

    솔직히 1년간 Proxmox ZFS 스토리지를 운영하면서 후회되는 점도 몇 가지 있습니다.

    1. 초기 RAIDZ1 선택의 아쉬움: 처음에 RAIDZ1으로 구성한 게 살짝 아쉬워요. 디스크 하나만 더 추가해서 4TB HDD 5개로 RAIDZ2로 갔다면, 디스크 두 개가 동시에 고장 나도 버틸 수 있어 안정성이 훨씬 높았을 텐데 말이죠. 홈랩이긴 하지만, 중요한 데이터가 많아질수록 RAIDZ2의 안정성이 더 매력적으로 느껴집니다.
    2. SLOG/L2ARC 초기 계획 미흡: SLOG와 L2ARC를 처음부터 제대로 고려하지 못한 것도 후회돼요. 저렴한 SATA SSD로 시작했지만, 나중엔 고성능 NVMe SSD의 필요성을 절실히 느꼈거든요. 초기 투자 비용을 아끼려다 나중에 더 큰 비용과 시간을 들여 업그레이드했습니다.
    3. 디스크 종류 혼용: 데이터 풀은 HDD, L2ARC는 SATA SSD, SLOG는 NVMe SSD… 성능 때문에 다양한 디스크를 섞어 썼는데, 관리 복잡도가 올라가고 벤더별 드라이버 관리나 S.M.A.R.T. 모니터링이 조금 번거로워졌어요.

    다음 번에 Proxmox ZFS 스토리지를 구성한다면, 저는 다음과 같은 방향으로 개선할 생각이에요.

    • 안정성을 최우선으로 하여 RAIDZ2 또는 미러(Mirror) 구성 고려.
    • 처음부터 고성능 NVMe SSD를 SLOG 및 L2ARC로 할당하여 최대 성능 확보.
    • 가급적 동일한 벤더의 디스크를 사용하여 관리 편의성 증대.
    Proxmox ZFS 운영 문제점과 해결책 비교표

    Proxmox ZFS 운영 시 발생할 수 있는 주요 문제점과 제가 경험했던 해결책을 비교 정리한 표입니다.


    Proxmox ZFS 스토리지 운영 팁

    1년간 운영하면서 얻은 몇 가지 꿀팁을 공유해드릴게요.

    1. RAM은 많을수록 좋습니다.
      ZFS는 정말 RAM을 좋아합니다. ARC (Adaptive Replacement Cache) 효율을 높이려면 시스템 RAM을 최대한 많이 확보하세요. 최소 16GB, 가능하다면 32GB 이상을 추천합니다.
    2. SLOG는 선택 아닌 필수?
      VM I/O가 많거나 동기 쓰기(Synchronous Write)가 중요한 서비스(예: 데이터베이스)를 운영한다면 SLOG용 NVMe SSD는 꼭 고려하세요. 체감 성능이 확 달라집니다. 특히 저가형 NVMe라도 없어서는 안 될 부분이에요.
    3. 주기적인 스크럽은 생명입니다.
      데이터 무결성을 지키려면 zpool scrub 명령어를 통해 주기적으로 풀 스크럽을 해주세요. 저는 cron으로 매월 첫째 주 일요일 새벽 3시에 돌리도록 설정했어요. 자고 일어났을 때 스크럽 완료 메시지를 보면 왠지 모르게 뿌듯하더라고요. 😊
    4. # cron 설정 예시 (매월 첫째 주 일요일 새벽 3시)
      0 3 1-7 * 0 /usr/sbin/zpool scrub storage_pool
      
    5. 백업은 언제나 중요합니다.
      아무리 ZFS가 튼튼해도 백업은 필수예요. Proxmox의 내장 백업 기능을 활용하거나, zfs send/receive를 이용해 다른 곳으로 스냅샷을 보내는 방식으로 이중 백업 체계를 갖추세요. 데이터는 언제나 소중하니까요.
    ZFS 풀 스크럽 진행 과정을 보여주는 콘솔 화면

    ZFS 풀 스크럽(scrub)이 진행되는 콘솔 화면이에요. 주기적인 스크럽은 데이터 무결성을 유지하는 데 필수적입니다.


    마무리하며

    1년간 Proxmox ZFS 스토리지를 운영해보면서 성능과 안정성 모두 만족스러웠습니다. 특히 데이터 무결성에 대한 ZFS의 강력한 보장은 인프라 엔지니어로서 큰 신뢰를 줬어요. 하지만 완벽한 시스템은 없다는 것, 그리고 초기 설계의 중요성을 다시 한번 깨달았습니다. 제 삽질 경험과 팁들이 Proxmox ZFS 스토리지 구성을 고민하고 계신 여러분께 조금이나마 도움이 되었으면 좋겠어요.

    다음 글에서는 Proxmox ZFS 스냅샷과 복제(Replication) 기능을 활용한 백업 전략에 대해 더 자세히 다뤄볼 예정입니다. 기대해주세요! 👋

  • [Proxmox] 스토리지 관리 완벽 가이드: ZFS, LVM, NFS, iSCSI 비교 및 최적화

    Proxmox 스토리지, 처음엔 저도 뭘 써야 할지 몰랐어요

    Proxmox VE를 처음 설치하고 VM(가상 머신)을 만들려는 순간, 스토리지 선택 화면에서 멈춰본 경험 있으신가요? ZFS, LVM, NFS, iSCSI… 이름만 봐도 머리가 살짝 아파오는 그 느낌. 저도 딱 그랬거든요. 처음 홈랩에 Proxmox를 올렸을 때, 그냥 기본값인 LVM으로 쭉 써왔는데 어느 날 VM 디스크가 꽉 차는 사고가 났고, 그때부터 스토리지 구조를 제대로 파고들기 시작했습니다.

    13년 넘게 인프라를 다루면서 느낀 건데, 스토리지 선택은 처음에 잘 해야 나중에 마이그레이션 삽질을 안 한다는 거예요. 이 글에서는 Proxmox 스토리지의 핵심 옵션인 ZFS, LVM, NFS, iSCSI를 실제 사용 경험을 바탕으로 비교해드리고, 각 상황에 맞는 최적화 팁까지 정리해보겠습니다.

    ▲ Proxmox VE의 스토리지 아키텍처 개요. 각 스토리지 타입이 VM/CT와 어떻게 연결되는지 한눈에 볼 수 있습니다.

    Proxmox 스토리지 기본 개념 이해하기

    본격적인 비교 전에 Proxmox 스토리지가 어떻게 동작하는지 간단히 짚고 넘어갈게요. 쉽게 말해서, Proxmox는 스토리지를 “어디에 VM 디스크 이미지를 저장할 것인가”의 관점으로 관리합니다.

    스토리지 타입 분류

    Proxmox의 스토리지는 크게 두 가지 방식으로 나뉩니다:

    • 로컬 스토리지 (Local Storage): 해당 Proxmox 노드에 직접 연결된 디스크. ZFS, LVM, Directory 등이 여기에 해당합니다
    • 공유 스토리지 (Shared Storage): 여러 Proxmox 노드가 동시에 접근 가능한 스토리지. NFS, iSCSI, Ceph 등이 여기에 해당하며, 클러스터 환경에서 라이브 마이그레이션(Live Migration)을 하려면 필수입니다

    이 차이가 왜 중요하냐면, 단일 노드 홈랩이냐 다중 노드 클러스터냐에 따라 선택지가 확 달라지거든요.

    ZFS (Z File System): 데이터 무결성의 끝판왕

    ZFS가 뭔가요?

    ZFS는 원래 Sun Microsystems에서 개발한 파일 시스템인데, 지금은 OpenZFS 프로젝트를 통해 Linux에서도 쓸 수 있어요. Proxmox는 ZFS를 네이티브로 지원하는 몇 안 되는 하이퍼바이저 중 하나고, 이게 Proxmox를 선택하는 이유 중 하나이기도 합니다.

    ZFS의 핵심 특징을 정리하면:

    • Copy-on-Write (CoW, 쓰기 시 복사): 데이터를 덮어쓰지 않고 새 위치에 씁니다. 덕분에 데이터 손상 위험이 확 줄어요
    • 스냅샷 (Snapshot): 거의 순간적으로 스냅샷을 생성할 수 있고, 공간도 효율적으로 씁니다
    • RAID-Z: 소프트웨어 RAID를 ZFS 레벨에서 처리. RAID-Z1(패리티 1), RAID-Z2(패리티 2) 등 선택 가능합니다
    • 데이터 체크섬 (Checksum): 모든 데이터 블록에 체크섬을 달아서 조용한 데이터 손상(Silent Corruption)을 감지하고 자동 복구합니다
    • ARC (Adaptive Replacement Cache): 메모리를 캐시로 적극 활용해서 읽기 성능을 높입니다

    Proxmox에서 ZFS 설정하기

    Proxmox 설치 시 ZFS를 선택하거나, 설치 후에도 추가할 수 있어요. 설치 후 추가하는 방법입니다:

    # ZFS 풀 생성 (미러 구성, 2개 디스크)
    zpool create -f rpool mirror /dev/sdb /dev/sdc
    
    # ZFS 풀 상태 확인
    zpool status
    
    # Proxmox에서 ZFS 스토리지 추가 (Web UI 대신 CLI로)
    pvesm add zfspool local-zfs --pool rpool --content images,rootdir
    # ZFS 성능 튜닝 - ARC 최대 크기 설정 (예: 8GB)
    echo 'options zfs zfs_arc_max=8589934592' > /etc/modprobe.d/zfs.conf
    update-initramfs -u
    
    # 현재 ARC 사용량 확인
    cat /proc/spl/kstat/zfs/arcstats | grep -E '^(size|c_max|hits|misses)'

    ZFS 사용 시 주의사항

    ⚠️ ZFS는 메모리를 많이 먹습니다. 일반적으로 스토리지 1TB당 1GB RAM이라는 가이드라인이 있는데, 홈랩 환경에서는 최소 8GB 이상 RAM을 권장해요. 저도 처음에 RAM 4GB짜리 서버에 ZFS 올렸다가 OOM(Out of Memory) 킬러가 작동하는 참사를 겪었습니다 ㅎㅎ.

    ⚠️ 절대로 ZFS 풀에 하드웨어 RAID 컨트롤러를 쓰지 마세요. ZFS는 디스크를 직접 제어해야 해서, HBA(Host Bus Adapter) 모드나 IT 모드의 컨트롤러를 써야 합니다. 하드웨어 RAID 위에 ZFS를 올리면 ZFS의 자가 복구 기능이 제대로 동작하지 않아요.

    LVM (Logical Volume Manager): 검증된 클래식

    LVM이 뭔가요?

    LVM(논리 볼륨 관리자)은 Linux에서 오랫동안 사용되어 온 스토리지 관리 방식이에요. 물리 디스크를 추상화해서 유연하게 관리할 수 있게 해줍니다. Proxmox 기본 설치 옵션이기도 하고요.

    LVM의 구조는 이렇습니다:

    • PV (Physical Volume, 물리 볼륨): 실제 디스크나 파티션
    • VG (Volume Group, 볼륨 그룹): PV를 묶은 논리적 풀
    • LV (Logical Volume, 논리 볼륨): VG에서 할당받은 실제 사용 공간

    Proxmox에서는 LVM-Thin(씬 프로비저닝)을 많이 쓰는데, 이게 핵심이에요. 씬 프로비저닝이란 VM에게 100GB를 할당했어도 실제로 데이터를 쓰는 만큼만 디스크를 사용하는 방식입니다. 공간 효율이 훨씬 좋더라고요.

    Proxmox에서 LVM-Thin 설정하기

    # 새 디스크를 PV로 초기화
    pvcreate /dev/sdb
    
    # VG 생성
    vgcreate vg-data /dev/sdb
    
    # LVM-Thin 풀 생성 (VG 용량의 95% 할당)
    lvcreate -l 95%FREE --thinpool thin-pool vg-data
    
    # Proxmox에 LVM-Thin 스토리지 추가
    pvesm add lvmthin local-lvm-thin --vgname vg-data --thinpool thin-pool --content images,rootdir
    
    # 상태 확인
    lvs -a --units g

    LVM vs LVM-Thin 차이

    항목 LVM (Thick) LVM-Thin
    공간 할당 즉시 전체 할당 사용한 만큼만 할당
    스냅샷 지원 (공간 소모 큼) 효율적 스냅샷 지원
    오버프로비저닝 불가 가능 (주의 필요)
    성능 안정적 약간의 오버헤드 있음
    복잡도 낮음 중간

    ⚠️ LVM-Thin에서 오버프로비저닝할 때는 실제 사용량을 꼭 모니터링해야 해요. 풀이 꽉 차면 VM들이 I/O 오류를 뱉으면서 난리가 납니다. 저도 이걸 한 번 경험하고 나서 Grafana로 LVM-Thin 사용량 알람을 걸어뒀거든요.

    ▲ Proxmox Web UI에서 LVM-Thin 스토리지 설정 화면. 씬 풀 사용량을 실시간으로 확인할 수 있습니다.

    NFS (Network File System): 공유 스토리지의 대명사

    NFS가 뭔가요?

    NFS(네트워크 파일 시스템)는 네트워크를 통해 파일 시스템을 공유하는 프로토콜이에요. 쉽게 말해서, NAS나 별도 서버의 디렉토리를 Proxmox에 마운트해서 스토리지로 쓰는 방식입니다.

    NFS의 장점:

    • 설정이 비교적 간단해요
    • 여러 Proxmox 노드가 동시에 접근 가능 → 라이브 마이그레이션 지원
    • 기존 NAS(Synology, QNAP 등)와 쉽게 연동됩니다
    • ISO 이미지, 백업 파일 저장에 적합합니다

    NFS의 단점:

    • 네트워크 의존성이 높음 (네트워크 장애 = 스토리지 장애)
    • 레이턴시(지연시간)가 로컬 스토리지보다 높아요
    • 고성능 VM 디스크용으로는 부적합한 경우가 많습니다

    Proxmox에서 NFS 설정하기

    # NFS 클라이언트 패키지 확인
    apt install nfs-common
    
    # NFS 마운트 테스트
    mount -t nfs 192.168.1.100:/volume1/proxmox /mnt/test-nfs
    
    # Proxmox Web UI 대신 CLI로 NFS 스토리지 추가
    pvesm add nfs nas-storage \
      --server 192.168.1.100 \
      --export /volume1/proxmox \
      --content iso,backup,images \
      --options vers=4.1
    
    # 추가된 스토리지 확인
    pvesm status

    💡 팁: NFS 버전은 가능하면 NFSv4.1을 쓰세요. NFSv3보다 안정성과 성능이 향상됐고, 특히 Proxmox 클러스터 환경에서 더 안정적으로 동작합니다.

    NFS 성능 최적화 옵션

    # /etc/fstab에 NFS 마운트 옵션 최적화
    192.168.1.100:/volume1/proxmox /mnt/nas-proxmox nfs \
      vers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0
    
    # rsize/wsize: 읽기/쓰기 블록 크기 (1MB)
    # hard: 서버 응답 없으면 계속 재시도 (VM 안전을 위해 hard 권장)
    # timeo: 타임아웃 (1/10초 단위, 600 = 60초)

    iSCSI: 블록 스토리지를 네트워크로

    iSCSI가 뭔가요?

    iSCSI(아이스카시)는 SCSI 명령을 IP 네트워크를 통해 전달하는 프로토콜이에요. NFS가 “파일” 단위로 공유한다면, iSCSI는 “블록” 단위로 공유합니다. VM 입장에서 보면 마치 로컬 디스크가 연결된 것처럼 보여요.

    iSCSI 용어 정리:

    • Target (타깃): 스토리지를 제공하는 서버 (NAS, SAN 등)
    • Initiator (이니시에이터): 스토리지를 사용하는 클라이언트 (Proxmox 노드)
    • IQN (iSCSI Qualified Name): iSCSI 장치를 식별하는 고유 이름
    • LUN (Logical Unit Number): Target에서 제공하는 스토리지 단위

    Proxmox에서 iSCSI 설정하기

    # iSCSI initiator 패키지 설치
    apt install open-iscsi
    
    # iSCSI Target 검색 (NAS IP로)
    iscsiadm -m discovery -t sendtargets -p 192.168.1.100
    
    # 검색된 Target에 로그인
    iscsiadm -m node --login
    
    # 연결된 iSCSI 세션 확인
    iscsiadm -m session
    
    # Proxmox에 iSCSI 스토리지 추가
    pvesm add iscsi san-storage \
      --portal 192.168.1.100 \
      --target iqn.2023-01.com.example:storage \
      --content none
    
    # iSCSI 위에 LVM-Thin을 올려서 사용하는 게 일반적
    pvesm add lvmthin san-lvm-thin \
      --vgname san-vg \
      --thinpool san-thin-pool \
      --content images

    여기서 중요한 포인트! iSCSI는 단독으로는 Proxmox에서 VM 디스크로 직접 쓰기 어렵고, 보통 iSCSI로 블록 디바이스를 가져온 다음 그 위에 LVM이나 LVM-Thin을 올려서 사용해요. 저도 처음엔 이게 왜 이렇게 복잡한가 싶었는데, 블록 스토리지의 특성상 그렇게 써야 제대로 성능이 나오더라고요.

    4가지 스토리지 종합 비교

    항목 ZFS LVM-Thin NFS iSCSI+LVM
    유형 로컬 로컬 공유 (파일) 공유 (블록)
    스냅샷 ✅ 매우 효율적 ✅ 효율적 ⚠️ 제한적 ✅ LVM 스냅샷
    라이브 마이그레이션 ❌ 단일 노드 ❌ 단일 노드 ✅ 가능 ✅ 가능
    데이터 무결성 ✅ 최고 수준 ⚠️ 기본 수준 ⚠️ 네트워크 의존 ⚠️ 중간 수준
    성능 ✅ 높음 ✅ 높음 ⚠️ 네트워크 속도 의존 ✅ 높음
    설정 난이도 중간 낮음 낮음 높음
    RAM 요구량 높음 낮음 낮음 낮음
    추천 용도 단일 노드, 데이터 안전성 중시 단일 노드, 일반 VM ISO/백업, 소규모 클러스터 엔터프라이즈 클러스터

    ▲ Proxmox 스토리지 4종 비교 인포그래픽. 상황에 따라 적합한 스토리지 타입이 다릅니다.

    실제 구성 예시 및 최적화 팁

    홈랩 단일 노드 추천 구성

    제가 실제로 홈랩에서 쓰는 구성을 공유할게요:

    # /etc/pve/storage.cfg 예시 (실제 파일 위치)
    
    # 기본 로컬 디렉토리 (ISO, 백업용)
    dir: local
            path /var/lib/pve/local
            content iso,backup,snippets
    
    # ZFS 풀 (VM 디스크 메인)
    zfspool: local-zfs
            pool rpool/data
            content images,rootdir
            mountpoint /rpool/data
    
    # NFS (NAS 백업 및 ISO 라이브러리)
    nfs: nas-backup
            export /volume1/proxmox-backup
            path /mnt/pve/nas-backup
            server 192.168.1.100
            content backup,iso
            options vers=4.1

    ZFS 성능 최적화 핵심 설정

    # ZFS 레코드 크기 조정 (VM 디스크용 - 16K~64K 권장)
    zfs set recordsize=64K rpool/data
    
    # VM 특성에 따른 recordsize 조정
    # 데이터베이스 VM: 8K~16K
    # 일반 VM: 64K
    # 파일 서버 VM: 128K
    zfs set recordsize=16K rpool/data/vm-100-disk-0
    
    # 동기화 쓰기 설정 (성능과 안전성 트레이드오프)
    # sync=always: 가장 안전, 가장 느림
    # sync=standard: 기본값 (권장)
    # sync=disabled: 가장 빠름, 전원 손실시 데이터 손상 위험
    zfs set sync=standard rpool/data
    
    # 압축 활성화 (CPU 사용 약간 증가, 용량 절약)
    zfs set compression=lz4 rpool/data
    
    # 중복 제거 (dedup) - RAM 많이 필요, 신중하게 결정
    # 홈랩에선 웬만하면 끄는 걸 추천
    zfs set dedup=off rpool/data
    
    # ZFS 상태 및 통계 확인
    zpool status -v
    zfs list -t all
    zpool iostat -v 1

    iSCSI 멀티패스 (Multipath) 설정 — 고가용성 환경

    # multipath-tools 설치
    apt install multipath-tools
    
    # /etc/multipath.conf 기본 설정
    cat > /etc/multipath.conf << 'EOF'
    defaults {
        user_friendly_names yes
        find_multipaths yes
    }
    blacklist {
        devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
        devnode "^hd[a-z]"
    }
    EOF
    
    systemctl enable multipathd
    systemctl start multipathd
    multipath -ll  # 멀티패스 장치 확인

    트러블슈팅: 제가 겪은 문제들

    문제 1: ZFS 풀이 DEGRADED 상태

    # 증상 확인
    zpool status
    # 출력에서 state: DEGRADED 확인
    
    # 디스크 교체 후 복구
    zpool replace rpool /dev/old-disk /dev/new-disk
    
    # 리실버링(데이터 복구) 진행 상황 확인
    zpool status -v
    # 완료까지 기다린 후 state: ONLINE 확인

    문제 2: NFS 마운트 후 VM 시작 느림

    이건 NFS 타임아웃 설정 문제였어요. Proxmox 노드 재시작 시 NFS가 마운트되기 전에 VM이 시작하려다 보니 생기는 문제였습니다.

    # /etc/systemd/system/pve-storage-nas-backup.service.d/ 디렉토리 생성
    mkdir -p /etc/systemd/system/pve-storage-nas-backup.service.d/
    
    # NFS 마운트 의존성 추가
    cat > /etc/systemd/system/pve-storage-nas-backup.service.d/override.conf << 'EOF'
    [Unit]
    After=network-online.target
    Wants=network-online.target
    EOF
    
    systemctl daemon-reload

    문제 3: LVM-Thin 풀 오버커밋 위험

    # LVM-Thin 사용량 모니터링 스크립트
    cat > /usr/local/bin/check-thin-usage.sh << 'EOF'
    #!/bin/bash
    THRESHOLD=80
    USAGE=$(lvs --noheadings -o data_percent vg-data/thin-pool 2>/dev/null | tr -d ' ')
    USAGE_INT=${USAGE%.*}
    
    if [ "$USAGE_INT" -gt "$THRESHOLD" ]; then
        echo "WARNING: LVM-Thin pool usage is ${USAGE}%"
        # 여기에 알림 로직 추가 (메일, Slack 등)
    fi
    EOF
    chmod +x /usr/local/bin/check-thin-usage.sh
    
    # cron에 등록 (5분마다 체크)
    echo '*/5 * * * * root /usr/local/bin/check-thin-usage.sh' >> /etc/cron.d/thin-monitor

    ▲ Proxmox 스토리지 모니터링 대시보드. ZFS 풀 상태, LVM-Thin 사용량, NFS 연결 상태를 한 화면에서 확인하는 구성 예시입니다.

    상황별 Proxmox 스토리지 선택 가이드

    어떤 걸 골라야 하나요?

    결국 "뭐가 제일 좋냐"는 질문에 정답은 없어요. 상황에 따라 다르거든요. 제 추천을 정리하면:

    • 🏠 홈랩, 단일 노드, 데이터 안전성 중시 → ZFS. RAM이 충분하다면 무조건 ZFS 먼저 고려하세요
    • 💻 홈랩, 단일 노드, 심플하게 시작 → LVM-Thin. 복잡함 없이 바로 쓸 수 있어요
    • 🗄️ ISO/백업 파일 공유, 기존 NAS 연동 → NFS. 설정 쉽고 NAS랑 궁합 최고
    • 🏢 다중 노드 클러스터, 라이브 마이그레이션 필요 → iSCSI+LVM 또는 Ceph. Ceph는 다음 글에서 따로 다룰 예정이에요

    마무리: 스토리지는 처음 선택이 반입니다

    Proxmox 스토리지 설정, 생각보다 선택지가 많죠? 저도 처음엔 그냥 기본값으로 쭉 쓰다가 나중에 마이그레이션하느라 고생 많이 했어요. 지금 돌아보면 처음부터 ZFS로 시작했으면 훨씬 편했을 텐데 싶더라고요.

    정리하면:

    • ✅ ZFS: 데이터 무결성, 효율적 스냅샷, 단일 노드 최강자. RAM은 넉넉하게 준비하세요
    • ✅ LVM-Thin: 검증된 안정성, 낮은 진입장벽, 씬 프로비저닝으로 공간 효율적입니다
    • ✅ NFS: 공유 스토리지 입문, NAS 연동, ISO/백업 저장에 딱입니다
    • ✅ iSCSI: 블록 레벨 공유, 클러스터 환경, 설정 복잡하지만 성능 좋습니다

    다음 글에서는 Proxmox 클러스터 환경에서 Ceph를 활용한 분산 스토리지 구성을 다뤄볼 예정입니다. 여러 노드에 걸쳐 데이터를 분산 저장하고 고가용성을 확보하는 방법인데, 홈랩에서도 충분히 구성 가능하더라고요. 혹시 궁금한 점이나 다른 스토리지 구성 경험 있으시면 댓글로 공유해 주세요! 🎉