13년차의 서버실

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

[태그:] RAIDZ

  • [NAS] TrueNAS ZFS 풀 확장: 성능 저하 없이 용량 늘리는 방법 분석

    [NAS] TrueNAS ZFS 풀 확장: 성능 저하 없이 용량 늘리는 방법 분석

    [NAS] TrueNAS ZFS 풀 확장: 성능 저하 없이 용량 늘리는 방법 분석

    홈랩(Home Lab, 개인 실험실) NAS를 오래 굴리다 보면 결국 한 번은 맞닥뜨리는 문제가 있습니다. 분명 처음엔 넉넉하다고 생각했는데, 백업 데이터와 미디어 파일, VM 이미지가 쌓이면서 어느 순간 용량이 바닥을 보더라고요. 저도 TrueNAS ZFS 확장을 몇 번 직접 해보면서 느낀 건, 그냥 디스크 하나 더 꽂는다고 끝나는 구조가 아니라는 점이었습니다. 특히 TrueNAS ZFS 확장은 성능과 안정성을 같이 봐야 해서, 잘못 접근하면 NAS 용량 증설은 됐는데 ZFS 성능이 애매해지는 경우가 생깁니다.

    처음엔 저도 “디스크 추가만 하면 되겠지?”라고 생각했었는데, ZFS(제트에프에스, 파일시스템+볼륨 매니저 통합 구조)는 생각보다 설계 철학이 명확합니다. 그래서 오늘은 성능 저하 없이 용량을 늘리는 방법에 초점을 맞춰서, 어떤 방식이 안전한지, 어떤 방식은 조심해야 하는지, 그리고 실제로 확인해야 할 명령어까지 한 번에 정리해보겠습니다.

    TrueNAS ZFS 확장 개요를 보여주는 아키텍처 이미지

    TrueNAS ZFS 확장 전략을 한눈에 보여주는 개요 다이어그램입니다. 기존 풀, vdev, 디스크 추가 방향을 직관적으로 이해할 수 있게 배치하면 좋습니다.

    왜 TrueNAS ZFS 확장이 까다로운가

    쉽게 말해 ZFS는 단순히 디스크 몇 개를 묶는 수준이 아니라, vdev(Virtual Device, 가상 장치) 단위로 성능과 안정성을 관리합니다. 그리고 여러 vdev가 모여 하나의 pool(풀)을 만들죠. 여기서 중요한 포인트가 있습니다. 풀은 확장하기 쉬워 보여도, 기존 vdev 구조는 생각보다 보수적으로 다뤄야 한다는 점입니다.

    예를 들어 mirror(미러, 동일 데이터 복제) vdev 2개로 풀을 만들었다면, 나중에 같은 형태의 mirror vdev를 하나 더 추가하는 건 비교적 자연스럽습니다. 반면 RAIDZ(레이드지, 패리티 기반 보호) vdev 하나로 구성한 풀은, 전통적으로는 그 vdev에 디스크 하나만 툭 추가하는 방식이 깔끔하지 않았거든요. 여기서 많은 분들이 삽질을 시작합니다. 저도 처음엔 이게 뭔가 싶었는데, 구조를 이해하고 나니 왜 ZFS가 그렇게 동작하는지 보이더라고요.

    핵심 개념: 성능 저하 없이 용량 늘린다는 말의 의미

    “성능 저하 없이”라는 표현을 좀 더 정확히 풀어보겠습니다. ZFS에서 성능은 대체로 다음 요소에 영향을 받습니다.

    • vdev 개수: 일반적으로 vdev가 늘어나면 병렬성이 좋아질 수 있습니다.
    • 각 vdev의 디스크 수와 형태: mirror인지 RAIDZ인지에 따라 IOPS(Input/Output Operations Per Second, 초당 입출력 작업 수) 특성이 달라집니다.
    • 디스크 크기와 속도의 균형: 느린 디스크가 섞이면 전체 체감이 나빠질 수 있습니다.
    • 확장 과정 중 resilver(리실버, 데이터 재동기화) 부하: 이 과정에서 일시적으로 성능이 떨어질 수 있습니다.

    즉, 용량만 늘어나는 방식과 용량과 성능 특성을 함께 유지하는 방식은 다릅니다. 실제로 써보니까 가장 덜 후회하는 방법은 아래 두 가지였습니다.

    1. 기존과 동일한 성격의 vdev를 추가해서 풀 병렬성을 유지하는 방법
    2. 기존 디스크를 하나씩 더 큰 디스크로 교체한 뒤 자동 확장(autoexpand, 자동 확장)을 활용하는 방법

    반대로, 크기나 성능이 제각각인 디스크를 즉흥적으로 추가하면 NAS 용량 증설은 되더라도 장기적으로 운영이 피곤해집니다. 특히 장애 대응할 때 구조가 복잡해지더라고요.

    TrueNAS ZFS 확장 방법 비교

    방법 언제 적합한가 ZFS 성능 영향 장점 주의점
    동일한 새 vdev 추가 베이에 여유가 있고 구조를 깔끔하게 유지하고 싶을 때 대체로 유리 병렬성 유지, 확장 논리 명확 같은 급의 디스크를 여러 개 준비해야 함
    기존 디스크 순차 교체 후 확장 베이 여유가 없고 현재 구조를 유지해야 할 때 구조 유지 측면에서 안정적 기존 풀 레이아웃 유지 리실버 시간이 길고 교체 순서가 중요
    서로 다른 특성의 vdev 혼합 추가 임시 증설이 급할 때 예측 어려움 당장 공간 확보 가능 장기 운영, 장애 대응, 체감 성능 모두 애매해질 수 있음

    여기서 제 경험상 가장 추천하는 건 “같은 성격으로 확장하기”입니다. 처음 설계를 mirror로 했다면 mirror로, RAIDZ로 했다면 이후 확장 시에도 같은 패턴을 유지하는 쪽이 관리가 편합니다.

    TrueNAS ZFS 확장 구조에서 pool과 vdev 관계를 설명하는 이미지

    pool 아래에 여러 vdev가 있고, 각 vdev 아래에 디스크가 연결되는 구조를 시각적으로 보여주는 이미지가 들어가면 이해가 훨씬 빠릅니다.

    실전 1: 새 vdev 추가로 TrueNAS ZFS 확장하기

    이 방법은 제가 홈랩에서 가장 선호하는 방식입니다. 이유는 단순합니다. 설계 의도를 망가뜨리지 않고 확장할 수 있거든요. 예를 들어 2디스크 mirror vdev 두 개로 운영 중이었다면, 같은 2디스크 mirror vdev를 하나 더 추가하는 식입니다.

    확장 전 확인

    먼저 현재 풀 구성을 확인합니다.

    zpool status
    zpool list
    zpool iostat -v 1

    zpool status는 현재 풀과 vdev 상태를, zpool list는 용량과 사용률을, zpool iostat -v 1은 vdev별 I/O 흐름을 보는 데 유용합니다. 저는 확장 전에 이 세 개는 거의 습관처럼 확인합니다. 나중에 비교하기 좋거든요.

    절차

    1. 새 디스크를 장착하고 시스템이 정상 인식하는지 확인합니다.
    2. 기존 풀의 vdev 레이아웃과 동일한 방식으로 새 vdev를 구성합니다.
    3. TrueNAS GUI 또는 CLI(Command Line Interface, 명령줄 인터페이스)에서 풀에 추가합니다.
    4. 추가 직후 I/O 분산과 용량 변화를 확인합니다.

    CLI 예시는 아래처럼 볼 수 있습니다. 디바이스 이름은 환경마다 다르니 반드시 직접 확인하셔야 합니다.

    zpool add tank mirror /dev/disk/by-id/driveA /dev/disk/by-id/driveB

    예시에서 tank는 풀 이름입니다. 이 명령은 새 mirror vdev를 기존 풀에 추가하는 형태입니다. 한 번 추가한 vdev는 쉽게 되돌리기 어렵다는 점, 꼭 기억하셔야 합니다. 제가 예전에 이름 비슷한 디스크를 잘못 보고 진행했다가 식은땀 좀 흘렸습니다 ㅎㅎ

    이 방식이 성능 면에서 유리한 이유

    새 vdev가 추가되면 풀은 더 많은 vdev에 I/O를 분산할 수 있습니다. 물론 워크로드 특성에 따라 체감은 다르지만, 최소한 구조적으로 병렬 처리 경로를 늘리는 방향이라 논리가 깔끔합니다. 특히 VM 저장소나 작은 파일이 많은 환경에서는 이 차이가 은근히 보이더라고요.

    실전 2: 디스크를 하나씩 교체해서 NAS 용량 증설하기

    베이(Bay, 디스크 장착 슬롯)가 꽉 찬 경우에는 이 방법이 현실적입니다. 기존 풀 구조는 유지하면서 디스크 용량만 키우는 방식이죠. mirror든 RAIDZ든 많이 쓰는 패턴인데, 핵심은 한 번에 하나씩 교체하고, 각 교체마다 리실버가 완전히 끝날 때까지 기다리는 것입니다.

    기본 흐름

    1. 현재 상태를 확인합니다.
    2. 기존 디스크 하나를 오프라인 처리하거나 교체 절차에 맞춰 분리합니다.
    3. 더 큰 디스크로 교체합니다.
    4. 리실버 완료를 기다립니다.
    5. 다음 디스크로 같은 작업을 반복합니다.
    6. 모든 디스크가 교체된 뒤 풀 확장 여부를 확인합니다.
    zpool status
    zpool offline tank /dev/disk/by-id/old-drive
    zpool replace tank /dev/disk/by-id/old-drive /dev/disk/by-id/new-drive
    zpool status

    실제 명령은 환경과 장치 식별 방식에 따라 달라질 수 있습니다. 그래서 저는 항상 /dev/disk/by-id 경로처럼 상대적으로 식별이 명확한 쪽을 선호합니다. /dev/sdX 같은 이름은 재부팅이나 장치 순서에 따라 헷갈릴 수 있거든요.

    자동 확장 확인

    디스크를 모두 더 큰 용량으로 바꾼 뒤에도 풀 크기가 바로 기대만큼 안 늘어나는 경우가 있습니다. 이럴 때는 autoexpand(자동 확장) 설정과 풀 상태를 확인해봐야 합니다.

    zpool get autoexpand tank
    zpool set autoexpand=on tank
    zpool online -e tank /dev/disk/by-id/new-drive

    처음엔 저도 “왜 디스크는 바뀌었는데 용량이 그대로지?” 싶었는데, 이런 부분에서 한 번씩 막히더라고요. 특히 교체 직후 바로 결과만 보고 판단하면 놓치는 게 있습니다. 리실버가 완전히 끝났는지부터 확인하셔야 합니다.

    리실버 진행 상태, 풀 상태, 디스크 교체 흐름을 보여주는 운영 화면 이미지가 있으면 실전 감각이 살아납니다.

    TrueNAS GUI에서 볼 때 체크할 포인트

    CLI가 제일 명확하긴 하지만, 실제 운영에서는 TrueNAS GUI도 꽤 자주 보게 됩니다. 제가 보통 체크하는 항목은 이 정도입니다.

    • Pool 상태: ONLINE인지, DEGRADED인지
    • Disk 상태: 새 디스크가 정상 인식됐는지
    • 작업 진행률: 리실버가 끝났는지
    • Capacity 변화: 예상한 만큼 용량이 반영됐는지
    • Alert: SMART 관련 경고나 I/O 오류가 없는지

    GUI가 편하긴 한데, 중요한 작업일수록 CLI로 최종 확인하는 습관을 추천드립니다. 화면상으론 정상처럼 보여도 세부 상태는 zpool status 쪽이 더 직설적입니다.

    ⚠️ 주의사항과 트러블슈팅

    여기서부터는 정말 실전 얘기입니다. 이 부분 때문에 삽질 좀 했습니다 ㅎㅎ

    1. 디스크 하나만 추가해서 RAIDZ를 키우려는 시도

    많이 하는 착각입니다. 기존 RAIDZ vdev가 있다고 해서, 거기에 디스크 하나를 단순 추가하는 방식이 항상 안전하고 익숙한 운영 패턴은 아닙니다. 운영 환경에서는 지원 여부와 절차를 현재 문서로 꼭 재확인하셔야 하고, 검증된 방식은 동일한 새 vdev 추가 또는 순차 교체라고 보시는 게 안전합니다.

    2. 크기가 다른 디스크를 섞어 넣는 문제

    ZFS는 동작은 하더라도, 실제 활용 가능한 용량과 균형은 가장 작은 축에 맞춰 생각해야 하는 경우가 많습니다. 그리고 확장 계획이 지저분해집니다. 처음엔 급해서 그렇게 넣고 싶어지는데, 나중에 교체 주기 맞출 때 정말 귀찮아집니다.

    3. 리실버 중 성능 저하를 무시하는 문제

    성능 저하 없이라는 말은 확장 중에도 항상 아무 영향이 없다는 뜻은 아닙니다. 리실버 중에는 읽기/쓰기 지연이 늘 수 있습니다. 그래서 중요한 건 최종 구조가 성능 저하를 만들지 않는 방향이어야 한다는 겁니다. 저는 대용량 복제나 스크럽(scrub, 무결성 검사) 작업과 겹치지 않게 시간대를 따로 잡습니다.

    4. 백업 없이 확장 작업부터 들어가는 문제

    이건 정말 강조하고 싶습니다. ZFS가 안정적이라고 해도, 확장 작업은 결국 저장장치 구성 변경입니다. 디스크 자체 불량, 케이블 문제, 슬롯 접촉 불량 같은 변수는 늘 있습니다. 백업 없는 확장은 자신감이 아니라 도박에 가깝습니다.

    5. 디바이스 이름을 대충 보고 진행하는 문제

    /dev/sda, /dev/sdb 같은 이름만 믿고 교체하다가 엉뚱한 디스크를 건드리면 정말 아찔합니다. 가능하면 시리얼 기반 식별 경로를 쓰시고, 작업 전후로 꼭 대조해보세요. 저는 메모장에 디스크 시리얼과 베이 위치를 적어두고 합니다. 이거 진짜 편하더라고요.

    검증: 확장 후 무엇을 확인해야 하나

    확장이 끝났다고 바로 안심하시면 안 됩니다. 최소한 아래 항목은 체크하시는 게 좋습니다.

    1. 풀이 ONLINE 상태인지 확인
    2. 예상한 만큼 총 용량이 늘었는지 확인
    3. 각 vdev에 I/O가 비정상적으로 쏠리지 않는지 확인
    4. 에러 카운터가 증가하지 않는지 확인
    5. SMART 상태와 온도를 점검
    zpool status -v
    zpool list
    zpool iostat -v 5
    smartctl -a /dev/sdX

    zpool iostat -v 5는 5초 단위로 상태를 보기에 좋습니다. 제가 직접 해보니 확장 직후에는 단순히 용량만 보지 말고, 실제로 파일 복사나 백업 작업을 한 번 흘려보내면서 vdev 반응을 같이 보는 게 좋았습니다. 그래야 “늘긴 늘었는데 뭔가 이상하게 굼뜬다” 같은 문제를 빨리 잡을 수 있거든요.

    TrueNAS ZFS 확장 전후 용량과 성능 비교 이미지

    확장 전후의 총 용량, 사용률, I/O 분산 상태를 비교한 대시보드 이미지가 들어가면 결과 섹션의 설득력이 높아집니다.

    어떤 확장 전략이 가장 현실적인가

    환경별로 정리해보면 이렇습니다.

    상황 추천 전략 이유
    디스크 베이에 여유가 있음 동일한 새 vdev 추가 구조 확장이 자연스럽고 병렬성 유지에 유리
    베이가 꽉 참 디스크 순차 교체 현재 레이아웃을 유지하면서 용량만 키우기 좋음
    임시로 공간만 급함 가능하면 정식 확장 전 임시 데이터 정리 무리한 혼합 구성은 장기적으로 손해

    혹시 이런 경험 있으신가요? 급하게 공간이 필요해서 손에 잡히는 디스크부터 넣고 싶은 순간이요. 저도 그랬습니다. 그런데 ZFS는 급한 마음으로 건드릴수록 나중에 구조가 발목을 잡는 편이더라고요. 그래서 제 기준에선 “지금 가장 쉬운 방법”보다 “3년 뒤에도 설명 가능한 구조”가 더 중요했습니다.

    자주 묻는 질문

    Q1. 디스크 추가만 하면 자동으로 성능도 같이 좋아지나요?

    항상 그렇진 않습니다. 어떤 형태의 vdev를 추가했는지, 워크로드가 순차 읽기 위주인지, 랜덤 I/O 위주인지에 따라 다릅니다. 다만 동일한 성격의 vdev를 추가하는 방식은 구조적으로 예측 가능성이 높습니다.

    Q2. NAS 용량 증설 시 제일 먼저 볼 명령은 뭔가요?

    저는 zpool status부터 봅니다. 상태를 모르고 작업하는 건 위험합니다. 그다음 zpool list, 필요하면 zpool iostat -v를 봅니다.

    Q3. ZFS 성능을 위해 SSD 캐시만 추가하면 해결되나요?

    캐시 장치는 특정 워크로드에서 도움이 될 수 있지만, 기본 풀 구조가 좋지 않으면 근본 해결은 아닙니다. 먼저 풀 레이아웃과 vdev 구성을 정리하는 게 우선입니다. 캐시는 그 다음입니다.

    정리: TrueNAS ZFS 확장은 구조를 지키는 쪽이 결국 이깁니다

    오늘 정리한 내용을 한 줄로 줄이면 이렇습니다. TrueNAS ZFS 확장은 단순히 디스크 추가가 아니라, vdev 구조를 어떻게 유지하느냐의 문제입니다. 성능 저하 없이 가고 싶다면 검증된 방식으로 접근하시는 게 맞습니다. 즉, 베이에 여유가 있으면 동일한 새 vdev를 추가하고, 여유가 없으면 기존 디스크를 하나씩 더 큰 용량으로 교체하는 쪽이 가장 현실적입니다.

    저도 처음엔 용량만 보면 되는 줄 알았는데, 실제로 써보니까 결국 중요한 건 장기 운영의 일관성이었습니다. ZFS 성능, 장애 대응, 다음 증설 계획까지 생각하면 설계를 흐트러뜨리지 않는 게 제일 낫더라고요. 다음 글에서는 스크럽 주기, SMART 모니터링, 백업 전략까지 묶어서 홈랩 NAS 운영 체크리스트로 정리해보겠습니다. 이전 글에서 다뤘던 스토리지 모니터링 내용과 같이 보시면 더 도움이 되실 겁니다.

    TrueNAS ZFS 확장 전략을 요약한 인포그래픽 이미지

    추천 확장 방식, 피해야 할 방식, 점검 명령어를 한 장으로 정리한 요약 인포그래픽 이미지가 마무리용으로 잘 어울립니다.

  • [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) 기능을 활용한 백업 전략에 대해 더 자세히 다뤄볼 예정입니다. 기대해주세요! 👋