作为数据的Log和WAL的本质区分

2022-04-15 00:00:00 数据 集群 时序 磁盘 英文

## 问题的由来

在计算机世界里,定义一个东西很难。因为大家有不同的理解,而针对中文,又产生了一个新的麻烦,原因两个:

1. 计算机的发源和当前现状,都主要来自英文,所以,需要从英文转译成中文。本来英文就有多个近似词义的表达(比如:master vs leader),中文翻译又可以一翻多(因为存在多个译者),这就让中国用户的理解更容易出现混乱。

2. 中文本身的特点,具有广义性。即可以:比喻、联想、发散。相比而言,英文在表达上更收敛,但一样存在一词多意,而且你会发现,对于同一object,英文会有很多词去描述,而里面有非常细微的差别(而且只有美国人,有时甚至只有英国人知道,i.e., 美国人的英语不如英国人)。比如:我们用英文夸一个想法不错,可能是:Your idea is ok. 但实际上,这个ok在英文很多场景下,只是中文的“一般般”或“麻麻地”的意思。

在我之前的一些文章里,很多涉及Log,同时又用到一个WAL(Write Ahead Log),因此,也容易产生混淆。

比如:

[Kafka is Database],通篇都是Log。然后又提到redo是一个log

[分布式思考:我们需要WAL吗?],通篇都是WAL,但又提到Kafka没有WAL

因此,我们有必要给Log和WAL做个准确的区分

## 那么Log as dataset(真正的数据) 和 WAL 到底有什么区别?

### 1. 落盘次数

数据data(比如:一个key和对应的value)可以放在WAL里,也可以放在dataset里(即终形态)。一般而言,不管是WAL,还是dataset,它们后都需要写到磁盘上(落盘)。

数据data如果用到WAL,则data需要落盘两次,一次到这个WAL对应的磁盘文件里(或文件组),一次到自己后的dataset对应文件里(或文件目录)里。

多个data在WAL文件里,磁盘存储位置是一个接一个,连续的,不方便查询;而多个data落到dataset文件上,一般是不连续的,以其他的数据结构(如B+树或LSM树)存在,以方便查询。

所以WAL是冗余的。即如果使用了WAL,对应的data会落盘两次。如果不用WAL,则data只落盘一次。

我们以[BunnyRedis]为例:

请首先参考[BunnyRedis的结构图]。

                             ** Your Redis Clients **

*****************************                          *****************************            
* bunny-redis 1 (local SSD) *           。。。          * bunny-redis n (local SSD) *
*****************************                          *****************************

                              **********************
                              *  Kafka (Zookeeper) *
                              **********************

相关文章