浅谈分布式存储的发展和演进

:本文来源于组内的一次分享,属于综述性质,内容由互联网资料整理所得,感谢阅读。

发展历史

Google、Amazon、Alibaba等互联网公司的发展催生了大数据和云计算两大热门领域。今天我们使用的各种互联网产品,其底层的基础存储设施都是建立在低成本、高性能、高可靠、高可用、可扩展的分布式存储系统之上。分布式系统从最早的数据共享需求,发展到现在的 serverless 架构。它伴随着技术的发展与公司实际需求变化而演进。现在的云服务提供商简化了分布式系统开发的复杂性,让应用开发者只需关注开发,而把基础设施管理交给大型的云服务提供商。
分布式存储发挥在那历史大致分为5个阶段:

  1. 1980s 网络文件系统
    研究重点:网络环境下的文件共享,解决客户端与文件服务器交互问题。

    • 代表成果:CMU/IBM 的 AFS 文件系统、SUN 的 NFS 文件系统。
  2. 1990s 共享 SAN 文件系统
    研究重点:存储系统可扩展性及面向 SAN(Storage Area Network)的共享文件系统。

    • 代表产品:IBM 的 GPFS、Redhat 支持的开源 GFS(Global File System)。
    • SAN 特点:以网络为中心,位于服务器后端,连接服务器、磁盘阵列等设备,包含适配器、磁盘阵列、交换机等。
  3. 2000s 面向对象并行文件系统
    研究重点:突破容量和性能瓶颈,关注对象存储技术、元数据管理和并发访问。

    • 特点:结合 NAS 和 SAN 优点,提供高性能、高可靠性、跨平台、安全的数据共享架构。
  4. 2010s 云存储系统
    研究重点:EB 级大规模存储、数据高可用性(复制、HA、纠错码)、高效智能存储(消重、压缩、分层)、计算存储融合及应用感知存储。

    • 特点:支持弹性扩展、高可用、高性能、多租户和 QoS 保证。
  5. 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。

分布式存储概念

定义

分布式存储是一种数据存储技术,通过网络利用每台机器的磁盘空间,构成虚拟存储设备,数据分散存储在网络各处。

数据分类

  1. 非结构化数据:无规律的数据,如文本、图像、声音、视频等。
  2. 半结构化数据:介于结构化和非结构化之间,自描述,结构与内容混合,如 HTML 文档。
  3. 结构化数据:存储在数据库中,以二维表结构表达,模式需预定义。

分布式存储系统类型

  1. 分布式文件系统:存储非结构化数据(如文件、图片、音频、视频),以对象形式组织,典型如 GFS、HDFS。
  2. 分布式 Key-Value 系统:存储半结构化数据,提供基于 Key 的增删改查,典型如 Memcached、Redis、DynamoDB。
  3. 分布式数据库系统:存储结构化数据,支持 SQL 关系查询,典型如 MySQL Sharding 集群、MongoDB。
  4. 分布式消息队列系统:解决应用耦合、异步消息、流量削峰,典型如 ActiveMQ、RabbitMQ、Kafka、RocketMQ。
  5. 分布式全文检索系统:基于全文索引的实时搜索和分析引擎,典型如 Elasticsearch、Solr。

分布式存储的特点

  1. 高可用性:系统在异常情况下仍能提供正常服务。
  2. 高可靠性:通过链上存储,数据不易丢失,抵御恶意访问和攻击。
  3. 可扩展性:通过扩展集群规模提升存储容量、计算和性能,集群性能与服务器数量呈线性关系。
  4. 高性能:以吞吐量和响应延迟衡量性能。
  5. 高稳定性:综合指标,系统能应对各种异常。
  6. 低成本:利用软件架构的容错和负载均衡机制,在低成本服务器上构建,结合自动化运维实现动态扩缩容。

分布式架构设计要素

  • 一致性:保证数据节点副本同步和数据一致性。
  • 数据分布:确保各节点数据均匀分布。
  • 容错性:故障节点的 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。

