浅谈分布式存储的发展和演进
浅谈分布式存储的发展和演进
注:本文来源于组内的一次分享,属于综述性质,内容由互联网资料整理所得,感谢阅读。
发展历史
Google、Amazon、Alibaba等互联网公司的发展催生了大数据和云计算两大热门领域。今天我们使用的各种互联网产品,其底层的基础存储设施都是建立在低成本、高性能、高可靠、高可用、可扩展的分布式存储系统之上。分布式系统从最早的数据共享需求,发展到现在的 serverless 架构。它伴随着技术的发展与公司实际需求变化而演进。现在的云服务提供商简化了分布式系统开发的复杂性,让应用开发者只需关注开发,而把基础设施管理交给大型的云服务提供商。
分布式存储发挥在那历史大致分为5个阶段:
1980s 网络文件系统
研究重点:网络环境下的文件共享,解决客户端与文件服务器交互问题。- 代表成果:CMU/IBM 的 AFS 文件系统、SUN 的 NFS 文件系统。
1990s 共享 SAN 文件系统
研究重点:存储系统可扩展性及面向 SAN(Storage Area Network)的共享文件系统。- 代表产品:IBM 的 GPFS、Redhat 支持的开源 GFS(Global File System)。
- SAN 特点:以网络为中心,位于服务器后端,连接服务器、磁盘阵列等设备,包含适配器、磁盘阵列、交换机等。
2000s 面向对象并行文件系统
研究重点:突破容量和性能瓶颈,关注对象存储技术、元数据管理和并发访问。- 特点:结合 NAS 和 SAN 优点,提供高性能、高可靠性、跨平台、安全的数据共享架构。
2010s 云存储系统
研究重点:EB 级大规模存储、数据高可用性(复制、HA、纠错码)、高效智能存储(消重、压缩、分层)、计算存储融合及应用感知存储。- 特点:支持弹性扩展、高可用、高性能、多租户和 QoS 保证。
2015s 基于区块链的分布式存储系统
研究重点:利用区块链去中心化特性,通过广域网聚合边缘节点存储空间,构建大规模存储池。- 代表方案:YottaChain、IPFS。
- 特点:数据可靠性、服务可用性远超云存储,自带容灾和抗 DDoS 能力。
数据量说明
- 1 KB = 1,024 Bytes
- 1 MB = 1,024 KB = 1,048,576 Bytes
- 1 GB = 1,024 MB = 1,073,741,824 Bytes
- 1 TB = 1,024 GB = 1,099,511,627,776 Bytes
- 1 PB = 1,024 TB = 1,125,899,906,842,624 Bytes
- 1 EB = 1,024 PB = 1,152,921,504,606,846,976 Bytes
- 1 ZB = 1,024 EB = 1,180,591,620,717,411,303,424 Bytes
- 1 YB = 1,024 ZB = 1,208,925,819,614,629,174,706,176 Bytes
- 预测:根据中国信通院《大数据白皮书 (2019)》,2025 年全球数据量将达 163 ZB。
分布式存储概念
定义
分布式存储是一种数据存储技术,通过网络利用每台机器的磁盘空间,构成虚拟存储设备,数据分散存储在网络各处。
数据分类
- 非结构化数据:无规律的数据,如文本、图像、声音、视频等。
- 半结构化数据:介于结构化和非结构化之间,自描述,结构与内容混合,如 HTML 文档。
- 结构化数据:存储在数据库中,以二维表结构表达,模式需预定义。
分布式存储系统类型
- 分布式文件系统:存储非结构化数据(如文件、图片、音频、视频),以对象形式组织,典型如 GFS、HDFS。
- 分布式 Key-Value 系统:存储半结构化数据,提供基于 Key 的增删改查,典型如 Memcached、Redis、DynamoDB。
- 分布式数据库系统:存储结构化数据,支持 SQL 关系查询,典型如 MySQL Sharding 集群、MongoDB。
- 分布式消息队列系统:解决应用耦合、异步消息、流量削峰,典型如 ActiveMQ、RabbitMQ、Kafka、RocketMQ。
- 分布式全文检索系统:基于全文索引的实时搜索和分析引擎,典型如 Elasticsearch、Solr。
分布式存储的特点
- 高可用性:系统在异常情况下仍能提供正常服务。
- 高可靠性:通过链上存储,数据不易丢失,抵御恶意访问和攻击。
- 可扩展性:通过扩展集群规模提升存储容量、计算和性能,集群性能与服务器数量呈线性关系。
- 高性能:以吞吐量和响应延迟衡量性能。
- 高稳定性:综合指标,系统能应对各种异常。
- 低成本:利用软件架构的容错和负载均衡机制,在低成本服务器上构建,结合自动化运维实现动态扩缩容。
分布式架构设计要素
- 一致性:保证数据节点副本同步和数据一致性。
- 数据分布:确保各节点数据均匀分布。
- 容错性:故障节点的 failover 机制。
- 负载均衡:各节点请求流量均衡。
- 数据压缩:合理压缩解压算法。
- 数据存储:选择适合应用场景的存储引擎和数据结构。
分布式存储基础
存储介质
HDD(硬盘驱动器)
- 历史:1956 年 IBM 推出首款硬盘 350 RAMAC(5MB 容量,50 个 24 英寸盘片)。1979 年薄膜磁头技术提升数据密度,1980 年首款 GB 级硬盘诞生,1997 年 GMR 磁头提升存储密度 8 倍,2007 年突破 TB 级。
- 逻辑结构:盘片分为磁道、扇区、柱面,容量计算公式:
存储容量 = 磁头数 × 磁道数 × 每道扇区数 × 每扇区字节数。 - 磁盘阵列 (RAID):多块磁盘组成大磁盘系统,提升性能和可靠性。
SSD(固态驱动器)
- 历史:1970 年代出现基于 RAM 的 SSD,后因 Flash 掉电不丢失数据取代 RAM-SSD。工艺进步使 SSD 性能和容量持续提升,逐渐取代 HDD。
- 内部原理:
- 最小存储单位为 Page(4KB 或 8KB),以 Block 为单位擦写。
- 通过 mapping table 维护逻辑到物理地址映射,省去寻道和旋转时间。
- 性能对比:
- 顺序读写:HDD 顺序读约 200MB/s,SSD 约为其两倍。
- 随机读写:HDD 性能远低于 SSD(随机读为 SSD 的几十分之一)。
- 性能优势:
- 定位数据快:通过 mapping table 直接计算地址。
- 读取速度快:无需机械旋转,直接加电压读取。
- 读写与垃圾回收 (GC):
- 新写入:找到空闲 Page 写入,更新 mapping table。
- 覆盖写:因不支持覆盖写,需写入新 Page 并标记旧 Page 无效。
- GC:整理无效 Page,擦写 Block 回收空间,可能导致写放大和寿命减少。
- 损耗均衡策略:动态和静态损耗均衡,减少擦写次数高的 Block 使用。
总结:
- HDD 适合顺序读写,成本低;SSD 适合随机读写,低延迟。
- 大型存储系统:热数据用 SSD,冷数据用 HDD。
索引引擎
Hash 引擎 (Bitcask)
- 特点:写操作仅追加,活跃文件唯一可写,定期 Compaction 合并冗余数据。
- 内存占用:32GB 内存可索引 1TB 数据(磁盘内存比 1:32)。
B 树引擎 (B+ 树)
- 特点:支持随机读和范围查询,MySQL 的 InnoDB 使用 B+ 树(聚簇索引)。
- B+ 树优势:
- 叶子节点存储数据,非叶子节点存储索引,降低树高,减少 I/O。
- 顺序访问指针支持范围查询。
- InnoDB 的 Page 结构:16KB 页面,B+ 树节点对应一个 Page。
倒排引擎
- 正排索引:以文档 ID 为索引,记录文档内容。
- 倒排索引:以单词为索引,记录包含该词的文档 ID,适合快速搜索。
LSM 引擎 (Log-Structured Merge-Tree)
- 核心思想:
- MemTable:内存中按 Key 有序存储最近更新数据。
- Immutable MemTable:MemTable 满后转为中间状态,写入 SSTable。
- SSTable:磁盘中有序键值对集合,带索引和布隆过滤器加速查找。
- 特点:顺序写、数据冗余(需定期 Compaction)、读放大。
- Compact 机制:
- Size-tiered:每层 SSTable 大小相近,数量受限,合并后写入下一层。
- Leveled:每层 Key 不重复,空间放大小,但写放大可能更严重。
- 核心思想:
数据分布(数据分片)
- 目标:
- 均匀性:节点负载均衡。
- 稳定性:节点变化时数据迁移最小化。
- 算法:
- 简单 Hash:Key 哈希后对节点数取模,均匀性好但稳定性差。
- 一致性 Hash:Hash 空间为 2^32 圆环,节点变化仅影响顺时针相邻节点,但均匀性可能不足。
- 带虚节点的一致性 Hash:引入虚拟节点,按权重分配,改善均匀性。
- Hash 分片:将 Hash 环切分为固定大小分片,分配灵活,迁移以分片为单位。
- CRUSH 算法:基于分片,优化映射信息量和故障域划分,客户端/节点独立计算分片位置。
数据压缩
- 常用算法对比(基于《HBase: The Definitive Guide》):
算法 压缩率 (% remaining) 编码速度 解码速度 GZIP 13.4% 21 MB/s 118 MB/s LZO 20.5% 135 MB/s 410 MB/s Zippy/Snappy 22.2% 172 MB/s 409 MB/s - GZIP:高压缩率,CPU 密集,速度慢。
- LZO:压缩率中等,速度快。
- Snappy:压缩率最低,速度最快,CPU 消耗低。
- BigTable 和 HBase 选择:
- BigTable:使用 Zippy/Snappy,追求速度和低 CPU 消耗。
- HBase:早期用 LZO,后推荐 Snappy。
列式存储
- 行式存储:
- 优点:本地读取快,无网络开销。
- 缺点:读取整行数据增加 I/O,压缩效率低。
- 列式存储:
- 优点:只读有用列,压缩率高,节省磁盘空间。
- 缺点:跨节点访问增加网络开销。
CAP 理论 & Base 理论
- CAP 理论:分布式系统无法同时满足一致性 (C)、可用性 (A)、分区容错性 (P),最多满足两项。
- 一致性 (C):数据副本保持一致。
- 可用性 (A):系统始终返回正常响应。
- 分区容错性 (P):网络分区时仍提供服务。
- Base 理论:基于 CAP 的权衡,强调基本可用 (Basically Available)、软状态 (Soft-state)、最终一致性 (Eventual Consistency)。
- 核心思想:牺牲强一致性,追求高可用性和最终一致性。
分布式一致性算法
2PC (二阶段提交)
- 阶段:表决 (Vote) 和提交 (Commit)。
- 问题:单点 Coordinator 故障、同步阻塞、极端场景下数据不一致。
3PC (三阶段提交)
- 阶段:CanCommit、PreCommit、DoCommit。
- 优点:通过 CanCommit 缩短阻塞时间,超时机制缓解不一致问题。
- 缺点:协议复杂,网络分区仍可能导致不一致。
Percolator
- 背景:Google 设计用于支持海量数据索引创建和实时更新。
- 特点:基于 Bigtable,支持跨行/表 ACID 事务,快照隔离 (Snapshot Isolation)。
- 事务模型:基于时间戳的多版本数据,锁管理确保高吞吐和低延迟。
- 写流程:Prewrite(上锁、写数据)、Commit(写提交信息、删除锁)。
- 读流程:检查锁,读取最新可见数据。
Paxos
- 角色:Proposer、Acceptor、Learner。
- 流程:Prepare(承诺)、Accept(接受提案)、Learn(学习决议)。
- 问题:选票瓜分、循环覆盖(活锁)。
- Multi-Paxos:通过 Leader 选举优化,跳过 Prepare 阶段。
Raft
- 角色:Leader、Follower、Candidate。
- 流程:选举(心跳触发)、日志复制(同步日志并提交)。
- 安全性:仅提交当前 term 的日志,间接提交旧日志。
- 开源实现:ETCD、TiDB、RocketMQ 等。
Gossip
- 特点:去中心化,节点随机传播消息,指数级收敛。
- 优点:扩展性、容错、简单。
- 缺点:消息延迟、冗余。
ISR (Kafka)
- 概念:In-Sync Replicas,副本同步队列,动态维护。
- 同步原理:介于同步和异步复制,平衡数据可靠性与吞吐率。
- 关键指标:LEO(日志末端位移)、HW(高水印)。
高性能分布式存储设计要点(以 RocketMQ 为例)
- 框架原理:
- NameServer:轻量级服务发现和路由,记录完整路由信息。
- Broker:支持消息存储、容错、Push/Pull 模式。
- Producer/Consumer:分布式部署,支持负载均衡和实时订阅。
- 网络与线程模型:基于 Netty 的主从 Reactor 模型,线程池隔离不同业务。
- 读写分离:CommitLog 存储元信息,ConsumeQueue 存储索引,优化读性能。
- 异步刷盘:默认异步刷盘,每 200ms 持久化数据,降低延迟。
- 零拷贝与页缓存预读:通过 mmap 映射和文件预热优化写入性能。
- 故障恢复:引入 Dledger(基于 Raft)实现自动故障转移。
常见分布式存储系统详解
HDFS(文件系统)
- 发展历史:
- 2002-2005:Doug Cutting 开发 Nutch,基于 Google GFS 实现 NDFS,后演变为 HDFS。
- 2006:Hadoop 正式面世,Yahoo! 采用并扩展集群。
- 2008:Hadoop 成为 Apache 顶级项目,生态系统(HBase、Hive 等)形成。
- 存储架构:Master/Slave 架构,包含 Client、NameNode、DataNode、Secondary NameNode。
- Client:文件切分、与 NameNode/DataNode 交互。
- NameNode:管理名称空间、数据块映射、配置副本策略。
- DataNode:存储数据块,执行读写操作。
- Secondary NameNode:辅助 NameNode,合并元数据。
- 数据读写:
- 读:通过 RPC 获取 block 位置,连接最近 DataNode 读取数据。
- 写:客户端与 DataNode 建立管道,强一致性需所有副本写完后确认。
- HA 机制:通过 Zookeeper 和 QJM(Quorum Journal Node)实现选主和脑裂防护。
- 优缺点:
- 优点:高容错、流式访问、适合大规模数据和批处理。
- 缺点:高延迟、不适合小文件、不支持并发写或随机修改。
- 与盘古区别:
- 盘古支持显式 commit、多 Master 热备、RAID 编码、灵活数据分布等。
TiDB(分布式数据库)
- 发展历史:2015 年开源,2020 年发布 4.0 GA 版本,社区活跃,应用于近 1000 家企业。
- 架构:
- 计算层 (TiDB):SQL 解析,生成分布式执行计划,无状态。
- 存储层 (TiKV):分布式 KV 存储,支持事务和高可用,TiFlash 提供列式存储加速分析。
- 元数据层 (PD):管理集群拓扑、数据分布,分配事务 ID。
- 数据分片:基于 Range 分片,Region 默认 96MB,动态均衡,Raft 复制。
- 分布式 ACID 事务:基于 Percolator 模型,通过时间戳和两阶段提交实现快照隔离。
- 优势:分布式架构、兼容 MySQL、高可用、支持 ACID 事务、丰富工具链。
Ceph(小文件存储)
- 背景:2004 年始于 Sage 博士论文,RADOS 设计支持块存储、对象存储、文件系统。
- 概念模型:
- Monitor:管理 OSD 元数据,通过 Paxos 同步。
- OSD:存储数据,响应客户端请求。
- PG:逻辑分组,组织和映射数据。
- CRUSH:数据分布算法,类似一致性 Hash。
- 数据读取:客户端通过 CRUSH 算法定位主 OSD,读写涉及副本同步。
- 特性:高性能(CRUSH 算法、并行度高)、高可用(副本灵活、故障自愈)、高可扩展、支持多种存储接口。
IPFS
- 发展历史:2014 年胡安发起,2015 年发布,2017 年 Filecoin ICO 融资 2.57 亿美元,2020 年主网上线。
- 工作原理:
- 基于内容寻址,文件生成唯一 Hash 值。
- 去重处理,节点存储感兴趣内容,通过 IPNS 命名系统简化寻址。
- 与 HDFS 区别:
- 应用对象:HDFS 适合企业大文件,IPFS 面向个人用户。
- 读写频次:HDFS 适合低写高读,IPFS 支持高频读写。
- 存储环境:HDFS 使用 X86 服务器,IPFS 支持个人设备。
- 存储系统:HDFS 封闭,IPFS 去中心化。
- 寻址方式:HDFS 通过 NameNode,IPFS 基于内容直接获取。
- Filecoin:IPFS 激励层,通过复制证明 (PoRep) 奖励矿工存储数据。
- 前景:整合至 Brave 浏览器、与 Hadoop 结合,支持协作应用,Gartner 预测 2023-2028 年进入成熟阶段。
分布式存储与云原生
- 云原生技术:包括容器、服务网格、微服务、不可变基础设施、声明式 API,支持弹性扩展和自动化运维。
- 公有云存储:如阿里云,提供对象存储、块存储、文件存储、数据库,具备规模效应和低成本优势。
- CSI(容器存储接口):支持数据卷全生命周期管理(创建、挂载、卸载、删除、扩容)。
- 现状与挑战:
- 敏捷化:需快速挂载/卸载、自愈、灵活配置卷大小。
- 监控能力:需细粒度监控(目录级、读写时延等)。
- 性能:优化高性能存储(如 CPFS、GPFS)和调度。
- 共享存储隔离:多租户场景需增强隔离性。
- 未来格局:分布式存储推动 5G 和新基建,与区块链结合解决数据确权和激励问题。
- 生物存储:DNA 和小分子(如糖、氨基酸)可用于数字存储,布朗大学研究存储 10 万比特图像,准确率达 98%。
总结
分布式存储的未来趋势关键词:分布式、云存储、容器存储、全闪存、AI 存储、区块链存储、边缘存储。
量子存储、生物存储和基因存储尚处于早期阶段。


