ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

云存储选型太难?一次搞懂块存储、文件存储与磁带归档的差异

云存储选型太难?一次搞懂块存储、文件存储与磁带归档的差异 你手上有一块云硬盘同事说要搞文件共享老板又说冷数据备份到磁带库里一堆术语砸过来什么 File、Volume、Tape、S3、S3 Glacier第一次接触的人很容易直接懵掉。这篇文章就想把这几个东西一次性讲透从底层存储形态、访问协议、适用场景到成本模型全部用大实话过一遍顺带把 S3 和 S3 Glacier 这对最容易混的“兄弟”掰开揉碎。看完你大概就能自己判断数据库上哪个、容器挂哪个、归档扔哪儿不用再到处问人。1. 先搞清楚这三个单词的本质Volume是块File是文件Tape是磁带很多人一开始就搞混这三者的原因是因为它们表面听上去都像“存储”买云服务的时候也都能在控制台上看到。但它们的物理形态和访问方式完全不同用一句话先总结Volume 是操作系统眼里的一块虚拟硬盘File 是网络上的共享文件夹Tape 是一卷线性写入的磁带。1.1 Volume一块被远程“塞”给操作系统的裸盘Volume 本质上是块存储也就是云厂商常说的云硬盘、云盘AWS 里叫 EBS阿里云叫 ESSD/云盘。它通过 iSCSI、NVMe over Fabric 这类协议把远程的一块存储空间直接呈现成操作系统里的块设备也就是你看到的 /dev/vdb、/dev/sdb 这种东西。操作系统拿到之后还要自己分区、自己格式化、自己建文件系统才能往里放文件。这个过程跟早期你买一块物理硬盘插到电脑上没什么区别。关键点在于操作系统控制块设备块设备不关心文件、目录、权限它只记录“第几块扇区写了什么数据”。我经常用一个类比Volume 像一块标准的建筑砖头砖头本身不带任何结构你拿回去要不要加工、加工成什么形状全是你自己的事。操作系统在上面格式化 NTFS、ext4、xfs等于把这堆砖头砌成了自己的墙。它最大的特点就是性能好、延迟低因为数据按块随机读写不需要经过文件层转换。数据库MySQL、PostgreSQL、Oracle这种对随机 IO 极其敏感的业务跑在块存储上是对的。但也正因为它是“裸砖”的语义块存储基本没法多个主机同时挂在一个盘上做并行读写除非你上集群文件系统或者共享块设备方案那已经不是普通场景了。1.2 File带目录树、权限和锁的共享文件夹File 存储也就是文件存储你要么看到的是 NFS主要给 Linux/Unix 用共享点要么是 SMB/CIFS主要给 Windows 用共享点。云厂商提供的文件存储 NAS 服务就是在底层块存储之上再帮你搭好了一层文件系统语义有目录、有文件名、有权限、文件锁也有 size 和 mtime 这些元数据。它的本质是把“一个文件系统”以网络协议的形式暴露给很多台机器同时挂载使用。所以 File 存储的核心价值不是单机性能而是“多机共享”和“目录结构管理”。还是用建筑打比方File 已经不是一个裸砖头了它是一整个由物业统一管理的档案柜柜子分了几层、每层贴了标签、每份档案谁能看谁不能看都是提前配好的。多台机器同时连到这个档案柜上各自查阅各自的文件这才是它的日常形态。常见的挂载方式Linuxmount -t nfs -o vers4.1 文件存储地址 /mnt/nasWindows映射网络驱动器或者使用 net use容器环境里作为 PVPersistentVolume挂到多个 Pod 上实现 Pod 之间共享目录需要留意的是文件存储的读写性能受网络协议栈影响跟本地块设备的延迟不可同日而语。它更多承担“共享、协同、结构化管理”这类任务而不是扛极高 IOPS 的压力。我们知道一台数据库服务器后面的数据文件肯定优先考虑块存储而不是把它扔到 NFS 上硬扛。1.3 Tape顺序读写的归档卷Tape 就是磁带介质这套东西各种人叫法不一有的叫磁带库、有的叫带库硬件叫 Tape Library。即使在云时代Tape 也没死它摇身一变成了 S3 里的 Glacier Flexible Retrieval / Deep Archive只不过底层从物理磁带变成了对象存储的服务化归档层。磁带的物理特性非常特殊它是一条长带子磁头按顺序读写。写数据的时候基本只能往后接着写如果要从一盘磁带中间找一条数据那得从头把带子卷到你想要的位置这个“寻道”过程非常慢而且顺序访问决定了它不适合随机小文件读取。但磁带的优点也极其突出单位存储成本极低、磁带可以离线存放、防勒索病毒效果好离线隔离并且可以采用 WORM一次写入多次读出模式满足合规审计保留。所以现实中大量的冷数据备份、监管归档、医学影像长期保存、抗勒索隔离副本走的还是磁带思路无论你看到的是物理 Tape 库还是云上的归档存储。类比一下Volume 是你办公桌上的固态硬盘File 是公司走廊里的公共文件柜Tape 就是郊区那个几个月才去一次的档案仓库里面每箱货都按顺序摆好平时不取真到要命的时候比如硬盘全被加密、公司数据被勒索锁死仓库里的东西才是最后翻盘的底牌。1.4 一张表把三者区隔开网上喜欢列一堆“文件存储和块存储的区别”其实看这张表就够直观维度Volume块存储File文件存储Tape磁带/归档数据组织单位数据块文件、目录按顺序的数据流访问协议iSCSI、NVMe over FabricNFS、SMB/CIFS物理库/归档服务 API读写特征随机读写低延迟随机读写中高延迟顺序读写极高延迟共享能力一般不支持多写者支持多机共享本身不面向共享访问典型用途数据库、操作系统盘协作共享、容器 PV、备份中转冷备、合规归档、容灾副本2. 三个存储层级要怎么配合使用而不是二选一很多时候你缺的不是某一类存储而是整套“热、温、冷”分层体系。真正有经验的人不会拿一个 S3 标准存储把所有数据全塞进去也不会给数据库硬挂一个 NFS 共享目录。正确做法是先明确每种数据“有多热”再分配对应的存储形态。2.1 为什么数据库优先选 Volume数据库引擎底层会直接对数据文件执行 fsync、pread、pwrite 这类操作数据库内核假设你给它的是一个可以按块随机访问的块设备。如果做存储选型数据库数据文件直接落在 Volume 上走本地文件系统这是最常见的做法。块存储有个隐藏优点对数据库完全透明数据库可以自己决定数据页大小、日志写入顺序包括双写、并行查询这些机制。数据库层面你不需要关心底层块存储怎么分区它只管自己能按扇区写数据就行。如果在数据库这种高强度随机 IO 场景强行用文件存储会发生两个问题每次读写都走网络文件系统协议协议本身要维护锁和状态性能损耗非常明显NFS/SMB 对文件锁、缓存一致性的处理在紧急故障时可能出现延迟、竞争数据库高并发下容易出现等待和超时。所以我通常建议核心数据库、消息队列Kafka、RabbitMQ、分布式缓存这类对延迟极其敏感的服务一个节点挂一块专属 Volume能不上共享就别上共享。2.2 文件共享适合多人协作和容器横向扩容但当你有几十个 Pod 或几十台应用服务器它们要读写同一个目录比如上传目录、附件目录、配置目录、日志聚合目录这时候再用“每个节点一块自己的盘”就不行了因为数据无法互通。File 存储才是正解。容器场景里比较典型的是应用有多副本用户上传的头像、附件需要所有副本都能访问。如果数据写在某一台 Pod 本地盘上负载均衡把请求打到另一个 Pod 就看不到文件。挂一个 NFS 类型的 PV所有 Pod 指向同一个共享目录问题直接解决。文件存储另一个很实用的场景是“中间态数据交换”数据分析处理流程里模块 A 生成的结果文件模块 B 马上要读。你不用再通过消息队列传递大文件直接落到共享目录两边约定好文件名就行。这种轻量级数据管道非常适合文件存储。2.3 磁带或归档存储不是用来“访问”的是用来“兜底”的这里必须强调一句很多人误以为归档存储是“把不常用的文件放到那里偶尔还能访问一下”。实际上 Tape / Glacier 这类归档层设计目标就是“平时别碰”真要取回数据要么排队等几个小时要么按量付费快速取回。它的兜底价值体现在三层容灾兜底生产 Volume 被误删、被勒索加密、机房故障归档层还留着一份最近一次的备份合规兜底金融、司法、医疗领域的保留策略要求数据几年内不可篡改Tape 或者归档存储的 WORM/Object Lock 功能就是干这个的成本兜底动辄几十 TB、几百 TB 的冷数据如果全放标准存储每个月光存储费就足以烧掉项目预算归档层能把成本压到零头。所以你在设计架构的时候不要总问“用 File 还是用 Tape”而要问“这份数据在整个生命周期里分别适合待在哪个层级”。3. S3 和 S3 Glacier 的核心差异热数据的“门面”和冷数据的“仓库”接下来说说最容易让人摩拳擦掌的部分S3 和 S3 Glacier 到底有什么区别。名字里都有 S3很多人以为 Glacier 只是 S3 的一个“更便宜的版本”这么理解大方向没错但它们实际是同一套对象存储底座上的不同存储级别而且行为差异非常大。S3Standard是对象存储的“门面”面向高频访问、毫秒级响应的数据。S3 Glacier 则是一组专门为归档设计的低成本存储级别其中还细分了 Instant Retrieval、Flexible Retrieval、Deep Archive 三种取回模式。3.1 S3 标准存储的定位对象世界的“主力部队”先明确标准 S3 是什么它是一个对象存储服务每个数据以“对象”为单位存在 Bucket 里。对象本身没有目录层级你看到的 key 里带 / 只是名字的一部分。标准 S3 的设计目标就是“热数据的高可用、高持久性”数据自动多副本冗余标准情况下 99.999999999% 持久性毫秒级 GET/PUT 延迟无限容量支持版本控制、跨区域复制、加密、生命周期策略等各种花活。我用得最多的场景用户上传的图片、音视频先落到 S3通过 CDN 分发大数据分析中间结果、数仓导出文件日志归档前的临时落地云盘快照导出中转。标准 S3 不是不能放冷数据而是“放得起但不是最优解”。比方说一批三个月前的订单导出文件每天根本没人读放标准 S3 里一个 G 的价格约 0.023 美元/月参考价格随时间变化100TB 一个月就是 2300 美元这个开销多数项目根本不能接受。3.2 S3 Glacier 的真实身份一个“服务化磁带库”S3 Glacier 这个名字下面的存储级别本质上是解决“冷数据便宜存储”这个诉求的。它通常作为 S3 生命周期策略的目标层存在不需要你显式地开通什么新服务你在 S3 控制台配一条规则数据自动就会沉到 Glacier 级别。Glacier 家族现在主要分三档名字版本不同可能叫法稍有差异但逻辑一致存储级别取回时间价格段适合的数据Glacier Instant Retrieval毫秒级中低半年到一年才读一次的冷数据但偶尔要立刻读Glacier Flexible Retrieval几分钟到 12 小时批量取回模式很低真正意义上的归档如备份、审计日志Glacier Deep Archive默认 12 小时内最长约 48 小时最低多年不碰的合规数据、灾备冷副本这里最反直觉的是取回时间不是“点了按钮马上就有”Flexible Retrieval 和 Deep Archive 取回是异步的你得先去创建取回任务Retrieval Request / Job系统把数据从归档介质还原到 S3 标准层或者重新组合成可下载的文件这个过程按级别不同等待十几分钟、几个小时甚至一天一夜都是正常的。有朋友第一次碰 Glacier以为它跟 S3 标准一样还能用 API 直接读某个对象内容结果发现要先发起 job等了 4 个小时才拿到文件直接怀疑人生。这就是没搞懂它本质是个“磁带仓库”的体验。3.3 三大核心差异成本、延迟、数据管理方式S3 和 S3 Glacier 的差异可以收敛成三点你把这三点吃透了就再也不会混了。第一是成本模型。S3 标准存储价格高但存费之外几乎无附加费取回快。Glacier 存费便宜但它有两个容易忽略的收费点取回费按取回数据量收取取回越快越贵和最短计费周期Flexible Retrieval 最短存 90 天Deep Archive 最短存 180 天如果你提前删除或转换没满最短周期也会收满整个周期的钱。第二是访问模式。S3 标准是同步、毫秒级、随机访问Glacier 是异步、分钟到小时级、批处理访问。也就是说S3 可以当作主存储支撑线上业务Glacier 只能支撑“线下恢复”流程。第三是生命周期的配合。S3 里可以直接配生命周期规则标准放 30 天30 天后自动转低频S3 Infrequent Access90 天后转 Glacier Flexible365 天后转 Deep Archive。这种自动化分层才是对象存储的真正威力所在。有人可能会问既然 Glacier 取回这么麻烦我还不如自己把数据打包传到 S3 标准呢。但算一笔账就清楚了假设你有 500TB 的监控录像归档要求保存 3 年。放标准 S3 的话一个月存储费就要 1 万多美元三年下来光存储费让你直接破产。放 Deep Archive 一个月可能只需要几百美元。为了数据的“几乎不可访问”省下了 95% 的成本这是非常划算的交易。4. 对象存储生命周期不是所有数据都该“一成不变”S3 和 Glacier 的关系靠生命周期规则串起来。很多新手会把所有文件一股脑都丢到 S3 标准然后人工每天写脚本去转移数据这完全是脱裤子放屁。S3 自带的生命周期机制就是帮你自动处理数据热度下降这件事。4.1 一条生命周期规则搞定热到冷我在项目里配置生命周期规则通常是按“数据年龄 是否需要频繁访问”来设策略的。举例{ Rules: [ { Id: move-to-glacier-and-deep-archive, Filter: {Prefix: /production/backups/}, Status: Enabled, Transitions: [ {Days: 30, StorageClass: STANDARD_IA}, {Days: 90, StorageClass: GLACIER}, {Days: 365, StorageClass: DEEP_ARCHIVE} ], Expiration: { Days: 1460, ExpiredObjectDeleteMarker: true } } ] }这条规则的含义是/production/backups/前缀下的对象第 30 天转为低频访问层第 90 天转为 Glacier Flexible Retrieval第 365 天转为 Glacier Deep Archive第 1460 天也就是 4 年直接删除。你可能会说我根本不知道这些“第几天”怎么定。这里有一个经验原则规则设置的核心依据是“数据被访问的概率曲线”。新生成的数据大概率前 30 天会被查、被下载30 天后热度直线下降90 天后基本无人问津一年后可能再也不会碰。你可以根据自己的业务日志、报表使用频次反推这几个节点不要拍脑袋。为什么要把天数分开而不是直接一步到位转到 Glacier因为中间如果真的有人要取一个 45 天的旧备份它刚转 IA 层取回速度还是很快的如果直接扔到 Glacier那每找回一次都要等小时级代价太大。渐进式降温是风险和成本之间最平衡的做法。4.2 手工拷贝还是策略迁移我踩过的坑早期我试过不用生命周期规则自己写脚本遍历 bucket 再调用 CopyObject 把存储级别改掉结果出了两个问题脚本要处理海量对象一个一个请求去打API 调用次数极多请求费比省下的存储费还贵遍历大量小文件时经常触发限流半夜睡一半被报警短信吵醒。后来彻底改成生命周期规则之后整个人都舒服了。规则是服务端执行的不需要你租一台脚本机 7x24 小时跑也不受客户端断网影响。唯一要留意的是配置生命周期时需要考虑规则生效延迟S3 并不是在第 30 天那一秒准点转移可能会延迟数小时到一天不等判断规则有没有跑通不要只看时间点要看 StorageClass 实际变化。4.3 别只盯着存储费请求费和最少存储周期更阴险选冷存储时很多文章只给你看“每 GB 多少钱”真正会吃钱的地方往往是取回费、请求费、最短计费周期这三个。举一个常见例子你有一批业务日志每个小文件只有 10KB每天几百万个。你为了省存储费把它们转到 Glacier。结果后来审计要查三个月前某一天的日志你把那一批几万个文件一次性取回Deep Archive 的取回价格虽然不高但你按“对象个数”计费几万个小对象累积下来的取回费可能比你存两个月省下的钱还多。这种场景的正确做法是归档前先把日志按天合并压缩变成大的 tar/parquet 文件减少对象数量。这也是为什么我前面要强调“对象粒度”的设计——Glacier 不是不能放小文件而是小文件的成本结构非常不划算。最短计费周期也是一个重灾区。Glacier Flexible Retrieval 的最短存储时长是 90 天Deep Archive 是 180 天。如果你今天上传明天发现传错了删除费用照样按 90/180 天算。所以归档层里做的临时试用、快速切换都是成本黑洞。5. 生产中到底怎么选从真实部署场景反推方案讲完底层原理我们落到实际选型。我不会给你一个万能答案因为每个业务的数据热度不一样。但我可以给你几个真实判断路径你会更容易对号入座5.1 数据库、Redis、容器本地盘毫无争议选 Volume如果你的场景是跑 MySQL、PostgreSQL、Elasticsearch、ClickHouse 这类有状态服务对延迟要求高随机 IO 密度大数据需要独立于容器生命周期保存使用云主机时需要系统盘和数据盘分离。那答案就是 Volume。以容器平台为例给工作负载挂载块存储不留底选 local volume 或云厂商块存储 PVC 都行。关键点一个 Volume 只能被一个 Pod 使用ReadWriteOnce如果要求多个节点共享同一份数据那它就不该是块存储了。实际操作时还要注意一个小坑Volume 虽然底层是云厂商的分布式存储但对于操作系统来说它表现得像本地盘所以很多人在上面建了 ext4 文件系统结果把 inode 耗尽了才发现。这里经验是给数据库类的 Volume 提 IOPS 要看清卷类型是否支持创建时预留 inode 数量如果文件数特别多格式化时要把 inode 比例调大否则在使用率 60% 的时候就写不进文件了。5.2 多副本共享、企业 NAS、容器共享目录选 File判断场景多台服务器要同时读写同一批文件尤其是上传目录、附件目录、静态资源共享目录企业内部用户需要挂载一个共享盘Windows 和 Linux 还要互通Kubernetes 里多个 Pod 需要读写同一个目录使用 Git 仓库、AI 训练数据共享、视频渲染素材库这类场景。这时候用 File 存储没有任何问题。挂载方式一般有两种一是直接用 NFS/SMB 协议挂到虚机上二是在 K8s 里通过 CSI 驱动创建 NFS 类型的 PV。但 File 存储也有两个隐蔽坑NFS 的锁语义和本地锁不完全一致多个进程同时写同一个文件时可能覆盖所以设计业务时要避免“多写者争写一个文件”的写法文件存储一般有文件数限制和单目录性能上限量级上来之后需要按照业务前缀拆多个挂载点不能一根筋全放同一个共享目录。如果你只是需要一个“大文件夹”建议选文件存储如果这个文件夹要支撑每秒几万次的小文件读写那优先考虑改造业务逻辑把这个存储换成对象存储或者数据库而不是硬扛文件共享。5.3 冷备、合规保留、容灾副本选 Glacier / 磁带类归档场景数据库和应用的每日备份需要保留 180 天以上且极少访问监管要求财务凭证、日志保留 5-10 年不可篡改需要一个副本放在和主存储完全独立的位置应对勒索病毒监控录像、财务影像、病历影像这类超大容量的冷数据。这种场景最合适的就是 S3 Glacier 家族或者如果是本地机房环境可以考虑物理带库。选择 Glacier 哪个层级主要看你预期的取回频率一年偶尔读一次、取回时能等 1-2 天Deep Archive最省钱三个月到半年读一次、取回时能等几小时Flexible Retrieval虽然冷但随时可能要秒级取出那就别用 Glacier用 S3 Infrequent Access 或者 Glacier Instant Retrieval价格比标准便宜一点取回仍是毫秒级。我在生产环境里做得最多的“铁三角”备份链路是这样的数据库每天自动备份到本地 Volume 上的一块备份目录备份文件通过脚本加密上传到 S3 标准桶临时中转生命周期规则将它 30 天后转 Glacier180 天后转 Deep Archive同时开启版本控制和跨区域复制。这套链路的好处是日常几乎不产生额外人力成本所有流程自动化真出问题时最快能拿到 30 天内的热备份最老能回溯到多年前的归档副本。而且因为 S3 和 Glacier 是同一个服务里的不同层级整个链路不需要在不同产品之间来回导数据省了很多事。5.4 从热搜词里看到的典型故障顺便说一句你在搜索框里输入 File、Volume、Tape 相关词汇时蹦出来的不少问题是这样的Docker 报错 invalid mode: /app/node_modules、提示 No such file or directory、备份文件报错 could not find file / cannot open source file。本质上这些都是“存储层次和路径语义没对齐”导致的问题。比如 Docker 挂载目录时报 invalid mode十有八九是挂载源路径里带了 Windows 盘符和冒号Docker 无法解析这种格式。这种情况你应该用相对路径或者反斜杠改写而不是去操作系统层面翻找问题。再比如容器里提示 No such file or directory很多时候不是文件真的不存在而是容器里缺少动态链接器或者程序被编译时依赖的共享库常见于静态编译和动态编译混用。解决办法是检查 ldd 输出把缺失的 .so 文件一并打包进镜像这跟存储选型无关但会让你在排查时少走弯路。6. 我的个人实操心得把所有数据按“热度”重新分了层这篇文章写到这儿核心区别已经讲完了。最后说说我自己的习惯。以前负责一个数据量很大的业务系统最开始所有备份都塞标准存储每月账单贵得吓人。后来我花了一个下午把全部数据按热度重新分类做了一次彻底的分层整理员工都说原来那些“看不见但是一直在烧钱”的数据终于不是无底洞了。我的心得是热数据7 天内访问频繁S3 标准或本地 Volume怎么方便怎么存温数据一个月到三个月内可能访问S3 Infrequent Access 或本地文件存储成本比标准低不少冷数据半年后才可能碰一次Glacier Flexible Retrieval能等几小时找回永久归档几年才碰一次Deep Archive或者 Tape 物理带库取回时间以小时甚至天计算也无所谓。如果团队里有人分不清 S3 和 Glacier我会让他们只记一个口诀S3 是能立刻取文件的储物柜Glacier 是让你写个申请单等着仓库管理员从货架上搬货的档案库。几千层货架的仓库很便宜但你不会指着它做日常高频取件。最后再补充一个容易被忽略的操作细节不管选 File、Volume 还是 Glacier生产环境中一定要开好监控。重点看存储使用率、对象数量、生命周期转换次数、取回请求量这几项指标。我见过一次事故就是因为没人注意到 Glacier 取回请求被刷爆一天之内产生了比存储费贵几倍的取回费账单。冷数据存储不是一锤子买卖配好规则后至少每个月翻一眼账单和指标心里就有数了。这四种存储不是互相替代的关系而是数据不同生命阶段该去的不同位置。把热、温、冷三个梯队排好存储成本自然会回到一个让你睡得着觉的水平。
返回列表