读书笔记 The Log What every software engineer should know about real-time data's unifying abstraction

前言

TIPS: 这篇文章是13年的老文章了,请辩证的看待如下内容

  • log是所有软件系统的重要构成
  • log相比file、table的特点是他具有时间顺序性
  • application logging是面向人类可读的log,和我们说的journal 和 data logs这些面向程序访问的日志区分开,我们重点也是讨论programmactic access logs

第一部分:什么是日志

数据库日志

数据库日志是完成其核心能力的,一般有:

  • data log
  • redo/undo
  • sql log

分布式系统中的日志

  • 日志解决了分布式系统ordering的问题
  • 通过日志可以将分布式系统一致性的问题简化为日志复制的问题
  • 日志复制分为主备复制、状态机复制两种类型:状态机复制和主备的区别是,状态机复制关键是复制状态,而不是行为。状态机复制的特征就是所有行为先是在leader节点上完成然后将更改后的状态同步到别的节点,例如raft、paxos这些共识协议都属于后者。主从复制复制的日志中则包含的是动作,slave节点需要重新执行来确保最终状态的一致,例如mysql的binlog。下图可以看到主从的日志复制的是request的state changes变更,状态机复制的日志则是包含leader节点完成后的动作

image.png

change logs

特质那边包含变更信息的日志。通过包含变更信息的日志,可以很方便的回放操作,可以用在很多地方,例如:

  1. 数据集成:使用日志可以使组织的所有数据在所有的存储和处理系统中都容易获得。
  2. 实时数据处理:使用日志可以计算派生的数据流。
  3. 分布式系统设计:使用日志中心的设计可以简化实际的系统。

第二部分:数据集成

文章先开始讲解了数据集成本身的重要性和一些挑战。日志是处理系统之间数据流的自然结构。文章坐着通过在Linkedin工作时的经验总结了数据集成的重要性。日志本身的重要性其实催生了kafka的诞生。虽然从现在的视角来看,kafka这样的消息系统已经远远不仅仅是用在系统之间的日志数据流场景了。另外通过文章我们也知道原本的kafka一开始是为了数据集成领域而服务的。

数仓与ETL的关系

这里坐着主要是提出了:抽象一个管道从数仓分离数据集成的职责是一个比较好的范式。当然从现在的视角来看,这是显而易见的。

日志与事件

日志中心化来使系统解耦,然后通过事件驱动的方式简化系统之间日志流的交互是一种好的方式

设计可扩展的日志

这里分区、批量处理、避免无效数据拷贝等手段来设计一个高吞吐可扩展的日志分发系统。

第三部分:日志和实时数据流处理

通过分发日志可以解决实时数据流扇出的问题。文章主要是说了kafka这类日志分发系统在实时流数据处理场景中应用的价值。比如一些状态数据可以用kafka持久化,kafka本身也提供削峰填谷、多订阅、持久化、日志合并等能力。

第四部分:系统构建

主要是作者对数据系统的一些理解:

  • 整个组织的系统和数据流可以看成一个单一分布式数据库,所有面向查询的系统可以理解为一个特定的索引。
  • 数据系统基本可以理解成由日志和查询API构成

参考资料