读《数据密集型应用系统设计》,学分布式系统~!
通过《数据密集型应用系统设计》学习分布式系统
《数据密集型应用系统设计》这本书对与「数据」相关的知识点进行了深入剖析、整理和总结。它从宏观层面阐述了各项技术的共性与差异,并将底层原理讲解得透彻清晰。理解了这些原理后,我们就能明白每项技术的诞生背景、所要解决的问题以及适用场景。
想要书的童鞋参考:送书了 - 《数据密集型应用系统设计》
第一部分:数据系统基础
• 1. 可靠性、可伸缩性和可维护性 • 可靠性:系统在硬件故障、软件错误或人为错误情况下仍能正常工作。 • 数据冗余:通过多个副本存储数据,防止数据丢失。 • 故障检测与恢复:及时检测节点故障并自动恢复,保障系统持续运行。 • 可伸缩性:处理增长的负载能力,主要方式包括垂直扩展和水平扩展。 • 水平伸缩:增加机器来分担负载,如添加服务器节点。 • 垂直伸缩:升级单机硬件配置提升性能,但存在上限。 • 可维护性:降低运维复杂度,提高可读性和可操作性。 • 模块化设计:便于系统维护与功能扩展。 • 日志记录与监控:记录系统运行状态,及时发现并解决问题。 • 2. 数据模型与查询语言 • 数据模型:关系模型 vs NoSQL模型(键值存储、文档存储、列存储、图数据库)。• 关系模型:以表格形式组织数据,支持复杂查询与事务。 • 文档模型:以文档(如 JSON)存储数据,结构灵活。• 键值模型:通过键快速检索值,简单高效。 • 查询语言 • SQL:用于关系型数据库,支持复杂查询操作。 • 面向文档的查询语言:如 MongoDB的查询语言,适用于文档数据查询。• 3. 存储与检索 • 存储引擎 • LSM 树:日志结构合并树,适合写密集型场景,在 RocksDB、LevelDB中广泛应用。• B 树:传统存储引擎,读写平衡。 • 数据压缩、列存储(如 Parquet、ORC)优化查询效率:数据压缩可以减少存储空间和 I/O 操作,提高数据传输和处理速度;列存储将数据按列存储,有利于压缩和查询,特别适合分析型查询。 • 索引 • 哈希索引:根据键值的哈希函数快速定位数据。 • B+ 树索引:在关系型数据库中广泛应用,支持范围查询。 • 缓存技术 • Redis:常用的内存缓存系统,提升数据读取速度。 • CDN:内容分发网络,作为全局缓存的一个应用场景,可将数据缓存到离用户最近的节点,提高访问速度。 • 4. 编码与演化 • 数据编码格式 • JSON:轻量级文本格式,易读易解析。 • XML:标记语言格式,结构清晰。 • Protocol Buffers:二进制格式,高效紧凑,只对数据进行序列化。 • Avro:二进制格式,它将数据模式(Schema)与数据一起序列化(存储)。Hadoop 生态使用比较广泛。 • 模式演化 • 数据库迁移工具:如 Django的迁移工具、Flyway、Liquibase等,管理数据库模式变化,适应不同的开发和部署场景。• 版本控制策略:向前/向后兼容性处理,以及数据流模式(数据库、 RPC、消息队列)中的版本控制。
第二部分:分布式数据
• 5. 复制 • 复制原理 • 主从复制:一个主节点多个从节点,主节点负责写操作,从节点复制数据。 • 多主复制:多个节点都可写入,数据在各节点间同步。 • 复制协议 • 同步复制:写操作在多个副本上同时完成,数据一致性高,但延迟可能较大。 • 异步复制:写操作先在本地完成,然后异步复制到其他副本,延迟较低,但可能存在数据不一致风险。 • 数据一致性问题 • 一致性协议:如 Raft 协议,确保数据在复制过程中保持强一致性。 • 读一致性:主从复制时,从节点的读可能会滞后,可通过读本地副本、读写分离等策略处理读一致性问题 。 • 写冲突解决方案:如最后写入胜出( Last Write Wins,LWW)、基于版本矢量的冲突检测等策略,解决多主复制时的写冲突问题。• 6. 分区 • 分区策略 • 范围分区:根据数据范围划分分区,易实现连续数据的有序存储。 • 哈希分区:通过哈希函数将数据均匀分布到多个分区。 • 一致性哈希(Consistent Hashing):当节点数量变化时,能减少数据迁移的哈希分区方法,有效解决分区变更时的数据迁移问题。 • 分区键选择 • 合理选择分区键:可优化数据分布与查询性能,如按用户 ID分区,避免数据倾斜(热点问题)。• 分区变更处理 • 分区的重新分配:在数据量增长或节点故障时调整分区。 • 数据迁移:在分区变更时,将数据从一个分区迁移到另一个分区。 • 负载均衡: • 热点数据问题(某些分区可能比其他分区更受欢迎)。 • 解决方案:预分区 vs 动态分区。 • 7. 事务 • ACID 特性 • 原子性:事务要么全部成功,要么全部失败,不可部分执行。 • 一致性:事务执行前后,数据从一个一致状态转换到另一个一致状态。 • 隔离性:多个事务并发执行时,相互隔离,不影响彼此结果。 • 持久性:事务提交后,数据永久保存,即使系统故障也不丢失。 • 隔离级别 • 读未提交:一个事务可读取另一个未提交事务的数据,可能导致脏读。 • 读已提交:只能读取已提交事务的数据,避免脏读。 • 可重复读:在同一个事务中,多次读取同一数据结果相同,防止不可重复读。 • 串行化:最高的隔离级别,事务必须按顺序执行,性能最低。 • 分布式事务 • 两阶段提交(2PC):分布式系统中常用的事务提交协议,但存在单点故障问题。 • 三阶段提交(3PC):比 2PC多一步超时机制,降低阻塞风险。• 补偿事务(SAGA):微服务架构中的事务解决方案,通过一系列补偿操作来保证事务的最终一致性,避免分布式锁带来的性能问题 。 • 8. 分布式系统的挑战 • 网络问题 • 网络延迟:影响数据传输和响应时间。 • 网络分区:网络故障导致节点间无法通信,系统需具备分区容忍能力。 • 数据不一致问题 • 由于复制延迟或网络问题等导致不同节点数据不一致:需采用合适策略解决,如使用一致性协议、读修复等机制。 • 安全问题 • 数据加密:保护数据在传输和存储中的安全。 • 身份认证:确保只有授权用户访问系统。 • 时间与时钟同步问题 • 物理时钟 vs 逻辑时钟:物理时钟提供绝对时间,逻辑时钟(如 Lamport 时间戳)用于记录事件的因果关系。 • **NTP(网络时间协议)**同步面临的问题,如漂移、时钟回拨等,可能导致分布式系统中基于时间的逻辑出现错误,需采用其他辅助机制来保证系统的正确性。 • CAP 定理 • 分布式系统如何在一致性(Consistency)、可用性(Availability)、分区容忍性(Partition Tolerance)之间做权衡:例如, CP系统在分区发生时牺牲可用性以保证一致性,AP系统在分区发生时牺牲一致性以保证可用性。• BASE 模型 • 基本可用,软状态,最终一致性: BASE模型放宽了一致性要求,追求系统的高可用性和低延迟,在一些对数据一致性要求不高的场景中得到广泛应用,如电商系统的库存管理。• 9. 一致性与共识 • 一致性模型 • 强一致性:所有节点数据始终保持一致,如分布式文件系统中的强一致性模型。 • 最终一致性:经过一定时间后,各节点数据最终达到一致,如一些 NoSQL 数据库采用此模型。 • 共识算法 • Paxos:经典的共识算法,解决分布式系统中节点间一致性问题。 • Raft:易于理解的共识算法,通过选举和日志复制实现一致性。 • 拜占庭容错(BFT): Paxos、Raft只解决非拜占庭故障(如网络分区、节点崩溃),而BFT解决节点作恶问题,PBFT(实用拜占庭容错算法) 在区块链等系统中应用广泛,可有效应对恶意节点的干扰,保证系统的正常运行。
第三部分:衍生数据
• 10. 批处理 • 批处理框架 • Hadoop MapReduce:分布式计算框架,适合大规模数据批处理。 • Apache Spark:基于内存的分布式计算框架,处理速度快。 • 批处理作业优化 • 数据分区:合理划分数据分区,提高数据处理并行度。 • 任务调度:优化任务调度策略,减少任务等待时间。 • 批处理应用场景 • 数据仓库建设:对大量历史数据进行批处理,生成数据报表。 • 数据分析:对批量数据进行统计、挖掘等分析操作。 • 11. 流处理 • 流处理框架 • Apache Flink:支持低延迟、高吞吐的流处理。 • Apache Storm:实时计算框架,可处理大规模实时数据流。 • 流处理关键技术 • 窗口操作:对数据流按时间或数量等维度划分窗口进行处理。 • 状态管理:在流处理过程中维护状态,以便处理复杂业务逻辑。 • 流处理应用场景 • 实时数据处理:如实时监控系统日志、实时推荐等。 • 事件驱动架构:根据实时事件触发相应操作,如金融交易系统。 • 事件驱动架构中的消息队列: Kafka等消息队列在流式计算中充当“日志系统”,可高效地收集和传输实时数据,保证数据的有序性和可靠性。• Exactly-Once 语义:处理流式数据时,通过一系列技术手段(如检查点、幂等性等)确保数据不丢失、不重复处理,提高数据处理的准确性。 • 12. 数据系统的未来 • 新技术发展趋势 • 新型存储介质:如 SCM(存储级内存),兼具内存速度和存储持久性。 • 人工智能与数据系统结合:利用 AI 技术优化数据管理与查询等。 • 新应用场景与挑战 • 云计算:在云环境下,数据系统需具备弹性伸缩、多租户等能力。 • 大数据与物联网:处理海量物联网数据,挖掘数据价值,面临数据规模、实时性等挑战。
学习路径:从零掌握分布式系统
第一阶段:基础入门(第1-4周)
1. 理解基本概念(第1周)
• 阅读《数据密集型应用系统设计》第一部分 “数据系统基础”,掌握可靠性、可伸缩性、可维护性等核心概念。 • 学习数据模型(关系模型、文档模型、键值模型)和查询语言(SQL、面向文档的查询语言)的基础知识。
• 深入学习存储引擎(LSM 树、B 树)的工作原理。 • 掌握索引(哈希索引、B + 树索引)的构建和使用方法。 • 了解缓存技术(Redis、CDN)及其应用场景。
• 学习数据编码格式(JSON、XML、Protocol Buffers)的特点和应用场景。 • 了解模式演化相关工具(Django 迁移工具、Flyway、Liquibase)和策略。
第二阶段:分布式数据处理(第5-12周)
1. 复制技术(第5周)
• 阅读《数据密集型应用系统设计》第二部分 “分布式数据” 中的 “复制” 章节,理解复制原理(主从复制、多主复制)。 • 学习复制协议(同步复制、异步复制)的优缺点及适用场景。 • 掌握数据一致性问题的解决方案,包括一致性协议(Raft 协议)、读一致性处理和写冲突解决方案。
• 学习分区策略(范围分区、哈希分区、一致性哈希)的原理和权衡。 • 了解分区键选择的方法和动态分区与预分区的优缺点,避免数据倾斜。
• 深入学习事务的 ACID 特性和隔离级别。 • 掌握分布式事务的解决方案,包括两阶段提交(2PC)、三阶段提交(3PC)和补偿事务(SAGA)。
• 学习分布式系统的麻烦,包括网络问题(网络延迟、网络分区)、数据不一致问题和安全问题(数据加密、身份认证)。 • 理解时间与时钟同步问题(物理时钟 vs 逻辑时钟、NTP 同步面临的问题)。 • 掌握 CAP 定理和 BASE 模型的实践。
第三阶段:一致性与共识(第13-15周)
1. 一致性模型与共识算法(第13-14周)
• 阅读《数据密集型应用系统设计》第二部分 “分布式数据” 中的 “一致性与共识” 章节,理解一致性模型(强一致性、最终一致性)。 • 深入学习共识算法(Paxos、Raft)的原理和应用场景。 • 了解拜占庭容错(BFT)和 PBFT 算法在区块链等系统中的应用。
第四阶段:衍生数据处理(第16-21周)
1. 批处理技术(第16-18周)
• 学习批处理框架(Hadoop MapReduce、Apache Spark)的特点和应用场景。 • 掌握批处理作业优化的方法,包括数据分区和任务调度。
• 学习流处理框架(Apache Flink、Apache Storm)的特点和应用场景。 • 掌握流处理关键技术,包括窗口操作和状态管理。 • 了解事件驱动架构和 Exactly - Once 语义的实现方法。
第五阶段:未来趋势与实践(第22-24周)
1. 数据系统的未来(第22周)
• 阅读《数据密集型应用系统设计》第三部分 “数据系统的未来”,了解新技术发展趋势(新型存储介质、人工智能与数据系统结合)。 • 关注新应用场景与挑战(云计算、大数据与物联网)。
• 参与实际的分布式系统项目开发,将所学知识应用到实践中。 • 持续关注分布式系统领域的最新技术动态和发展趋势,不断提升自己的专业素养。