索引引擎

  1. Hash 引擎 (Bitcask)

    • 特点:写操作仅追加,活跃文件唯一可写,定期 Compaction 合并冗余数据。
    • 内存占用:32GB 内存可索引 1TB 数据(磁盘内存比 1:32)。
  2. B 树引擎 (B+ 树)

    • 特点:支持随机读和范围查询,MySQL 的 InnoDB 使用 B+ 树(聚簇索引)。
    • B+ 树优势:
      • 叶子节点存储数据,非叶子节点存储索引,降低树高,减少 I/O。
      • 顺序访问指针支持范围查询。
    • InnoDB 的 Page 结构:16KB 页面,B+ 树节点对应一个 Page。
  3. 倒排引擎

    • 正排索引:以文档 ID 为索引,记录文档内容。
    • 倒排索引:以单词为索引,记录包含该词的文档 ID,适合快速搜索。
  4. LSM 引擎 (Log-Structured Merge-Tree)

    • 核心思想:
      • MemTable:内存中按 Key 有序存储最近更新数据。
      • Immutable MemTable:MemTable 满后转为中间状态,写入 SSTable。
      • SSTable:磁盘中有序键值对集合,带索引和布隆过滤器加速查找。
    • 特点:顺序写、数据冗余(需定期 Compaction)、读放大。
    • Compact 机制:
      • Size-tiered:每层 SSTable 大小相近,数量受限,合并后写入下一层。
      • Leveled:每层 Key 不重复,空间放大小,但写放大可能更严重。

数据分布(数据分片)

  • 目标
    • 均匀性:节点负载均衡。
    • 稳定性:节点变化时数据迁移最小化。
  • 算法
    1. 简单 Hash:Key 哈希后对节点数取模,均匀性好但稳定性差。
    2. 一致性 Hash:Hash 空间为 2^32 圆环,节点变化仅影响顺时针相邻节点,但均匀性可能不足。
    3. 带虚节点的一致性 Hash:引入虚拟节点,按权重分配,改善均匀性。
    4. Hash 分片:将 Hash 环切分为固定大小分片,分配灵活,迁移以分片为单位。
    5. CRUSH 算法:基于分片,优化映射信息量和故障域划分,客户端/节点独立计算分片位置。

数据压缩

  • 常用算法对比(基于《HBase: The Definitive Guide》):
    算法压缩率 (% remaining)编码速度解码速度
    GZIP13.4%21 MB/s118 MB/s
    LZO20.5%135 MB/s410 MB/s
    Zippy/Snappy22.2%172 MB/s409 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)。
    • 核心思想:牺牲强一致性,追求高可用性和最终一致性。

分布式一致性算法

  1. 2PC (二阶段提交)

    • 阶段:表决 (Vote) 和提交 (Commit)。
    • 问题:单点 Coordinator 故障、同步阻塞、极端场景下数据不一致。
  2. 3PC (三阶段提交)

    • 阶段:CanCommit、PreCommit、DoCommit。
    • 优点:通过 CanCommit 缩短阻塞时间,超时机制缓解不一致问题。
    • 缺点:协议复杂,网络分区仍可能导致不一致。
  3. Percolator

    • 背景:Google 设计用于支持海量数据索引创建和实时更新。
    • 特点:基于 Bigtable,支持跨行/表 ACID 事务,快照隔离 (Snapshot Isolation)。
    • 事务模型:基于时间戳的多版本数据,锁管理确保高吞吐和低延迟。
    • 写流程:Prewrite(上锁、写数据)、Commit(写提交信息、删除锁)。
    • 读流程:检查锁,读取最新可见数据。
  4. Paxos

    • 角色:Proposer、Acceptor、Learner。
    • 流程:Prepare(承诺)、Accept(接受提案)、Learn(学习决议)。
    • 问题:选票瓜分、循环覆盖(活锁)。
    • Multi-Paxos:通过 Leader 选举优化,跳过 Prepare 阶段。
  5. Raft

    • 角色:Leader、Follower、Candidate。
    • 流程:选举(心跳触发)、日志复制(同步日志并提交)。
    • 安全性:仅提交当前 term 的日志,间接提交旧日志。
    • 开源实现:ETCD、TiDB、RocketMQ 等。
  6. Gossip

    • 特点:去中心化,节点随机传播消息,指数级收敛。
    • 优点:扩展性、容错、简单。
    • 缺点:消息延迟、冗余。
  7. 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 存储、区块链存储、边缘存储。
量子存储、生物存储和基因存储尚处于早期阶段。