上篇文章主要讲述了 mybatis 开启日志功能,这篇文章对日志进行一下深入的讨论吧。

虽然与上篇文章相比,本文有点偏离mybatis主线,但却是对日志进行了深入的分析。本文主要讲述了两个事物的区别:日志内容和日志的区别。

1、日志内容和日志的区别

什么是日志内容呢?就是我们上文提到的 sql 语句。准确的说,日志内容就是string类型的信息片段。

什么是日志呢?估计很多人会想当然地把“日志内容”当做了“日志”。但是,这种情况明显是混淆概念,张冠李戴了。

日志就是按照时间顺序追加的、完全有序的记录序列,其实就是一种特殊的文件格式。

日志文件是一个巨大的字节数组,而日志内容是一个记录数据。相对于文件来说,每条记录都是按照时间的相对顺序排列的。

日志是最简单的一种存储模型,读取一般都是从左到右,例如消息队列,一般是线性写入log文件,消费者顺序从offset开始读取。

由于日志本身固有的特性,记录从左向右开始顺序插入,也就意味着左边的记录相较于右边的记录“更老”,也就是说我们可以不用依赖于系统时钟,这个特性对于分布式系统来说相当重要。

log.jpg

2、日志的应用

2.1、日志在数据库中的应用

日志是什么时候出现已经无从得知,可能是概念上来讲太简单。

在数据库领域中,日志更多的是用于在系统crash的时候同步数据以及索引等,例如MySQL中的redo log,redo log是一种基于磁盘的数据结构,用于在系统挂掉的时候保证数据的正确性、完整性,也叫预写日志,例如在一个事物的执行过程中,首先会写redo log,然后才会应用实际的更改,这样当系统crash后恢复时就能够根据redo log进行重放从而恢复数据(在初始化的过程中,这个时候不会还没有客户端的连接)。

日志也可以用于数据库主从之间的同步,因为本质上,数据库所有的操作记录都已经写入到了日志中,我们只要将日志同步到slave,并在slave重放就能够实现主从同步,这里也可以实现很多其他需要的组件,我们可以通过订阅redo log 从而拿到数据库所有的变更,从而实现个性化的业务逻辑,例如审计、缓存同步等等。

2.2、日志在分布式系统中的应用

日志是解决一致性问题的关键数据结构,日志就像是操作序列,每一条记录代表一条指令,例如应用广泛的Paxos、Raft协议,都是基于日志构建起来的一致性协议。

标签: none


添加新评论