大数据信息导论论文(日志--被大数据时代遗忘的奠基石)

日志是什么

在中文互联网上,无论是用谷歌搜索还是用百度搜索,讲述日志的文章寥寥无几。毕竟日志这个概念太简单,简单到不禁让大家忽视了它。大道至简,我想这四个字用在日志这个概念身上是很贴切的。

首先,日志是什么?这里的日志指的是只能增加的,完全按照时间排序的一系列记录。就像下图一样:

大数据信息导论论文(日志--被大数据时代遗忘的奠基石)(1)

真的是不能再简单的一个概念了。新的记录只能添加日志的最后,读取日志时可以从最左边的最旧的一条记录依次读到最右边的最新的一条记录。

日志的概念很容易和开发人员为了记录应用程序状态的日志弄混淆。开发人员为了记录应用程序状态的日志,用 Kreps 的话来说,这是一种“应用日志记录”,而这篇文章提到的日志更像是一种“数据日志”,是记录数据变化状态的。

数据库的奠基石

日志的概念第一个的应用领域是数据库,当然按照历史来说,数据库才是日志概念的发明者,具体是谁发明已不可知了,可能发明者觉得日志这个概念太过简单而不屑于记录,毕竟谁也没想到日志这个概念会脱离于数据库,而成为数据领域的“基石”。

数据库里的日志有 Undo 日志、Redo 日志和 Undo/Redo 日志三种,最常用的日志当然是 Redo 日志。Redo,可以理解为可回放、可重复的意思,在数据库里的含义就是只要知道日志上记录的对应的数据库某个初始状态,便可以通过日志回放出数据库任意时刻的状态。想一想,数据库一旦有了这个特性,那么意味着只要日志不丢失、不损坏,无论数据库出了什么故障,我们都可以依赖日志恢复。

除了故障恢复外,很快人们就发现日志也可以用来做数据同步。无论是哪一个关系型数据库,都依赖于日志作为主库向备份库的同步数据的枢纽,当然也不仅仅用于主备同步,异构数据库也可以依赖这个日志,简单的进行解析转换从而实现数据同步。

分布式算法的诞生

日志不仅仅在关系型数据库领域大肆扩张,而且在分布式算法领域也占据了一席之地。也许你会问,日志这个简单的东西怎么和高大上的分布式算法扯在了一块?且听我慢慢说来。

日志有一个很重要的特性:按顺序记录的状态变化。依赖于这个特性,我们可以进行不同的异构数据库之间数据分发。再次强调一遍:日志可以用来记录状态变化和用做数据分发。分布式系统的核心问题是什么?让系统内的各个节点有着同样的状态变化,达成一致的共识。通俗来讲就是,团体内个体都有着同一个理念才会形成团体,要是理念不同,那这个团体也就散伙了。

前面已经提到了,如果两个系统都按照同一份日志的同一刻的状态回放,那么两个系统最后得到的结果肯定是一样的。那么推广到分布式系统内部的不同节点,也是一样的道理:只要所有节点都有着同样的初始状态,那么按照日志回放,那么所有节点最终就会达到同样的结束状态,算不算某种程度上的共识呢?虽然分布式系统里经常会遇上各种各样的不确定性的问题,比如网络崩溃、机器故障,但是日志给与了分布式系统一个确定性的东西:只要老老实实的按照日志回放状态,那么得到的结果一定是确定的。也就是“确定性的过程导致了确定性的结果”。

这有点像宿命论,但是分布式系统在不确定性的世界找到了确定性的东西,并以此作为锚点,在一大堆不可靠的机器上面构建了一套可靠的系统。或许这就是计算机的美妙。

课外拓展:

上面提到的实际上就是状态机复制原理:如果两个相同的、确定性的进程从同一状态开始,并且以相同的顺序获得相同的输入,那么这两个进程将会生成相同的输出,并且结束在相同的状态。

以日志为核心的分布式算法有 Paxos 、Raft 等等。

当然,应用到生产环境不可能像上文提到的那么简单,还需要做非常多的努力。

实时计算里的日志

2018年出了一本新书 Streaming Systems 是关于实时计算的,基本上把实时计算遇到的问题都在理论上解决了,其中几章是关于流表二象性的。所谓流表二象性,指的是不断变化的数据流和数据库里的静态的表本质上同一种的东西。只不过我们从不同的角度去观察,看到了不同的样子,从而以为它们两个是不同的东西。这和物理学里的波粒二象性,有着异曲同工之妙,光既是波,也是粒子,至于它到底是波还是粒子,取决于你观察的角度。

Streaming Systems 论证流表二象性的一个核心的论证点就是日志。以数据库为例,当数据库里的表发生变化时,这些变化实际上是可以按顺序记录在日志上的,日志上动态的,像流一样不断变化。数据库可以依赖于日志,回放出任意状态的表,表是静态的,记录了某一刻的状态。是不是隐约有那么一种感觉了,所谓表就是不断复现日志上面状态的结果集,流则是表的变化记录。随着日志的不断回放,流的变化聚合成表,而表的变化过程就是流。

通俗来讲,表是静态的数据,流是动态的数据。至于你认为数据是什么,取决于你的观察角度,要是你看到的是某一时刻的数据,那么它就是表,要是你是持续不断的观察,那么你看到的就是流。

基于这个观念,演化出了 Streaming SQL ,并直接成为了 Flink 和 Spark Structure Streaming 的理论基础。

大家要是感兴趣的话,可以读下《Streaming Systems》这本书,写的非常之好。

结语

当然,日志不仅仅只是本文提到的这些应用场景,比如像 Kafka 就是受了日志的概念启发而诞生的,并且日志的概念也可以作为微服务之间保证数据一致性的枢纽,诸如此类,就不在本文一一细说了。

回到前面提过的问题,为什么笔者会认为日志这个概念如此重要呢?

  • 日志是数据库的奠基石,而数据库在互联网世界的重要性不用多提了,要是没有数据库,你在手机上玩的任何游戏,阅读的各类小说甚至你的操作系统都不会存在;
  • 其次,日志这个概念启发了分布式算法,而分布式系统的核心就在于分布式算法,至于分布式系统本身就是大数据的基础,大数据喂养了人工智能;
  • 进入5G时代中的物联网时代,我们会越来越强调实时分析、实时计算,而 Streaming SQL 让实时计算不再复杂,简单到一个不懂技术的业务也能分析到实时的数据。Streaming SQL 的背后就是日志这个简单的概念。
  • 。。。

篇幅和能力所限,最后,读者要是因为本文而对日志这个概念感兴趣的话,再次强烈推荐 Jay Kreps 写的《The Log: What every software engineer should know about real-time data's unifying abstraction》,本文很多思路也都来源于这篇文章。

感谢 Jay Kreps !

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页