存储与数据库
1.数据持久化
1.1 持久化过程
数据持久化是指将数据从临时的内存中存储到持久性存储介质(如硬盘、数据库)中,以便在计算机系统关闭或重启后能够保留数据的过程。下面是一般情况下数据持久化的过程:
- 选择数据存储格式: 在将数据持久化之前,首先需要选择适当的数据存储格式。这可能包括文本、二进制、JSON、XML 等格式,具体取决于数据的性质和用途。
- 数据序列化: 数据持久化通常涉及将内存中的数据结构转换为可以在存储介质上保存的格式。这个过程称为数据序列化。序列化将数据转换为字节流或类似格式,以便能够在存储介质上进行存储和读取。
- 选择存储介质: 选择适当的存储介质来保存数据,例如硬盘、数据库、内存数据库等。不同的存储介质具有不同的特性,如速度、容量、持久性等。
- 数据存储: 将序列化后的数据存储到选定的存储介质中。对于文件系统,这可能涉及创建文件并将数据写入文件中。对于数据库,这可能涉及将数据插入到相应的表中。
- 数据读取: 当需要访问持久化的数据时,可以通过读取存储介质中的数据来进行。这通常涉及从文件系统或数据库中检索数据,并进行反序列化以将其转换回内存中的数据结构。
- 错误处理和一致性: 在数据持久化过程中,需要考虑错误处理和数据一致性。这包括处理写入错误、数据损坏、并发访问等情况,以确保数据的完整性和可靠性。
- 数据更新和删除: 数据持久化过程还涉及数据的更新和删除。更新数据时,需要将修改后的数据重新序列化并存储回存储介质。删除数据时,需要从存储介质中移除相应的数据记录。
- 备份和恢复: 为了防止数据丢失,通常会定期进行数据备份。备份是将数据复制到另一个位置或介质的过程,以便在发生故障或数据丢失时进行恢复。
2.存储系统与数据库简介
2.1 存储系统
一个提供了读写、控制类接口,能够安全有效地把数据持久化的软件,就可以称为存储系统
2.2 存储系统的特点
- 作为后端软件的底座,性能敏感
- 存储系统软件架构,容易受硬件影响
- 存储系统代码,既“简单”又“复杂"
2.3 存储器的层级结构
存储器的层级结构通常被称为存储器层次结构(Memory Hierarchy),它是计算机系统中用于存储数据和程序指令的各种存储设备的组织方式。存储器层次结构的目标是在速度、容量和成本之间寻找平衡,以便能够在不同层级上进行高效的数据访问。
存储器层次结构通常从速度最快、但容量最小、成本最高的存储设备开始,然后逐渐向下包含速度较慢、容量更大、成本更低的存储设备。以下是一般情况下的存储器层次结构,从高到低排列:
寄存器(Registers):
- 位于CPU内部,用于存储最常用的数据和指令。
- 速度极快,但容量非常有限。
高速缓存存储器(Cache Memory):
- 位于CPU附近,用于存储频繁访问的数据和指令。
- 分为多级缓存(L1、L2、L3等),速度逐渐减慢,容量逐渐增大。
主内存(Main Memory):
- 通常是DRAM(Dynamic Random Access Memory)类型,用于存储正在运行的程序和数据。
- 速度较快,容量较大,但相对于高速缓存较慢。
虚拟内存(Virtual Memory):
- 利用磁盘空间来扩展主内存,允许执行比主内存更大的程序。
- 数据在主内存和磁盘之间交换,速度较慢。
辅助存储器(Secondary Storage):
- 通常是硬盘驱动器(HDD)或固态驱动器(SSD)。
- 用于永久存储数据、程序和操作系统。
- 速度相对较慢,容量较大,成本相对较低。
离线存储器(Offline Storage):
- 通常是磁带等设备。
- 用于长期存储备份和归档数据。
- 速度非常慢,容量非常大,成本较低。
2.4 数据如何从应用到存储介质
将数据从应用程序写入存储介质(如硬盘、固态驱动器等)或从存储介质读取到应用程序,涉及多个步骤和不同层级的存储设备。以下是数据从应用程序到存储介质的一般过程:
- 应用程序层: 应用程序首先生成需要存储或读取的数据,这可以是用户输入、计算结果、文件内容等。
- 操作系统层: 操作系统负责管理文件系统、内存和硬件设备。应用程序通过操作系统的文件系统接口(例如,文件读写API)来进行数据的存储和读取。
- 文件系统层: 文件系统是操作系统用于组织和管理存储介质上的数据的一种方式。它维护了目录结构、文件属性和数据块的映射关系。
- 文件缓存(在适用的情况下): 操作系统通常在内存中维护一个文件缓存,用于暂时存储最近访问的文件数据。这可以加快数据的读取和写入操作。
- 存储层次结构: 数据从文件缓存或应用程序直接写入到存储介质。不同层级的存储设备可能会有不同的速度、容量和特性。
- 硬件控制器: 存储介质的硬件控制器(例如,硬盘控制器)负责实际的数据传输和存储操作。它将数据从操作系统或缓存传输到存储介质上的特定位置。
- 存储介质: 数据被写入存储介质的适当位置。硬盘或固态驱动器会根据数据的物理位置和文件系统的管理方式来存储数据。
- 磁盘缓存(在适用的情况下): 一些存储介质(如硬盘)可能在设备上有自己的缓存,用于暂存数据,以便更有效地处理读写操作。
- 操作系统确认: 存储操作完成后,硬件控制器将信号发送给操作系统,确认数据已经成功写入或读取。
- 应用程序确认: 操作系统通知应用程序数据操作的结果,应用程序可以根据需要继续执行其他操作。
2.5 RAID技术
背景
- 单块大容量磁盘的价格 >多块小容量磁盘
- 单块磁盘的写入性能 < 多块磁盘的并发写入性能
- 单块磁盘的容错能力有限,不够安全
RAID 0
- 多块磁盘简单组合
- 数据条带化存储,提高磁盘带宽
- 没有额外的容错设计
RAID 1
- 一块磁盘对应一块额外镜像盘
- 真实空间利用率仅50%
- 容错能力强
RAID 0+1
- 结合了RAID O 和RAID 1
- 真实空间利用率仅50%
- 容错能力强,写入带宽好
3.数据库
3.1 关系型数据库
关系 = 集合 = 任意元素组成的若干有序偶对反应了事物间的关系
关系代数 = 对关系作运算的抽象查询语言交、并、笛卡尔积
SOL = 一种DSL = 方便人类阅读的关系代数表达形式
- 特点
关系型数据库是一种基于关系模型的数据库管理系统(DBMS),它使用表格(关系)来组织和存储数据。这种类型的数据库在业务和应用中非常常见,具有以下特点:
- 结构化数据存储: 关系型数据库使用表格(二维结构)来存储数据,每个表都由列和行组成。每列定义了特定类型的数据,每行则包含特定实体或记录的数据。
- 数据完整性: 关系型数据库支持定义数据的完整性约束,如主键、唯一键、外键等,以确保数据的准确性和一致性。
- SQL查询语言: 关系型数据库使用结构化查询语言(SQL)进行数据的检索、插入、更新和删除等操作。SQL是一种标准化的查询语言,使得用户可以方便地对数据库进行操作。
- 事务支持: 关系型数据库支持事务处理,可以将多个操作组合成一个逻辑单元,要么全部成功执行,要么全部回滚。这确保了数据的一致性和可靠性。
- 数据关系: 关系型数据库允许通过外键(键值关联)在不同表之间建立关系。这样可以将数据分散存储在多个表中,从而避免数据冗余。
- 数据完整性: 关系型数据库支持在数据库层面实施数据完整性约束,如主键、外键、唯一性约束等,以确保数据的准确性和一致性。
- ACID特性: 关系型数据库通常遵循ACID原则,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这些特性确保了数据库操作的可靠性。
- 广泛的支持和生态系统: 关系型数据库有许多成熟的商业和开源实现,如MySQL、PostgreSQL、Oracle、Microsoft SQL Server等。它们都有强大的工具和生态系统,支持广泛的应用场景。
- 适用范围: 关系型数据库适用于大多数企业级应用,如金融、客户关系管理(CRM)、人力资源管理(HRM)等,以及需要高度结构化数据的应用场景。
3.2 非关系型数据库
非关系型数据库也是存储系统,但是一般不要求严格的结构化
3.3 结构化数据管理
关系型数据库和非关系型数据库(NoSQL数据库)是两种不同的结构化数据管理方法,它们在数据存储、查询语言、数据模型等方面有一些重要的区别。
关系型数据库:
- 数据模型: 关系型数据库使用表格(二维结构)来存储数据,每个表都由列和行组成。数据在表中以结构化形式存储,每一列都有特定的数据类型。
- 数据关系: 关系型数据库允许在不同表之间建立关系,通过使用外键(键值关联)来实现。这种关联允许将数据分散存储在多个表中,以减少数据冗余。
- SQL查询语言: 关系型数据库使用结构化查询语言(SQL)进行数据操作,包括数据检索、插入、更新和删除等。
- 数据完整性: 关系型数据库支持定义数据的完整性约束,如主键、唯一键、外键等,以确保数据的准确性和一致性。
- 事务支持: 关系型数据库支持事务处理,确保数据操作的原子性、一致性、隔离性和持久性(ACID特性)。
非关系型数据库(NoSQL数据库):
- 数据模型: NoSQL数据库使用多种数据模型,例如键值存储、文档存储、列族存储和图存储。这些模型允许存储非结构化或半结构化数据。
- 数据关系: NoSQL数据库通常不依赖于严格的表格关系,它们的数据模型更加灵活,允许数据在不同记录之间具有不同的结构。
- 查询语言: NoSQL数据库通常使用非SQL查询语言(或者有限的SQL变种)来进行数据操作。这些查询语言可以根据数据库的数据模型进行定制。
- 可伸缩性: NoSQL数据库通常具有良好的可伸缩性,可以更容易地处理大规模的数据和高并发访问。
- 灵活性: NoSQL数据库适用于需要快速开发、灵活数据模型、不同数据类型的应用场景,如社交媒体、物联网(IoT)等。
3.4 事务能力
凸显出数据库支持[事务] 的优越性
- A(tomicity),事务内的操作要么全做,要么不做
- C(onsistency),事务执行前后,数据状态是一致的
- l(solation),可以隔离多个并发事务,避免影响
- D(urability),事务一旦提交成功,数据保证持久性
4.主流产品剖析
4.1 单机存储
单机存储 = 单个计算机节点上的存储软件系统,一般不涉及网络交互
文件系统的管理单元:文件
- 文件系统接口: 文件系统繁多,如Ext2/3/4,sysfs,rootfs等,但都遵循VFS的统一抽象接口
- Linux文件系统的两大数据结构: Index Node & Directory Entry
Index Node
- 记录文件元数据,如id、大小、权限、磁盘位置等
- inode是一个文件的唯一标识,会被存储到磁盘上
- inode的总数在格式化文件系统时就固定了
Directory Entry
- 记录文件名、inode指针,层级关系(parent)等
- dentry是内存结构,与inode的关系是N:1(hardlink的实现)
单机存储 - key-value存储
- 常见使用方式: put(k, v) & get(k)
- 常见数据结构 : LSM-Tree,某种程度上牺牲读性能,追求写入性能
- 拳头产品: RocksDB
4.2 分布式存储
分布式存储 = 在单机存储基础上实现了分布式协议,涉及大量网络交互
HDFS : 堪称大数据时代的基石
时代背景 : 专用的高级硬件很贵,同时数据存量很大,要求超高吞吐
HDFS核心特点
- 支持海量数据存储
- 高容错性
- 弱POSIX语义
- 使用普通x86服务器,性价比高
Ceph : 开源分布式存储系统里的 [万金油J
- 一套系统支持对象接口、块接口、文件接口
- 但是一切皆对象
- 数据写入采用主备复制模型
- 数据分布模型采用CRUSH算法
单机数据库 = 单个计算机节点上的数据库系统 事务在单机内执行,也可能通过网络交互实现分布式事务
4.3 常见数据库
elasticsearch
- 面向 [文档]存储
- 文档可序列化成JSON,支持嵌套
- 存在 [indexJ ,index = 文档的集合
- 存储和构建索引能力依赖Lucene引擎
- 实现了大量搜索数据结构 & 算法
- 支持RESTFUL API,也支持弱SOL交互
mongodb
- 面向[文档J 存储
- 文档可序列化成JSON/BSON,支持嵌套
- 存在[collectionJ,collection = 文档的集合
- 存储和构建索引能力依赖wiredTiger引擎
- 4.0后开始支持事务(多文档、跨分片多文档等)
- 常用client/SDK交互,可通过插件转译支持弱SQL
redis
- 数据结构丰富 (hash表、set、zset、list)
- C语言实现,超高性能
- 主要基于内存,但支持AOF/RDB持久化
- 常用redis-cli/多语言SDK交互
4.4 从单机到分布式数据库
- 问题
容量 弹性 性价比
- 解决
池化 扩容 事务优化
5. 新技术演进
5.1 软件架构变更
软件架构变更是指对软件系统的整体结构、组织方式、组件之间的关系以及各种设计决策进行修改或调整的过程。软件架构变更可能是出于多种原因,包括性能改进、需求变更、技术更新、扩展需求等。这些变更可能在系统的不同层面产生影响,因此需要经过深思熟虑和良好的规划。
以下是软件架构变更的一些常见类型和注意事项:
- 重构: 重构是指在不改变软件系统外部行为的前提下,对代码的内部结构和设计进行修改,以提高代码质量、可维护性和性能。重构可能涉及模块重组、代码抽象、消除重复代码等。
- 技术升级: 当新的技术出现时,可能需要对软件架构进行调整以支持这些新技术。例如,从传统的单体应用迁移到微服务架构,或者从关系型数据库迁移到分布式数据库。
- 性能优化: 为了提高系统的性能,可能需要对架构进行调整,例如引入缓存层、分布式计算、负载均衡等。
- 需求变更: 随着业务需求的变化,可能需要对软件架构进行调整,以满足新的功能、流程或用户体验要求。
- 模块重构: 调整或重新设计系统中的模块、组件或服务之间的关系,以更好地支持功能扩展、更好的解耦和灵活性。
- 平台迁移: 将软件系统从一个平台迁移到另一个平台(如从本地服务器迁移到云平台),可能需要对架构进行调整,以适应新平台的要求。
- 解决技术债务: 技术债务是指为了快速满足需求而采用的临时解决方案,随着时间推移可能导致系统不稳定和难以维护。解决技术债务可能需要进行架构调整。
在进行软件架构变更时,需要考虑以下几点:
- 规划: 定义明确的变更计划,包括变更的目标、范围、时间表和资源需求。
- 风险评估: 评估变更可能带来的风险,包括系统稳定性、性能影响、用户体验等方面的风险。
- 逐步进行: 大规模的架构变更通常需要逐步进行,避免一次性引入大量变更可能导致系统不稳定。
- 测试和验证: 在变更之前进行充分的测试和验证,确保变更后的系统仍然能够满足功能需求和性能要求。
- 文档和培训: 变更后,确保更新相关文档和提供培训,以便团队成员了解新的架构和变更。
- 沟通: 与团队成员、利益相关者和用户进行透明的沟通,解释变更的原因和影响,获取反馈和支持。
SPDK(Storage Performance Development Kit)是一个开源的软件项目,由英特尔(Intel)开发和维护,旨在提供高性能、低延迟的存储技术和解决方案。SPDK专注于优化存储应用程序和中间件,以利用现代存储硬件(如固态驱动器和非易失性内存)的潜力,提供卓越的I/O性能。
SPDK的主要特点和目标包括:
- 零拷贝操作: SPDK允许应用程序直接从用户空间进行存储操作,避免了数据在内核和用户空间之间的复制,从而减少了I/O处理的开销。
- 用户态驱动: SPDK的组件在用户态中运行,减少了内核态和用户态之间的切换,提高了I/O操作的效率和性能。
- NVMe优化: SPDK针对NVMe(Non-Volatile Memory Express)设备进行了优化,通过最大程度地利用NVMe的并行性和低延迟,提供出色的存储性能。
- 高性能存储引擎: SPDK提供了一些高性能的存储引擎,如SPDK Blobstore和SPDK NVMe-oF Target,用于构建高性能的存储解决方案。
- 非易失性内存: SPDK支持将非易失性内存(NVM,如Intel Optane等)用作高速缓存或持久性存储,以提供低延迟和高吞吐量的数据访问。
- RDMA支持: SPDK支持RDMA(Remote Direct Memory Access),这使得网络存储应用能够以极低的延迟进行数据传输。
- 通用性: 尽管SPDK的主要焦点是存储性能,但它也可以用于其他领域,如网络数据包处理等。
5.2 AI增强
机器学习(Machine Learning,ML)在存储领域发挥了重要作用,帮助优化存储系统的性能、管理数据、预测故障等。以下是一些机器学习在存储领域的应用技术:
- 存储性能优化: 机器学习可以分析存储系统的工作负载、访问模式和性能指标,从而优化存储系统的配置和调优,以提高性能和资源利用率。它可以根据历史数据预测未来负载,进行自适应调整。
- 故障预测和维护: 通过分析存储设备的传感器数据、日志记录和性能指标,机器学习可以帮助预测硬件故障或磁盘故障,从而采取适当的维护措施,减少停机时间。
- 数据管理: 机器学习可以帮助优化数据的存储和访问,根据数据的特性和需求自动将数据迁移到适当的存储层级,以实现更高的性能和成本效益。
- 压缩和去重: 通过分析数据的模式和特性,机器学习可以优化数据压缩和去重算法,减少存储空间的使用。
- 智能缓存管理: 机器学习可以通过预测热数据和冷数据的访问模式,优化缓存的管理策略,提高命中率,从而提高数据访问速度。
- 数据分类和标记: 在大规模数据存储中,机器学习可以用于自动分类和标记数据,使得数据的搜索、检索和管理更加高效。
- 质量服务(QoS)管理: 机器学习可以根据应用程序的需求和优先级,动态分配存储资源,以确保关键任务的性能。
- 数据安全和风险管理: 机器学习可以识别异常行为、潜在风险和安全漏洞,帮助保护存储系统中的数据。
- 自动化管理: 通过机器学习,存储系统可以自动化地进行容量规划、资源分配、故障处理等管理任务,减轻人工干预的负担。
5.4 硬件革命
01RDMA网络 传统的网络协议栈,需要基于多层网络协议处理数据包,存在用 户态 & 内核态的切换,足够通用但性能不是最佳 RDMA是kernel bypass的流派,不经过传统的网络协议栈,可以把 用户态虚拟内存映射给网卡,减少拷贝开销,减少cpu开销 02可编程交换机 P4 Switch,配有编译器、计算单元、DRAM,可以在交换机层对网 络包做计算逻辑。在数据库场景下,可以实现缓存一致性协议等 02. 03Persistent Memory 在NVMe SSD和Main Memory间有一种全新的存储产品 : Persistent Memory IO时延介于SSD和Memory之间,约百纳秒量级可以用作易失性内存 (memory mode),也可以用作持久化介质 (app-direct) 04CPU/GPU/DPU CPU : 从multi-core走向many-core GPU : 强大的算力 & 越来越大的显存空间 DPU: 异构计算,减轻CPU的workload