分布式存储这个词,在招聘JD里出现得比在业务代码里多得多,但真正到了数据量涨起来那一刻,你会发现它是所有数据平台绕不开的底座。我帮不少业务团队做过存储方案评审,印象很深的一次是某跨平台系统日志分析改造:单机存储扛不住每天几TB的新增日志,查询慢、备份难、扩容要停机,前后折腾了快两个月才切到分布式存储,才把问题彻底解决。这类故事其实特别常见。所以这篇东西不聊虚的,就从分布式存储在大数据场景里的三个典型应用出发——离线日志分析、数据湖、在线特征存储——说说每个场景怎么选型、怎么设计、会踩什么坑。
在往下拆案例之前,得先把几个共性的问题讲明白,否则后面聊选型和技术细节,容易看不太懂。很多人对分布式存储的第一印象是“把数据分散到多台机器上”,这句话没错,但真正落地的时候,为什么分散、怎么分散、分散之后如何保证不丢不错,才是核心。
1.1 单机存储的天花板:容量、吞吐、可靠性
先说容量。单块硬盘现在能做到20TB左右,听着不小,但对大数据系统来说根本不够看。一个每天新增100GB日志的业务,光靠单机存储,200天就能把一个20TB的盘写满。更麻烦的是单台服务器能挂的盘位和总线带宽是有上限的,不是你想加几块就能加几块。等磁盘满了再去清理、迁移,业务往往已经被堵了很久。
再说吞吐。分析任务最怕的是全表扫描,几百GB甚至几个TB的数据要逐个读出来做统计,单块磁盘的顺序读速度也就200MB/s上下,随机读更差。一个扫描任务在单机上跑十几小时,第二天早上报表出不来,这是很现实的痛点。分布式存储把数据打散到几十台节点的磁盘上,读任务可以并行,吞吐基本能随节点数量线性往上扩,这个能力单机给不了。
最后是可靠性。很多人觉得服务器磁盘没那么容易坏,但一个几十台节点的集群,一年下来坏几块盘很正常。单机模式下磁盘坏了,数据就是没了,最多靠RAID保护一下。但RAID重建时间随磁盘容量增长越来越长,一块12TB盘在RAID5阵列里坏了,重建可能要二十几个小时,期间再坏一块盘,整个阵列的数据就全没了。分布式存储的做法是存多份副本,哪个节点坏了,系统自动把数据复制到新节点,理论上不会因为单块磁盘故障丢掉业务数据。严格说分布式并不能解决所有可靠性问题,软件故障、误删、机房级别灾难依然可能丢数据,但物理磁盘故障这一层,算是被它彻底兜住了。
1.2 分布式存储的共同骨架:元数据分离、副本与一致性
不同分布式存储长相差异很大,但骨架基本一致。
第一,元数据与数据分离。所谓元数据,就是“文件叫什么、分成几块、每块在哪台机器”这类信息;数据本身则真正落在每台机器的磁盘上。把两者分开的好处是,数据节点可以随意扩充,元数据服务统一管理全局视图。代价也很明显:一旦元数据服务出问题,整个集群就不可用。所以元数据节点一定要做高可用,不能单点。
第二,副本机制。几乎所有分布式存储都会写多份副本,比如默认三副本。副本不只是为了“坏了有备份”,读任务还可以从多个副本并行读,相当于把吞吐也放大了。副本放在哪些节点上有讲究,常见的做法是机架感知——把不同副本放到不同机架,这样单个机架断电或者交换机故障时,数据依然有存活副本。
第三,一致性取舍。有些系统追求强一致,写完之后立刻读,所有副本必须同步;有些则允许短暂的不一致窗口。大数据场景里没有绝对好坏,一切看业务需求。文件流式写入的场景能接受最终一致,在线交易场景则必须强一致。选型之前一定要先想清楚这个维度,否则上线后改起来非常痛苦。
1.3 三大主流路线:文件系统、对象存储、分布式KV
分布式存储并不是一个东西,而是三条路线,解决的问题完全不一样。我习惯用一张表来帮团队快速对号入座:
| 存储类型 | 代表形态 | 数据模型 | 典型场景 | 核心特点 |
|---|---|---|---|---|
| 分布式文件系统 | 类似HDFS | 目录与文件 | 离线批处理、海量大文件 | 顺序读写吞吐高,适合大文件,不适合高频小文件 |
| 对象存储 | 兼容S3协议的服务 | 桶与对象 | 数据湖、海量非结构化数据 | 容量无限、成本低,但延迟高于本地文件系统 |
| 分布式KV/NewSQL | 类BigTable的引擎 | 表与RowKey | 在线高并发点查、特征服务 | 毫秒级延迟、自动分片,RowKey设计决定生死 |
这三条路线在真实项目里常常组合出现。比如日志平台用文件系统存原始日志,离线数仓用对象存储做分层,推荐系统在线服务用KV存储。接下来就按这三个案例逐个剖析。
2. 场景一:离线日志分析平台与分布式文件系统
日志大概是每个公司都会遇到的第一类大数据。某跨平台业务系统,每天产生约2TB访问日志和业务日志,高峰期每秒写入三万条左右,团队要做用户访问报表、来源分析、异常排查。这类场景的核心特征非常鲜明:写入为主、不更新、顺序读、保留周期长。它天然适合分布式文件系统。
2.1 业务背景与需求拆解
先把需求拆清楚:每天2TB数据,高峰每秒三万条,要求日志至少保留180天,供离线计算和偶尔的明细查询使用。数据总量算下来就是360TB左右,单机存储不可能扛得住,必须上分布式。另外一个容易被忽略的点是,日志写入是append-only,几乎没有更新和删除,数据访问模式是“一次写入、多次读取”,这决定了我们应该选顺序读写友好的文件系统,而不是面向随机更新的数据库或者KV引擎。
生产环境里我还见到过一种很常见的错误路线:有人因为开发方便,直接买了一台高性能服务器,装了个数据库就开始接日志。一开始数据量小没问题,等涨到每天几百GB,写入开始变慢,查询越来越卡,扩容要停机,最后还是要推到重来。与其这样,不如一开始就认定日志这种数据流的特征,选对存储底座。
2.2 整体设计:从采集到落盘
完整的链路一般是:Kafka做消息缓冲,采集任务从Kafka消费日志,批量写入分布式文件系统;再有一个定时任务,每天凌晨把当天的原始文本日志转换成列式格式的压缩表,供后续分析使用。
目录结构可以这样规划:
/data/logs/dt=2025-01-01/ └── type=access/ └── part-0001.log按天分区、按业务类型分区是常规做法。为什么强调按天分区?因为报表和排查基本都是围绕某一天展开的,把分区粒度落到天,可以有效缩小查询扫描范围。为什么写入侧用文本、离线再转列式?因为采集侧只关心“尽快把数据落盘且不丢”,列式转换和压缩放在凌晨跑,既不抢白天资源,又能显著减少存储量,一举两得。
2.3 关键参数与实操细节
这个场景里,有四个参数直接决定集群能不能撑住:
第一是副本数。默认三副本,意思是每份数据在集群里存三份,能容忍两台节点同时坏。如果磁盘预算紧张,临时性的中间数据可以降为两副本,但至少保证跨机架放一份。注意,副本数不是越小越好,副本少了,读任务可以选择的数据本地节点就少了,网络传输量会明显上升。
第二是块大小。分布式文件系统默认块大小一般是128MB,这个值值得认真理解。一个文件被切分为多个块,每个块独立分布在节点上。计算引擎读取时的并行度,基本等于文件总大小除以块大小。块太小,比如32MB,一个1GB文件就有32个任务,调度和元数据开销偏高;块太大,比如512MB,单个任务要处理的数据太多,计算阶段容易拖长。日志场景我一般直接保持128MB,如果单个日志文件特别大,可以上调到256MB。
第三是压缩算法。原始文本日志压缩比非常可观,一般能压到四分之一甚至更低。采集写入时用LZ4或Snappy,好处是CPU开销小、压缩速度快,不影响写入吞吐;离线转换后的表可以用ZSTD,压缩率更高,进一步省空间。压缩格式要和计算框架匹配,否则读的时候没有对应的解码器,反而拖慢任务。
第四是写入攒批策略。这是日志场景最大的坑。如果采集任务每收到一条日志就创建或写一次文件,一天下来会产生几百万个小文件。小文件对分布式文件系统来说是灾难,因为每个文件都要占用元数据服务的内存,文件数量过大,元数据服务内存吃紧,整个集群的RPC请求都会被拖慢。正确做法是采集侧攒批,比如每2到5分钟刷一次盘,或者在内存里攒够128MB再写出,这样一天下来就是一个或几个大文件。
提示:千万不要把日志小文件直接往HDFS里怼。小文件问题一旦爆发,要么连夜写合并任务,要么迁移数据,代价非常大。
2.4 为什么不用本地磁盘加定时上传
有人可能会问,既然日志就是顺序写,为什么不用每台机器本地磁盘存,再定时上传?这个方案我在一些小项目里见过,有它的合理之处,但缺点也很明显:本地磁盘坏了数据就没了,没有副本保护;上传时会占用大量带宽,影响在线业务;而且无法从全局做负载均衡,某台机器磁盘满了,其他机器还有大量空间用不上。所以只要数据量到了“本地盘扛不住”的程度,就应该直接考虑分布式文件系统。
这个案例给我们的启示是:存储设计要顺着数据流的特征走,写多读少、顺序访问,最合适的技术就是大文件加高吞吐文件系统,而不是拿数据库硬扛或者把文件切得稀碎。
3. 场景二:用户行为分析数据湖与对象存储
第二个案例来自某内容平台团队,他们原来用HDFS搭了一套离线数仓,业务部门在上面跑各种行为分析、漏斗统计、用户画像。随着业务增长,存储规模涨得很快,扩容周期长,成本压力越来越大,而且很多数据存下来之后其实很少再被访问,但三副本的成本是实打实摆在那里的。于是团队开始考虑往对象存储迁移,并把数仓升级成数据湖架构。
3.1 对象存储与文件系统的本质差异
对象存储和分布式文件系统,看起来都是“把数据放远端”,实际上差别很大。对象存储的数据模型是“桶”加“对象”,每个对象有一个键,通过HTTP接口读写;没有传统意义上的目录树,但可以通过键的前缀模拟目录层级。对象存储不需要预置集群规模,容量可以理解为无限,成本按实际用量计费,这点对成本敏感、数据规模波动大的场景特别友好。
HDFS这类文件系统则需要维护一个集群,扩容要加节点、做数据均衡、监控磁盘,运维工作量大很多。所以很多团队在考虑成本与运维负担时,会优先看对象存储。但对象存储的短板也很直接:延迟比本地文件系统高,通常几十到几百毫秒;不适合高频小文件写入;部分实现存在写后一致性延迟。这些短板,正好靠数据湖格式来补。
所谓数据湖格式,本质是“在对象存储上构建事务和元数据管理层”,比如Iceberg、Delta Lake这类开源方案都算。它把对象存储里散乱的文件组织成一张张表,提供ACID事务、快照隔离、小文件合并、分区裁剪等能力。换句话说,用数据湖格式,你既能享受对象存储的低成本,又能获得接近传统数仓的查询体验,这也是近几年“湖仓一体”概念火爆的主要原因。
3.2 桶与目录的规划策略
对象存储虽然没有目录树,但键的前缀就是逻辑目录。我们当时建议的桶结构大概是:
storage-bucket/ ├── warehouse/ods/dt=2025-01-01/ ├── warehouse/dwd/business=xxx/dt=2025-01-01/ └── warehouse/ads/dt=2025-01-01/分成ODS(原始数据层)、DWD(明细数据层)、ADS(应用数据层),每层按日期或业务线做前缀。这个设计基本沿用了数仓分层思想,好处是权限好管控、数据血缘清晰、查询按分区裁剪。需要留意的是,对象存储对单前缀的请求速率是有上限的,写入和读取时都尽量把请求分散到多个前缀,比如不同表、不同分区,而不应该让所有流量都打在一个前缀下面。
3.3 生命周期策略与成本治理
对象存储的另一个大优势是生命周期管理。可以给桶配置规则,比如:数据前7天放在标准存储,供实时报表和临时查询读取;第8到30天转为低频访问存储,成本大约是标准存储的三分之一;第31天到180天转为归档冷存储,成本更低,但读取时通常需要等待解冻,不适合实时场景。这个分层策略非常实用,因为日志和分析数据的访问热度基本都集中在新数据上,越老的数据被查的概率越低,没必要都按标准存储付费。
我帮某个团队算过一笔账,原来HDFS三副本存储100TB,按自建集群的硬件成本和电费估算,年度成本相当可观;迁移到对象存储并按生命周期分层后,存储费用下降了40%到50%。而且由于把明细数据转成了列式格式,查询性能并没有因为换存储而变得更快。不过这里有个教训:如果归档冷数据配置得太激进,突然有人要查半年前的数据,就得先等解冻,等几分钟甚至几十分钟都很正常。所以设计分层策略前,一定要先分析真实访问规律,不能只盯着成本指标。
3.4 写入入湖与查询加速的关键配置
数据湖如果还是像传统数仓一样每天批量导一次数据,那实时性肯定不够。生产上一般用实时管道做微批写入,比如每30秒到1分钟提交一次Commit,这样既有秒级到分钟级延迟,又不会因为高频提交产生大量小文件。实际操作中,我习惯把提交间隔和文件大小放在一起调:Commit越频繁,文件越碎;文件太大,查询裁剪又不灵活。通常的做法是设定一个目标文件大小,比如256MB到512MB,compaction任务会自动把小文件合并到这个规模。
查询加速的关键在于“少读数据”。列式格式比如Parquet,天生就是按列存储的,查询只取需要的列,能省掉大量IO;再加上按分区裁剪和谓词下推,把全表扫描变成分区内扫描,性能差距可以到一个数量级。我在调优时还会把常用的过滤字段作为排序键,让数据按这些字段的顺序紧凑排列,进一步缩小扫描范围。
这里有个容易被忽略的点:查询引擎直连对象存储时,需要合理设置并发度。对象存储单前缀带宽有限,如果几百个Task同时读一个目录前缀,反而触发限流。解决方法是把文件打散到多个前缀,并在查询引擎里配置合适的并行度,既不要太低浪费吞吐,也不要高到触发限流。
4. 场景三:在线推荐系统特征存储与分布式KV
第三个案例是某推荐系统团队的特征存储改造。推荐服务在线上要实时读取用户特征和物品特征,比如最近点击过的内容、兴趣标签、物品的静态属性,延迟要求控制在几十毫秒以内,每秒查询量达到几万,数据总量在几十TB级别。这个需求前面两种存储都搞不定:文件系统延迟太高,对象存储更不用说;传统的数据库容量和吞吐跟不上,Redis类的内存存储容量也撑不住几十TB数据。最后只能上分布式KV。
4.1 需求画像与选型逻辑
先把需求拆成三个维度:第一,在线读取,单次查询延迟要毫秒级;第二,写入流量非常大,每天上百亿条行为记录要实时入库;第三,数据规模大,几十TB,而且还在增长。这三个条件摆在一起,基本就把方案框死了:必须选择支持自动分片的分布式KV引擎,也就是类BigTable的架构。
这类存储的数据模型可以简单理解为一个超大的有序表,每个RowKey是主键,按RowKey的哈希范围自动分布到不同节点。写入走日志先行加内存缓冲,批量刷盘;读取按RowKey点查,配合布隆过滤器,速度很快。它不像关系型数据库那样需要建索引,也不像Redis那样受内存限制,可以说是这个场景下的标准答案。
4.2 RowKey设计与预分区:决定生死的关键
分布式KV里最核心的设计就是RowKey。我曾经见过不少团队在这上面翻车,所以这部分值得多说几句。
RowKey格式我推荐这样设计:
hash(user_id)前缀4字节 + user_id + 时间戳后缀为什么加哈希前缀?因为用户ID本身可能是连续递增的,如果不处理,所有新用户的数据会集中写到同一段Region上,形成写热点。加了哈希前缀后,数据可以均匀散列到所有Region。为什么还要保留时间和可读的user_id?因为我们可以按原Key直接拼接出查询请求,不需要额外存储映射;时间后缀让同一用户的数据在物理上连续存放,便于范围查询。
预分区数量也要提前算好。假设集群有50台RegionServer,每个RegionServer承载2到4个Region比较合理,那初始预分区就设100到200个。不要偷懒不预分区,否则系统只能在运行中自动拆分Region,拆分期间会带来大量磁盘和CPU开销,可能影响线上延迟。上线前把预分区做好,后面能省很多事。
4.3 列族、压缩与布隆过滤器
表设计上,能用一个列族就绝不用两个。多个列族意味着不同列族的数据各自刷盘和合并,带来额外的写放大和读放大,性能上并不划算。很多团队习惯性地把实时特征和离线特征分成两个列族,觉得好管理,实际在生产环境查性能就会发现问题,合并到同一列族后,读写稳定性好了不少。
压缩策略上我会做冷热分离:热特征列用LZ4,压缩和解压都快,延迟影响小;冷特征列用ZSTD,压缩率更高,省空间。布隆过滤器在点查场景务必要开,并且用ROW级别。它的作用是减少不必要的磁盘读取:查询一个不存在的RowKey时,布隆过滤器直接告诉引擎“这个Key不在当前文件中”,省掉一次随机IO。对于在线点查这种大量“存在但偶尔读空”的场景,收益非常明显。
WAL(写前日志)默认要开启。它的作用是防止节点宕机时内存中的数据丢失,代价是每次写入都要多写一份日志。有些团队为了性能关掉WAL,换来的是节点宕机就会丢最近几秒的数据,这个取舍一般不建议做,除非业务能接受小概率数据丢失。
4.4 读写链路优化与热点治理
在线点查场景,写入侧最有效的优化是批量写。单条Put一次网络RTT如果是一毫秒,那批量提交可以把几十条Put合并成一次RTT,吞吐提升非常可观。读取侧则是“批量Get”,一次拿多个RowKey,同样是为了减少网络往返。
另外一个铁律:能用Get绝不用Scan。Scan在大数据量表上会拖出大量数据,且容易跨多个Region,搞垮RegionServer。特征场景的业务查询绝大多数是点查,如果出现“按时间范围扫全量用户特征”这种需求,那说明存储选型已经错了,这种事应该交给分析型存储去处理。
热点治理是分布式KV绕不开的话题。某个头部用户的查询量特别大,即使RowKey加盐了,该Key所在Region的CPU和IO也容易被压满。一种做法是业务层对这个Key做读放大,比如把同一个用户特征复制成多个副本,分散在不同Region,查询时随机访问其中一个;另一种做法是把这个热点Key单独拎出来,放到更大的缓存里。不过这两种方案都增加了系统复杂度,没事别乱上,做好监控,先确认热点真的存在再动手。
4.5 案例踩坑总结
这个项目里我们踩过几个很典型的坑:第一次是预分区数量没算够,上线一个月后部分Region体积变大,触发自动拆分,拆分期间写入延迟抖得厉害;第二次是前期把时间戳当RowKey前缀,导致所有最新数据都往同一个Region写,写入严重倾斜,改成哈希前缀后才解决;第三次是有人把超过1MB的原始特征向量塞进了KV的value里,导致Region频繁Compaction,线上延迟明显升高,后来把大对象挪到对象存储,KV里只存引用和更新时间,整个系统才稳定下来。
5. 常见问题与排查技巧实录
前面几个案例已经把三大存储路线的核心实践讲得差不多了,这一章专门聊聊我在实际运维和排查中反复遇到的共性问题。分布式存储最大的特点就是组件多、交互复杂,问题像隔着一层雾,不摸清套路很容易浪费时间。
5.1 数据倾斜:表现、定位与处理
数据倾斜几乎是分布式存储最普遍的问题。HDFS里的典型表现是:集群里有两三台机器磁盘使用率已经到90%,其他机器只有50%,但你明明做的是一套均衡配置。KV存储里则表现为某个RegionServer的CPU和请求量远高于其他节点,相关的读写请求开始超时。
定位倾斜先从“看”开始。分布式文件系统可以用管理命令查看各节点空间分布,再配合目录级别的统计工具,找到占用空间异常大的目录和文件;KV引擎则在Web界面上看Region的负载曲线和存储量排名。定位到根因后,处理方式不太一样:HDFS可以跑均衡任务,把数据从高负载节点搬到低负载节点;KV则要分析RowKey前缀是否均匀,必要时进行预拆分或者调整RowKey设计。记住一个原则:均衡只是缓兵之计,数据写入模型的倾斜才是病根。
5.2 小文件过多:数据平台的第一慢性病
小文件问题我已经在日志场景提到过,这里再展开讲一下。文件系统里每个文件的元数据都要占用内存,通常一个文件要消耗一两百字节,听起来不多,但几百万个文件就是几百MB到几个GB,直接挤占元数据服务内存,让整个集群响应变慢。计算引擎读取小文件时也很痛苦,一个Task读一个文件,几千个Task的调度开销远远大于把数据合并成大文件后的开销。
治理小文件要从入口和出口两头抓。入口是写入任务,攒批再刷盘,或者用支持事务提交和自动合并的数据湖格式;出口则是定期跑合并任务,把小文件合并到128MB甚至更大的目标大小。启动合并之前,一定要评估对查询延迟的影响,避免在业务高峰期操作。
5.3 副本故障与数据重建
节点磁盘故障是常态,不是意外。我曾经见过某团队数据节点坏了一块盘,嵌入了自动恢复流程,但恢复期间的数据复制带宽占满了业务流量,线上查询延迟飙升。所以大规模的分布式存储一定要限制数据复制的带宽上限,最好错峰执行,比如凌晨再跑复制任务。
另外一个是机架感知配置。副本分散在不同机架才能防住机架级故障,如果配置错误,所有副本都落在同一个机架上,一旦机架断电,数据全部丢失。这类问题平时看不出异常,只有做故障演练时才能暴露。建议每个季度做一次机架拓扑梳理,再便宜也要做。
5.4 容量规划与监控告警
容量规划很多人不做,等磁盘满了才紧急扩容,这是一种非常被动的状态。我推荐每周看一次容量趋势,按过去30天的数据增长速度推算剩余可用天数,设定80%容量警告线、90%严重线。监控指标至少要覆盖节点磁盘使用率、写延迟、读延迟、背压情况、复制任务堆积量等。云环境下的对象存储还要盯请求量是否触发限流、生命周期转换失败等。
注意:分布式存储的监控不是可选项,是必选项。很多团队只搭了环境,没有搭监控,出问题的时候日志也没有采集,只能靠猜,这是最花时间的排查方式。
6. 选型与架构演进建议
看完三类场景,很多人可能会问:我到底该选哪一类?其实答案取决于业务特征,而不是“哪个技术更流行”。下面给出一张速查表,方便对照自己的场景。
| 业务场景 | 推荐存储 | 核心理由 |
|---|---|---|
| 离线批处理、海量大文件 | 分布式文件系统 | 顺序读写吞吐高、生态成熟 |
| 数据湖、海量低成本存储 | 对象存储 + 湖格式 | 容量无限、成本低、支持事务 |
| 在线高并发点查 | 分布式KV | 毫秒级延迟、自动分片 |
| 在线事务强一致 | NewSQL/分布式关系库 | 需要完整事务与SQL能力 |
这里多说一句,文件系统和对象存储的边界正在变模糊。新一代计算引擎基本都支持直接读对象存储,所以在很多架构里,对象存储正在取代自建文件系统成为离线数仓的底座。但如果你对延迟极其敏感、实时计算任务需要频繁读写文件系统,那自建文件系统依然有它的价值。
6.1 什么时候该演进,什么时候别动
不是说看到新技术就要迁。如果数据量只有几百GB,业务稳定,团队没有专职运维,最简单的方案可能是单机数据库加定期快照,或者直接用现成的云数据库。贸然上分布式存储,运维成本反而会压垮团队。
可以触发演进的信号很明确:扩容周期太长、存储成本占比太高、点查延迟劣化、监控告警越来越频繁。出现这些信号后,建议先拿一两个非核心业务做试点,迁移前做好数据校验和回滚方案,成功后再扩大范围。我在几个项目里见过“一刀切”式的大迁移,最后都是因为某个非核心表的数据格式不兼容,导致回滚困难,耗费了大量精力。
6.2 选型前先回答这五个问题
每次选型评审,我都会让团队先回答五个问题,回答清楚了再谈技术:
- 数据是读多还是写多?是按Key点查还是全表扫描?
- 数据规模三年后预计多大?存储预算有多少?
- 可接受的数据丢失窗口是多久,秒级、分钟级还是一天?
- 团队是否有能力运维自建存储集群?有没有7×24小时值班?
- 是否需要跨地域容灾和合规归档?
这些问题没有标准答案,但能把需求暴露得很彻底。比如一个团队说“我们要强一致”,但细问发现业务其实能接受秒级延迟,那就可以选最终一致的系统,成本和性能都会好很多。另一个团队说“数据规模不大”,但算了一下三年增长率,发现会是100倍,那就要趁早上分布式方案。
6.3 我的个人体会:存储要当一等公民
做了这些年存储方案,最深的体会是:分布式存储本身并不难,难的是在项目第一天就把它当成一等公民来对待。很多人上来先奔着计算框架去选型,存储只是“找个地方放数据”,等数据量上来才发现存储成了瓶颈,返工成本高得吓人。
另外,凡是上了分布式存储,一定要把监控、故障演练和容量规划当成日常事务,而不是出事了再补。这不是宣传口号,而是我踩过坑之后最真实的建议。真到了磁盘坏掉、节点失联的时候,一套设计良好、演练过的存储体系,才是整个数据平台最稳的底盘。