
當服務穩定運行之後,最大的成本通常不是 CPU,而是儲存。使用者上傳的檔案、交易報表、監控 log、服務備份——這些東西只會越來越多,永遠不會自己消失。沒有規則,檔案就是堆在機器上的灰塵。
先講結論
物件儲存的治理核心:用 Bucket 做冷熱分層(Hot / Warm / Cold)、用 Lifecycle rule 自動清理、用 Policy 控制最小權限、用 mirror 做備份。手動刪檔不是策略,自動化規則才是。
物件儲存 vs 檔案系統:為什麼要換?
檔案系統(ext4、NTFS)適合「少量 + 高頻變更」。但檔案數到幾十萬,你就會遇到 inode 耗盡、目錄操作變慢、備份時間不可控。
物件儲存把檔案變成 key-value:key 是路徑字串,value 是檔案內容。沒有目錄鎖定、沒有 inode 限制、天生適合大量小檔案。而且 S3 API 是事實標準,換掉後端實作(MinIO → AWS S3)幾乎不用改 code。
資料分層:不是所有東西都需要 SSD
- Hot:近期上傳、頻繁讀取(SSD)
- Warm:偶爾讀取、可接受延遲(HDD)
- Cold:只為合規保存、幾乎不讀(Archive)
做法很單純:用不同 Bucket 對應不同層級。SSD 用在真正需要的地方,成本和效能都更容易預估。
Lifecycle Rule:清理不能靠人記
# uploads:90 天後自動刪除
mc ilm rule add myminio/uploads --expire-days 90
# logs:30 天後自動刪除
mc ilm rule add myminio/logs --expire-days 30
# temp:7 天就清掉
mc ilm rule add myminio/temp --expire-days 7我見過 /tmp bucket 一年沒清,佔了 200GB。設定 lifecycle 只要一行指令,不設定的代價是某天半夜被叫起來清磁碟。
權限:每個服務一組 credential
所有服務共用 root credential?那任何一個服務被打穿,攻擊者就能讀寫所有資料。
# 建立使用者
mc admin user add myminio api-user ApiSecretKey123
# 建立 policy(只能讀寫 uploads/)
mc admin policy create myminio uploads-rw uploads-policy.json
# 綁定
mc admin policy attach myminio uploads-rw --user api-userAPI 只能寫 uploads/、CI 只能寫 artifacts/、Backup script 可以讀全部但不能刪。最小權限不是信不信任的問題,是「出事時影響範圍有多大」的問題。
部署和基本操作
# docker-compose.yml
services:
minio:
image: minio/minio:latest
command: server /data --console-address :9001
restart: unless-stopped
ports:
- 9000:9000
- 9001:9001
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: ChangeMeToStrongPassword
volumes:
- minio-data:/data
volumes:
minio-data:# 設定 alias 然後建 bucket
mc alias set myminio http://minio.example.com:9000 minioadmin ChangeMeToStrongPassword
mc mb myminio/uploads
mc mb myminio/artifacts
mc mb myminio/logs
mc mb myminio/backups備份:mc mirror 是你的好朋友
mc alias set backup http://nas.internal:9000 backupuser BackupSecret
mc mirror myminio/backups backup/backups
# crontab 每天 04:00
# 0 4 * * * mc mirror --overwrite myminio/backups backup/backups本地備份每日、異地備份每週、還原演練每季。是的,你要真的跑過還原流程。很多人第一次還原是在真正出事的時候,然後發現備份檔是壞的。
儲存管理就像整理房間。你可以一直把東西往裡面塞,但總有一天你會發現門打不開——而且你需要的那個東西在最裡面。