여러 드라이브를 Backblaze에 중복 제거와 함께 백업 – b2-dedup 소개
Source: Dev.to
소개
수 테라바이트에 달하는 데이터를 여러 드라이브, NAS 박스 또는 서로 다른 컴퓨터에 걸쳐 백업하고 계신가요? 중복 업로드나 중복 저장을 위해 큰 비용을 들이지 않고도 모든 데이터를 한 곳의 안전한 오프사이트 장소에 보관하고 싶으신가요?
바로 그래서 제가 b2-dedup을 만들었습니다 — Backblaze B2에 최적화된 병렬 스트리밍 중복 제거 업로더.
배울 내용
- 왜 Backblaze B2가 (제 의견으로는) 개인 또는 대규모 백업에 AWS S3, Azure Blob 등보다 가장 현명한 선택인지
- 드라이브 간 중복 제거가 시간, 대역폭, 비용을 어떻게 절약하는지
- b2-dedup의 단계별 설정 및 사용법
Backblaze B2 vs. 기타 클라우드 스토리지 (2025‑2026)
| 서비스 | 저장 비용 (≈) | 전송 비용 (Egress Cost) |
|---|---|---|
| B2 | ~$6 /TB / 월 (최근 $5/TB에서 조정됨) | 월 평균 저장량의 3배까지 무료 전송 (Cloudflare, Fastly 등 다수 CDN/파트너에 무제한 무료) |
| AWS S3 Standard | ~$23 /TB / 월 (첫 50 TB 티어) | 무료 티어 이후 $0.08–$0.09 / GB (1 TB 복구 ≈ $80) |
| Azure Blob Hot | S3와 비슷한 수준 (~$18–$23 /TB) | S3와 동일 |
핵심: B2는 항상 핫하고 즉시 접근 가능한 스토리지 가격의 약 1/4~1/5 수준입니다.
기타 주의사항
- 업로드 비용, 삭제 페널티, 최소 파일 크기, 대용량 백업 시 발생하는 숨겨진 API 호출 비용이 없습니다 (B2는 Class A 호출을 무료로 유지합니다).
- S3 호환 API → rclone, restic, Veeam 등과 함께 사용할 수 있습니다.
- 우연히 얽히게 되는 복잡한 스토리지 티어/클래스가 없습니다 (특히 Glacier/Archive와 같은 콜드 데이터용을 의도적으로 사용하지 않는 한).
개인 사용자, 홈랩 운영자, 사진·영상 제작자, 혹은 오프사이트 백업을 하는 소규모 기업에게 B2는 예측 가능한 저비용과 합리적인 전송 정책으로 승리합니다.
왜 새로운 도구가 필요할까? – 크로스‑드라이브 중복 제거의 필요성
여러 드라이브(예: 메인 PC SSD, 외장 HDD, 미디어 NAS)를 백업할 때 동일한 사진, 동영상, 설치 파일, OS 이미지 등이 수없이 중복되어 저장되는 경우가 많습니다.
표준 도구(rclone, Duplicati 등)는 보통 하나의 백업 작업 내에서만 중복을 제거하지만, 완전히 별개의 소스 간에서는 중복을 제거하지 못합니다.
b2-dedup는 이 문제를 해결합니다:
- 로컬 SQLite DB(
~/b2_dedup.db)를 사용해 지금까지 본 모든 파일의 SHA‑256 해시를 기억합니다. - 두 번째 드라이브(Drive #2)를 지정하면, 첫 번째 드라이브(Drive #1)에서 이미 업로드된 파일은 건너뜁니다.
- 병렬 업로드(기본 10 워커, 조정 가능) + 스트리밍 청크 업로드 → 낮은 메모리 사용량, 높은 속도.
- 중단된 작업을 이어서 재개할 수 있는 복구 기능.
- 안전을 위한 스캔 전용 / 드라이런 모드 제공.
결과: 하나의 B2 버킷에 여러 “드라이브‑이름” 프리픽스(예: PC2025/, MediaNAS/, Laptop/)를 두지만, 실제 저장 용량은 중복 파일이 재업로드되지 않기 때문에 최소화됩니다.
사전 요구 사항
- Python 3.8+
- Backblaze B2 계정 및 버킷 생성
- B2 애플리케이션 키 (KeyID + Application Key) — 버킷에 Read + Write 접근 권한을 가진 키를 생성
설치
# Clone the repository
git clone https://github.com/n0nag0n/b2-dedup.git
cd b2-dedup
# Install Python dependencies
pip install -r requirements.txt
공식 B2 CLI 설치 (선택 사항이지만 권장)
pip install b2
b2 account authorize # follow prompts with your KeyID + App Key
b2-dedup은 자동으로 해당 자격 증명을 사용합니다.
(또는 환경 변수 B2_KEY_ID와 B2_APPLICATION_KEY를 내보낼 수 있습니다.)
사용 예시
1️⃣ 첫 번째 드라이브 (베이스라인)
# Optional: just scan & hash everything first (no upload)
python b2_dedup.py /mnt/primary-drive \
--drive-name PrimaryPC \
--bucket my-backup-bucket-123 \
--scan-only
# Then do the real upload
python b2_dedup.py /mnt/primary-drive \
--drive-name PrimaryPC \
--bucket my-backup-bucket-123
2️⃣ 두 번째(또는 N번째) 드라이브 — 중복 파일은 건너뜁니다!
python b2_dedup.py /mnt/media-drive \
--drive-name MediaNAS \
--bucket my-backup-bucket-123 \
--workers 20
전문가 팁: 먼저 드라이‑런으로 미리 보기
python b2_dedup.py /mnt/media-drive \
--drive-name MediaNAS \
--bucket my-backup-bucket-123 \
--dry-run
유용한 플래그
| Flag | Description |
|---|---|
--workers N | 병렬 업로드 작업자 수 (기본값 10). 인터넷/업로드 속도가 허용한다면 늘리세요. |
--dry-run | 실제로 데이터를 전송하지 않고 업로드될 내용을 표시합니다. |
--scan-only | B2에 접속하지 않고 해시 DB를 구축·채웁니다. |
--refresh-count | 파일 수를 강제로 다시 계산합니다 (소스가 많이 변경된 경우 유용). |
--drive-name NAME | 버킷 내부에서 사용되는 접두사 (예: PrimaryPC/). 드라이브 이름을 바꾸거나 재구성할 때 변경합니다. |
중복 제거 작동 방식
- Prefix =
--drive-name(예:PrimaryPC/Documents/report.docx). - 중복 제거는 content hash를 기준으로 수행됩니다 — 경로나 파일 이름과 관계없이 동일한 파일은 한 번만 저장됩니다.
- 데이터베이스는
~/b2_dedup.db에 위치합니다 — 백업하세요! (크기는 작지만, 이를 잃으면 모든 파일을 다시 해시해야 합니다.)
매우 큰 초기 스캔의 경우, --scan-only 옵션으로 밤새 실행한 뒤 업로드를 진행하세요.
다른 백업 도구와 결합하기
b2-dedup는 순수하게 초기/증분 중복 제거 업로드를 위한 것입니다.
버전 관리나 추가 기능을 위해 rclone, Borg, restic 등과 결합하여 사용할 수 있습니다.
혜택 요약
- 저렴하고 내구성 있는 오프사이트 위치 하나
- 업로드 시간과 저장 비용을 크게 줄이는 크로스‑드라이브 중복 제거
- 병렬, 재개 가능, 저메모리 작동
저는 수년간 유사한 설정을 운영해 왔으며, 사진, 비디오, ISO 파일 및 대체 불가능한 문서를 보관하는 데 매우 견고합니다.
시작하기
- 저장소:
- 유용하다고 생각되면 저장소에 별표를 달아 주세요.
- 질문, 버그, 기여 사항은 이슈나 PR을 열어 주세요.
즐거운 (중복 제거된) 백업 되세요! 🚀