十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DDIA 导读(十二):数据系统的未来

DDIA 导读(十二):数据系统的未来 本文是《Designing Data-Intensive Applications》DDIA中文译名《数据密集型应用系统设计》第 12 章的导读。DDIA 是 Martin Kleppmann 所著的分布式系统经典本系列逐章导读把书的核心概念讲清楚。一句话主旨单个数据库不是孤立存在的——它总是某个更大数据流的一环。数据从源头经过若干转换落到多个目标系统每个系统都是同一个底层数据的派生视图。DDIA 终章的核心是如何让这些派生视图保持一致、可溯源、可重算原书重心不在预测而在综合——以日志为中心把异构系统粘起来并用端到端正确性保证跨系统一致。核心概念拆解1. 派生数据Derived Data——本章的核心概念转换1: 结构化抽取转换2: 文本索引转换3: 统计聚合源头数据(原始文档/日志)派生视图1(元数据表)派生视图2(全文检索索引)派生视图3(聚合仪表盘)派生数据的关键属性可从源头重算派生视图不是源数据丢了能从源头重建。只有源头是事实之源source of truth。冗余但一致多个视图存的是同一数据的不同侧面冗余但应逻辑一致。更新有延迟源头变了派生视图要时间同步批有批的延迟流有流的延迟。当一个系统存的数据能从另一个源头重新生成它就是派生视图而非事实之源。识别哪些是派生数据、哪个是源头是数据集成设计的起点。为什么不能直接双写很多人想源头变了同时写多个目标系统来保持一致——这叫双写是派生数据纪律的核心病因。跨系统无法原子提交部分失败导致副本永久分叉写系统 A 成功、写系统 B 失败A 有了新值 B 还是旧值之后没有机制自动修复分叉就此固化。正确做法是单写源头 变更传播只写源头用 CDC 或批处理把变更传播到派生视图传播可重放、可对账。2. Lambda 架构 vs Kappa 架构——批流如何统一Kappa 架构: 只有流输入流处理(可重放)服务层: 只有流结果Lambda 架构: 批层流层服务层输入批层(Batch Layer)批处理全量重算流层(Speed Layer)流处理实时增量服务层: 合并批结果流增量Lambda 架构批层定期全量重算准确但慢流层实时增量快但可能不准/有错服务层查询时合并批结果 流增量问题维护两套代码批 流逻辑要重复实现易不一致Kappa 架构只有流处理一层但流可重放且保留足够历史所以能回到过去重算全量用可重放的消息日志Kafka当源头重算 回退 offset 重放优势一套代码只有流逻辑条件消息可重放Kafka 流处理支持状态重算且保留足够历史Lambda 的痛点是两套代码要保持逻辑一致——批层改了流层也要改容易漂移。Kappa 用一套流代码替代但要求消息可重放和流处理能重算状态。3. 数据库的 unbundling——数据库是多个组件的打包DDIA 一个深刻观点传统数据库内部做的很多事索引、物化视图、缓存、复制在分布式数据栈里被解包成独立组件。分布式栈(解包)传统数据库(打包)解包成独立组件解包成独立组件解包成独立组件解包成独立组件解包成独立组件存储引擎 索引 物化视图 缓存 复制全在一个进程存储: 列存DB索引: 检索引擎物化视图: 批处理聚合缓存: Redis复制: 消息队列CDCUnbundling 的含义传统数据库把存储/索引/物化视图/缓存/复制打包在一个系统里用事务保证一致分布式栈把这些拆成独立系统每个可独立选型、独立扩展、独立演进代价跨系统没有事务一致性要应用自己保证好处每个组件可独立选型和扩展趋势本质数据库内部的机制索引、物化视图、CDC、复制正在变成独立工具。未来不是选一个数据库而是选一组工具 自己设计集成。这降低了组合门槛任何组件可替换也提高了要求要懂数据库内部原理才能组合好。其中日志如 Kafka是核心黏合剂——数据库内核早就在用日志WAL/redo log做复制和恢复unbundling 只是把这根日志从数据库内部拉出来变成跨系统的统一变更流。Unbundling 后跨系统没有事务端到端正确性要应用自己保证。集成纪律是用管线调度契约部分替代失去的事务。4. 端到端正确性End-to-End Correctness派生数据最容易出的问题源头变了但派生视图没跟上或反过来。DDIA 强调端到端正确性——从源头到派生视图数据应不多不少地一致。DDIA 借用 Saltzer 的端到端论据跨系统的恰好一次只能靠端到端保证不能指望中间任何单跳。转换端到端校验源头: N条记录管线派生视图: 应有N条源头数 派生数?端到端正确性的保障手段唯一标识贯穿源头和派生视图用同一 id能对账可重算派生视图能从源头重建出错了能重算修复对账机制定期校验源头数 vs 派生数发现不一致幂等导入重跑不重复派生数据最容易看起来对实际错——中间结果表面正常但和源头对不上。只有端到端校验能兜底。不信任派生结果、回到源头验证是数据集成的核心纪律。问题→方案问题——同一数据要派生成多个视图元数据表、全文索引、聚合仪表盘跨系统没有事务保证一致。场景——分布式数据栈把传统数据库内部的索引/物化视图/缓存解包成独立组件各组件独立选型但失去跨系统事务。方案——派生数据纪律源头是唯一事实之源派生视图可重算用唯一标识贯穿实现对账定期校验源头数 派生数幂等导入保证重跑不重复。Lambda 用批流两层两套代码易漂移Kappa 用一层可重放流一套代码但要求消息可重放。5. 数据血缘Data Lineage——追踪数据从哪来原始文件抽取/下载中间数据目标1: 索引目标2: 表统计报告血缘的价值排障派生视图出问题顺着血缘回溯到源头定位影响分析源头某字段变了知道影响哪些派生视图合规数据从哪来、经过什么处理6. 批/流做集成——同步 vs 异步派生批流更新定期全量/增量实时持续延迟分钟~小时毫秒~秒复杂度低高CDC/状态/水位线一致性窗口大批之间不一致小近实时一致性窗口多小才值得上流——如果场景不需要近实时批同步完全够上流是过度工程。流的复杂度成本只在批给不了的延迟时才值得付。越来越多系统从批同步转向流式 CDC把一致性窗口从小时缩到秒但这按需推进不盲目上 CDC。尾声原理长存工具会换DDIA 终章不教新技术而是给前 11 章画一个方向坐标。最大的趋势是把数据库内部的技术流、CDC、物化视图、端到端正确性变成通用工具让任何应用都能用上。端到端正确性将成为应用层的通用要求——unbundling 后跨系统没有事务兜底催生工具和框架让应用层声明数据应满足什么不变量、系统自动校验。导读补充观点数据工具越来越易用让非专家也能用但底层原理的重要性不变——工具替你做了决策你要懂原理才能判断工具的决策对不对。懂原理让你能快速评估新工具、判断它的取舍、预判它的坑。工具会换原理长存——学 DDIA 的回报正是工具换了一茬仍能快速评估取舍。DDIA 最后提到数据伦理与隐私数据收集、使用、隐私、偏见。这不是纯技术但作为数据基础设施工程师要意识到数据的影响——数据从哪来、能否用、有什么影响。工具会换(具体系统)具体数据库版本具体消息队列具体调度器具体批/流引擎演进方向原理长存(DDIA教的)端到端正确性思维存储引擎取舍(列存/LSM/B-Tree)复制/分区/一致性原理事务与隔离级别数据集成纪律(契约对账)批→流(按需, 不盲目)对账系统化(每个派生视图)集成契约统一unbundling组合能力DDIA 12 章导读至此全部完成。
返回列表