日志:每个软件工程师都应该知道的有关实时数据的统一抽象

我在六年前加入到LinkedIn公司,那是一个令人兴奋的时刻:我们刚开始面临单一庞大的集中式数据库的限制问题,需要过渡到一套专门的分布式系统。
这是一个令人兴奋的经历:我们构建、部署和运行分布式图数据库(distributed graph database)、分布式搜索后端(distributed search backend)、
Hadoop以及第一代和第二代键值数据存储(key-value store),而且这套系统一直运行至今。

这个过程中,我学到的最有益的事情是我们所构建这套系统的许多组件其核心都包含了一个很简单的概念:日志。
日志有时会叫成 预先写入日志(write-ahead logs)、提交日志(commit logs)或者事务日志(transaction logs),几乎和计算机本身形影不离,
是许多分布式数据系统(distributed data system)和实时应用架构(real-time application architecture)的核心。

不懂得日志,你就不可能真正理解数据库、NoSQL存储、键值存储(key value store)、数据复制(replication)、paxosHadoop、版本控制(version control),甚至几乎任何一个软件系统;然而大多数软件工程师对日志并不熟悉。我有意于改变这个现状。
本文我将带你浏览有关日志需要了解的一切,包括日志是什么,如何在数据集成(data integration)、实时处理(real time processing)和系统构建中使用日志。

目录

  • 译序
  • 概述(日志每个软件工程师都应该知道的有关实时数据的统一抽象)
  • 第一部分:日志是什么?
    1. 数据库中的日志
    2. 分布式系统中的日志
    3. 变更日志(changelog)101:表与事件的二象性(duality
    4. 接下来的内容
  • 第二部分:数据集成
    1. 数据集成:两个难题
      • 事件数据管道
      • 专用数据系统(specialized data systems)的爆发
    2. 日志结构化的(log-structured)数据流
    3. LinkedIn
    4. ETL与数据仓库的关系
    5. 日志文件与事件
    6. 构建可伸缩的日志
  • 第三部分:日志与实时流处理
    1. 数据流图(data flow graphs
    2. 有状态的实时流处理
    3. 日志合并(log compaction
  • 第四部分:系统构建(system building
    1. 分解单品方式而不是打包套餐方式(Unbundling)?
    2. 日志在系统架构中的地位
  • 结束语及参考资料
    1. 学术论文、系统、讨论和博客
    2. 一些相关的开源软件
  • 译跋

说明

这篇文章是LinkedInKreps发表的一篇博文,虽然很长,但被称为程序员史诗般必读文章

学习笔记:The Log(我所读过的最好的一篇分布式技术文章)对本文做了很赞的摘要和解读。

但作为一篇 经典 文章,还是值得去完整地研读和理解:

  1. 原文可以作为大数据/分布式系统领域一份导论式的资料。
    作者对整个领域的理解和实战精深广博,抓出并梳理了这个领域的核心:日志。
  2. 原文作为一手资料,有完整的分析过程,能够深入和核对自己的理解。
  3. 摘要和解读不能替代自己理解。
    信息被传递和过滤得越多,丢失和偏差也就越多。