存储这行,入门最难的不是命令怎么敲、文档怎么读,而是脑子里没有一个完整的地图。SSH命令创建存储池、对象存储、分布式存储、存储备份、存储压力测试……这些热搜词单个拎出来都容易理解,但拼在一起就懵了。这篇不聊碎知识,我用一次完整的内容梳理,把存储的核心概念串成一条线,从物理介质到文件系统再到分布式架构,一次打通。
不管你是刚转行做运维、写代码时被存储逼疯的后端开发,还是用NAS存照片想搞明白原理的玩家,这篇都适合。核心目标是:看完之后,你再看到存储相关的技术名词时,能知道它处在整个架构的哪一层、解决什么问题、和上下游是什么关系。
1. 一切存储的物理起点:从磁盘到SSD再到EEPROM
1.1 磁盘是怎么存储数据的:一个被误解的常识
很多教程讲磁盘存储,上来就给你画磁道扇区的图,看完就忘。我用一个生活化的方式讲明白:磁盘存储的本质是“磁化方向记录0和1”。
磁盘内部有一张涂了磁性材料的圆盘,读写头悬浮在盘片上,通过改变某个微小区域的磁场方向来表示数据。这个微小区域就是扇区,通常一个扇区512字节或4K字节。盘片转速越快(7200转、10000转、15000转),读写头能更快地到达目标位置,性能就越好。
但这里有一个关键认知:磁盘的“随机读写”性能其实很差。因为读写头要物理移动到目标磁道,这个动作叫“寻道”。寻道时间通常是几毫秒到十几毫秒,而SSD的寻址是电信号,微秒级别。这就是为什么数据库、虚拟化这类随机IO密集的业务,根本不敢用机械磁盘。
实操中选型有个经验值:顺序读写用机械盘完全够用,顺序写入吞吐可以跑满千兆甚至万兆网络;但一旦出现大量随机小文件读写,机械盘会断崖式下跌,IOPS可能只有几十到几百。SSD的IOPS随便就是几万,差距是几百倍。
1.2 从机械盘到SSD:FTL映射是SSD的灵魂
SSD存储数据的核心不是磁化方向,而是浮栅晶体管的电荷状态。向晶体管的浮栅注入电荷代表0,释放电荷代表1。这个原理看着简单,实际控制非常复杂,因为闪存的擦除是“块级”的,写入是“页级”的——你只能往空页里写数据,想改写旧数据必须先把整个块擦除。这个不对称特性催生了SSD内部最重要的机制:FTL(Flash Translation Layer,闪存转换层)。
FTL做的事情就是“地址映射”。操作系统以为自己在读写固定的逻辑地址,实际上FTL会把这些逻辑地址映射到物理闪存块的随机位置。写入新数据时,FTL找一个空闲块写入,然后把旧的块标记为无效,等块里无效数据够多了再整体擦除。这个过程叫垃圾回收。
我做存储压测的时候看过一组数据:无TRIM支持的SSD,用了一年之后写入性能下降40%以上,掉电保护做得差的甚至会出现写入放大指数级上升。这个TRIM是操作系统的通知机制,告诉SSD“这些逻辑页上的数据已经删了”,SSD才能在后台提前清理块。
这就是为什么选SSD一定要关注三个参数:耐久度(TBW,总写入字节数)、掉电保护(是否有钽电容)、主控方案(掉速控制能力)。便宜的SSD和贵的SSD,同样标称512GB,实际温度、稳定性和寿命可以差出好几倍。
1.3 EEPROM和eMMC:存储里容易被忽略的“小角色”
热搜词里有“eeprom存储器存储原理”,这个必须讲。EEPROM是“电可擦除可编程只读存储器”,特点是可以按字节擦写,掉电不丢数据。它和Flash的关键区别在于:EEPROM按字节操作,Flash按页操作。所以EEPROM通常用来存少量关键数据,比如MCU的配置参数、设备序列号、网卡MAC地址。
MCU日志存储也常用这类介质。我在实际做嵌入式项目时,EEPROM的写入寿命大约是百万次级别,比Flash的万次级别高很多,但容量很小,通常几KB到几MB。很多初学者以为可以用EEPROM当普通存储用,这是误区,它适合存“不频繁变动的关键数据”,日志这种高频写入场景应该用Flash或外部SD卡。
eMMC则是另一种形态,它是“Flash颗粒+主控”的封装,相当于一块迷你SSD,直接焊在主板上。NUC这类迷你主机的EMMC版本,还有大部分安卓手机的基本存储,用的就是eMMC。它和SSD的核心区别是接口和主控复杂度,eMMC走MMC协议,主控相对简单,顺序读性能还行,随机写性能和SSD差距明显。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从硬件到逻辑:文件系统、存储池与逻辑卷
2.1 文件系统到底干了什么事:用图书馆编目来理解
物理存储介质只能读写0和1,你直接往裸盘上写数据没有任何结构,所以需要文件系统。文件系统的本质是一个“编目系统”,维护一对核心映射:文件名到文件ID(inode),文件ID到数据块地址。
这个映射有点像图书馆的索引体系:你想找《三体》,先查书目卡片(文件名→inode),拿到书的位置编号(inode→数据块),然后去书架上拿。书架就是磁盘的数据区。
不同文件系统的差异,核心就在于这个“编目”方式不同。ext4用inode+位图,xfs用B+树,ZFS/Btrfs用写时复制(CoW)结构。写时复制的意思是:修改数据时不直接覆盖原始块,而是先写到新位置,然后更新指针。这样系统崩溃时不存在“写到一半”的中间状态,一致性天然有保障。
Windows用户关心的“系统默认存储在后台不好管理”这个问题,根源就在于系统盘文件系统碎片化严重,再加上用户目录映射混乱。所以我的建议是:装完系统的第一件事,就是把虚拟内存、浏览器缓存、软件安装目录、微信文件存储位置全部指定到非系统盘,这个问题我有专门的经验,后面在实操章节详说。
2.2 存储池与逻辑卷:“灵活分配”背后的核心思想
热搜词里有“ssh命令创建存储池”和“持久逻辑存储卷”,这是存储入门的一道分水岭:从“直接使用一块硬盘”到“把存储虚拟化成了池子”。
传统方式:一块硬盘就是一个分区,分区大小固定,不够用了只能加盘,没法在线扩容。存储池的思想完全不同——先把多块物理硬盘合并成一个大的逻辑空间(池),然后在这个池上按需创建卷。卷的大小可以随时调整,池里所有盘的性能和容量是共享的。
这种方式你可以在Linux LVM和ZFS里看到实际落地。用LVM创建存储池(卷组)的核心命令:
bash复制# 创建物理卷
pvcreate /dev/sdb /dev/sdc
# 创建卷组(存储池)
vgcreate vg_data /dev/sdb /dev/sdc
# 在池上创建逻辑卷
lvcreate -L 500G -n lv_mysql vg_data
# 扩容逻辑卷(池有余量时在线扩展)
lvextend -L +100G /dev/vg_data/lv_mysql
resize2fs /dev/vg_data/lv_mysql
这里的核心经验是:存储池的大小和你买的硬盘总量有关系,但卷的容量和物理空间是解耦的。池里要先有空间才能创建卷,扩容卷之前必须先确认池里有足够余量。
这正好解答了“win11进入设置中的存储后闪退”这类问题。Windows也有存储池功能,它把多块硬盘组合成存储池,然后创建“存储空间”。如果系统组件存储损坏(错误码14098、0x800f0954之类),会导致存储管理界面闪退,这种时候不能只修界面,要先修复组件存储:
bash复制# 以管理员身份运行
DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow
2.3 VSCode等应用的存储位置管理:一个日常必踩的坑
热搜词“vscode拓展更改存储位置”和“更改arcgispro存储位置”这类问题,根子上是同一个:系统盘不够用,应用又习惯把所有数据塞在C盘用户目录。
实际的存储路径逻辑是这样的:Windows系统默认把程序数据放在C:\Users\用户名\AppData下,VSCode扩展的默认位置是C:\Users\用户名\.vscode\extensions。当系统盘空间紧张时,可以做目录软链接迁移:
先关闭VSCode,把扩展目录移动到D盘:
bash复制# 移动扩展目录
move "C:\Users\用户名\.vscode\extensions" "D:\VSCodeData\extensions"
# 创建目录符号链接
mklink /J "C:\Users\用户名\.vscode\extensions" "D:\VSCodeData\extensions"
这里必须用mklink /J创建目录联接,而不是简单地剪切粘贴。原理是:VSCode在启动时会按固定路径查找扩展,通过符号链接让系统认为目录还在原处,实际数据已经写到新盘。用/J不要求管理员权限,且对应用程序完全透明。
浏览器缓存、微信文件、默认下载目录都能用同样的方法处理。这套操作做完,系统盘“存储虚高”(C盘已满但找不到大文件)的问题基本解决。
3. 三种主流存储形态:块存储、文件存储与对象存储
3.1 块存储、文件存储、对象存储的定义和区别
这是存储领域最核心的分类知识,也是面试必问题。我尽量用最简单的方式说透:
- 块存储:裸设备,没有文件系统,按固定大小的块读写。云硬盘、物理硬盘的RAID组、iSCSI都属于块存储。块存储适合数据库这类需要极低延迟、自己管理文件系统的场景。
- 文件存储:有文件系统和目录树,支持NFS、SMB/CIFS协议。NAS就是典型文件存储。适合共享文件、办公文档、媒体素材等场景,多个服务器同时挂载同一个目录。
- 对象存储:没有目录树,本质是一个扁平的“桶(Bucket)+对象(Object)”模型。对象有唯一的URL(键),通过HTTP协议访问。对象存本身是带了元数据的(自定义属性、标签等),所以查询和管理能力很强。适合存储海量非结构化数据,比如图片、视频、备份文件。
三者的性能特征是递进的:块存储延迟最低(微秒到亚毫秒级),文件存储中等(毫秒级),对象存储要看API设计,通常延迟比块存储高,但吞吐和并发能力极强。
3.2 对象存储与MinIO:搭建私有对象存储的关键步骤
热搜词里出现了不少对象存储相关内容(“对象存储服务”“minio分布式存储”“minio对象存储java上传配置”“麒麟v10 minio存储”“rustfs(s3)对象存储”),这是目前最流行的一种存储后端。对象存储的协议标准是AWS S3协议,几乎所有开源对象存储服务(MinIO、Ceph RGW、RustFS)都兼容S3。
MinIO是一个以极简部署出名的对象存储服务,单个二进制文件就能跑起来。我用它搭过测试环境,完整步骤:
bash复制# 下载MinIO服务端
wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
# 启动MinIO,数据目录为/data,控制台端口9001,API端口9000
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=your-strong-password
./minio server /data --console-address ":9001"
MinIO的架构核心是“大规模对象存储”,它把数据打散存储在多块磁盘上,靠纠删码保证数据可靠性。默认纠删码是EC4:2,即6块数据盘可以容忍2块盘同时故障,数据不丢失。
Java上传对象的标准写法:
java复制// 引入minio Java SDK后
MinioClient client = MinioClient.builder()
.endpoint("http://192.168.1.100:9000")
.credentials("admin", "your-strong-password")
.build();
// 检查桶是否存在,不存在则创建
boolean found = client.bucketExists(BucketExistsArgs.builder().bucket("my-bucket").build());
if (!found) {
client.makeBucket(MakeBucketArgs.builder().bucket("my-bucket").build());
}
// 上传文件
client.uploadObject(
UploadObjectArgs.builder()
.bucket("my-bucket")
.object("2025/report.pdf")
.filename("/tmp/report.pdf")
.build()
);
这里有一个关键理论:对象存储的“路径”并不是目录结构,而是对象的对象键(Object Key)。你可以用/模拟目录,但桶内部其实是扁平化的。这个设计是为了在分布式环境下避免目录树的元数据瓶颈。
“扣子生成文件存储方法”这类需求,本质上就是在业务系统里确认对象存储的路径规划(桶建立、对象前缀命名),以及权限控制(公私有桶设置、临时URL过期时间)。
3.3 NAS存储到底是什么:家庭和中小企业都绕不开它
NAS(Network Attached Storage)本质是一台“作为文件存储服务器的小型计算机”,提供NFS/SMB协议共享。热搜词“nas存储”太频繁了,我单独聊两句。
NAS的价值在于集中管理与设备直连的分散痛点。没NAS时,照片在手机里、资料在笔记本里、电影在台式机里,互相拷贝非常麻烦。有了NAS,所有设备通过局域网访问同一个文件池。
具体到“海康录像机设置老摄像头存储大文件大的话怎么弄”,这是典型的监控场景。监控摄像头默认用SD卡或前端硬盘存储,但需要集中管理时,会用NAS或NVR。NVR的存储原理是:录像机把若干块硬盘做RAID,然后通过SNMP或SDK把流媒体写入RAID卷。
家庭折腾NAS,我推荐优先考虑两个方向:开箱即用买成品(群晖、威联通),动手能力强用自组方案(UNAS、TrueNAS)。TrueNAS基于ZFS文件系统,自愈能力很强,但内存必须够,ZFS对内存消耗很大,ECC内存起步。
4. 分布式存储:从单机到多机协作的架构跃迁
4.1 为什么需要分布式存储?单机存储的天花板
单机存储的极限非常清楚:一台服务器的硬盘槽位有限、IO总线带宽有限、故障域是单点。数据库做不做分库分表,本质就是存储单机的容量和性能上限决定的。
分布式存储的核心目标有三个:扩展能力(加机器就能扩容)、可靠性(坏几台机器数据不丢)、性能(并发访问吞吐线性增长)。要实现这三个目标,最难的不是数据分片,而是“多机一致性”——不同机器上的副本如何保持一致。
4.2 Raft协议:分布式存储的“共识基石”
热搜词“基于raft的kv存储”引出了分布式存储最重要的一种元信息机制。分布式系统的CAP定理:一致性、可用性、分区容忍性三者只能取二。Raft协议是一种“复制状态机”的共识算法,保证集群在多副本场景下达成“写入被大多数节点确认才算成功”。
Raft把节点分成三类:Leader(领导者)、Follower(跟随者)、Candidate(候选者)。所有写请求必须经过Leader,Leader把日志复制到大多数Follower后才算提交成功。这个过程保证了哪怕少数节点挂了,数据也不丢。
我在测试小型KV存储组件时,用Raft实现的方案在3节点集群下,Master节点故障自动切换耗时通常在秒级甚至毫秒级。但Raft的性能天花板很明显:每次写入都涉及Leader同步给Follower,网络往返延迟被硬性地拉高。所以“基于Raft的KV存储”通常适合元数据管理这类低频写、必须高一致的场景,不适合大规模数据存储。
Ceph里的MON(监视器)用的就是类似的一致协议,负责维护集群的地图信息(谁在哪个盘上、哪些OSD在线),而真正的数据块写入则通过CRUSH算法计算位置,不需要额外查元数据服务器。
4.3 Ceph的核心架构:RADOS、CRUSH与OSD的关系
Ceph是开源分布式存储中一个绕不开的存在,它一个架构同时支持块存储(RBD)、文件存储(CephFS)、对象存储(RGW/S3)。架构核心是RADOS(可靠自主分布式对象存储)。
Ceph里有个常被误解的概念:对象存储(RGW)和底层RADOS的关系。RGW是S3协议的翻译层,把HTTP请求转为RADOS对象的读写;而RADOS本质是个自愈的对象存储系统,负责数据分片、副本维护、故障恢复。
CRUSH算法是Ceph不用查表的秘密。它可以基于集群拓扑(机架、主机、OSD)和数据X的Pg数,用哈希算出数据落在哪个OSD上。这样客户端可以直接和对应的OSD通信,不需要中心路由,性能损耗小。
我做Ceph扩容踩过一个坑:新增OSD后数据不会立即均衡,需要手动调整PG分布,并且要关注backfill过程对线上IO的影响。生产环境操作时,最好在低峰期调整,并且设置osd_max_backfills参数限制回填速率。
4.4 对象存储对比:MinIO、Ceph RGW、RustFS、腾讯云/阿里云OSS
实际选型时要考虑规模和运维成本:
| 维度 | MinIO | Ceph RGW | 云厂商OSS |
|---|---|---|---|
| 部署复杂度 | 低(单二进制) | 高(多组件) | 零部署 |
| 扩展上限 | 百TB~PB级别 | PB级别以上 | 无限(按量计费) |
| 数据安全机制 | 纠删码(EC) | 多副本/EC | 多副本+跨区域复制 |
| 典型适用场景 | 开发测试、中小规模生产 | 大型私有云、混合云 | 互联网海量数据、备案合规 |
“阿里云存储桶”这个词其实指的就是对象存储里的Bucket,云厂商的OOS本质上也是S3协议兼容服务。用的时候只需要管好Bucket权限策略(RAM策略/STS临时凭证),基本不需要关心底层故障。
“银河麒麟配置存储”和“紫光展锐存储”这类问题则偏国产化环境搭建:银河麒麟在配置NFS或者MinIO时和CentOS基本一致,主要注意内核版本的NFS客户端参数。
5. 从存储到系统:MySQL、消息队列与缓存存储细节
5.1 MySQL存储整数的那点事:数据类型决定存储大小
热搜词“mysql可以存储整数数值的是”问得比较基础,但踩坑的人不在少数:TINYINT占1字节,SMALLINT占2字节,MEDIUMINT占3字节,INT占4字节,BIGINT占8字节。很多人创建表时一律用INT,这会导致索引膨胀和内存浪费。
一个千万级别的表,一个字段用BIGINT而不用INT,数据行占用空间增加4字节,索引树高度可能上升一层,查询性能会有可感知的下降。实际生产经验:能用SMALLINT就不要用INT,能用INT就不要用BIGINT,这是分库分表之前最廉价的优化手段。
5.2 Celery结果存储后端的选择与配置
热搜词“celery 结果存储后端”也是一个被忽视的存储选型问题。Celery是Python的分布式任务队列,任务执行结果需要持久化到某个后端:Redis、RabbitMQ或数据库。
Celery的结果后端配置:
python复制# config.py
CELERY_RESULT_BACKEND = 'redis://192.168.1.10:6379/2'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['json']
这里的存储考虑有两层:第一,结果数据通常有TTL,Redis的过期机制非常适合;第二,结果数据一般不会很大,Redis存JSON序列化后的字符串完全够用。但如果任务结果被大量读取做后续分析,就应该用数据库或对象存储而不是Redis,否则Redis内存会飙高。
5.3 MCU日志存储和结构体的链式存储:嵌入式场景的存储选择
“mcu日志存储”是嵌入式里的经典问题:Flash存储日志,擦写次数有限(约1万~10万次),如果固件一直往固定地址写日志,几年就会把Flash磨穿。合理做法是环形日志区,均匀磨损整块Flash,或使用Flash磨损均衡算法,把日志分散写到不同page/block。
“结构体的链式存储”则是数据结构的基础:链表、二叉树在内存中的存储方式是用指针串联节点,每个节点除了数据区还有指针域。在实际存储到文件或数据库时,需要把这个链式结构序列化成平坦结构,否则无法直接落盘。这是C/C++程序员面试必考,也是嵌入式领域持久化配置信息的核心思路。
6. 存储备份、压力测试与全链路验证
6.1 存储备份的本质:一份数据要多存放在不同故障域
存储备份的核心不是“拷一份文件”,而是要理解三个概念:备份、快照、容灾。
- 备份:周期性把数据复制到其他介质或地理位置,解决“误删除、逻辑损坏”问题。
- 快照:某个时间点的只读副本,解决“操作失误后需要快速回退”的问题。快照有COW(写时复制)和ROW(重定向写)两种实现,COW性能损耗更低。
- 容灾:跨地域/跨数据中心的实时数据复制,解决“整个机房断电、火灾”这类极端故障。
实操原则“3-2-1备份策略”:至少3份副本,2种不同介质,1份存放在异地。
6.2 怎么测试存储性能?存储压力测试的核心指标与工具
“存储压力测试”这个词常出现在App开发中,指的是对App内部存储执行写测试。但广义上,存储压测是验证一套存储系统能不能扛住生产负载的关键手段。
最常见的压测场景是对“App内部存储,执行写测试”。举例:Android应用经常要批量写日志、写图片、写数据库,如果存储目录满了,或文件系统锁竞争严重,写性能会急剧下降。
三大核心指标:
- IOPS(每秒IO次数):随机小IO场景的关键指标,数据库负载核心看这个。
- 吞吐量(MB/s):顺序大IO场景的关键指标,视频、日志、备份负载看这个。
- 延迟(P99/P99.9):真实用户体验的关键指标,P99超500毫秒用户就会明显感觉卡顿。
Linux上用fio做压测是最常见的。反向测试过了,我再强调练习:
bash复制# 随机写测试(4K块,队列深度32,持续60秒)
fio --name=randwrite-test --ioengine=libaio --rw=randwrite --bs=4k \
--numjobs=1 --iodepth=32 --size=1G --runtime=60s \
--directory=/mnt/test --group_reporting
# 顺序读测试(1M块,队列深度16)
fio --name=seqread-test --ioengine=libaio --rw=read --bs=1M \
--numjobs=1 --iodepth=16 --size=2G --runtime=60s \
--directory=/mnt/test --group_reporting
压测的时候有几个容易忽略的点:先确认压测目录的文件系统余量够大(fio写的文件会占用真实空间);测试前用sync和drop_caches清一下内核缓存,否则测试结果不真实;压测时间不要低于60秒,因为SSD的SLC Cache会先爆发一段高速然后掉速,短期测试会高估性能。
6.3 常见存储故障速查表:从组件损坏到存储位置不可用
我做存储这行最常遇到的问题是“表面上是软件故障,根子其实是存储概念没理顺”。这里整理一张速查表:
| 故障现象 | 根本原因 | 处理思路 |
|---|---|---|
| Windows组件存储损坏(14098) | 系统更新包或系统文件被破坏 | DISM /RestoreHealth + sfc /scannow,必要时用官方ISO修复 |
| 存储位置无法使用,不能正常使用微信 | 默认存储路径被改动,或磁盘脱机/权限异常 | 检查磁盘状态、恢复默认路径,重置权限 |
| win11设置存储闪退 | 系统组件或注册表异常 | 先修组件存储,再看存储空间的磁盘是否异常 |
| C盘存储虚高,找不到大文件 | 应用缓存、休眠文件、虚拟内存占用 | 目录软链接迁移 + 清理休眠文件 + 转移虚拟内存 |
这里特别提一下“存储感知有必要开吗”。存储感知是Windows的自动清理功能,它会定期清理临时文件、回收站、下载文件夹里的过期内容。我是建议开的,但要设置好清理范围,尤其是不要把下载文件夹纳入自动清理目录,否则重要文件会被自动删掉。
7. 实操总结:搭建一个理解存储全貌的实验环境
7.1 用一台Linux服务器同时体验块、文件、对象三种存储
如果你真的想建立对存储的完整理解,最有效的方法是自己动手搭一个小实验环境。我建议用一台最少4GB内存的Linux虚拟机或物理机,同时完成下面三件事:
第一,用LVM创建物理卷、卷组、逻辑卷,格式化后挂载,体验“存储池”的灵活扩展;
第二,在文件系统层面创建NFS或SMB共享,从其他机器访问,体验“文件存储”的多机共享;
第三,部署MinIO,通过S3客户端上传下载对象,体验“对象存储”的API访问模式。
这三步走完,三种存储形态的差异就会变成肌肉记忆,而不是死记硬背。
7.2 监控存储状态的三个必备命令
运维类场景我补充三个几乎每天都在用的命令:
bash复制# 查看文件系统空间和inode使用率(inode满也会导致无法写入)
df -h /
df -i /
# 查看IO延迟和利用率(%util长期超过80%要警惕)
iostat -x 1
# 查看块设备信息(确认设备名称、容量和挂载点)
lsblk
这些命令的输出里,最容易被忽略的是inode。很多人碰到“No space left on device”第一反应是磁盘满,但有时候是inode耗尽。inode管理文件的名字和元数据,如果小文件特别多,inode会被占满,哪怕磁盘还有空间也写不进新文件。
7.3 给新手的几条存储实践建议
最后从我个人的经验角度,给刚入门存储这块的朋友几个建议:
第一,存储选型永远先问四个问题:容量多大?性能多高?数据多重要?访问模式是随机还是顺序?这四个问题的答案基本决定了技术选型方向。
第二,不要盲目追求高性能方案。家用或者中小企业的并发量没那么大,用对象存储+SSD缓存就能解决绝大部分问题,没必要一上来就上Ceph全家桶。我见过不少因为Ceph运维复杂度太高而回退到单机存储的案例。
第三,备份要早做,恢复演练更要早做。存储故障可以分两种:一种是硬件坏了,一种是逻辑错误(删错、改错、被黑)。硬件故障还好,重建时间可控;逻辑错误才是最可怕的,没有可靠的备份,数据就是永久丢失。备份不演练等于没备份,这个道理我踩过亏才真正理解。
第四,学习存储时要多动手看现象。读一百篇理论文章,不如自己用dd写一次磁盘、用fio压一次IO、用Raft协议跑一次集群故障切换。存储是个实践性极强的领域,数据和状态都有“物理真实感”,只有亲手操作过才能真正吃透那些抽象概念。
