不一样的日志

日志的概念

这里提的日志并不是应用程序产生的日志,应用程序产生的日志是以一种人类读得懂的方式展示程序运行信息的记录方式,本身不包含任何数据,这篇文章所要描述的日志指的数据系统里的日志,它是一种只增不减,随时间有序的存储抽象。

数据系统可以是关系型数据库,也可以是NoSQL,甚至是版本控制系统。在不同的数据系统,日志有着不同的名字,在Hbase,被称为write-ahead log,在Mysql变成了binlog,版本控制系统,例如SVN,它是一种“snapshot”,名字很多,但本质依然是日志。日志本身是只能增加的,数据会从头到尾开始记录在日志上,拥有着自己的唯一ID,所以程序需要从头到尾的按着顺序读取。日志所关注的时间,并不是一般意义上的物理时间,而是带着因果关系的有序的时间戳。在分布式系统里,由于各个服务器所能依赖的只有网络,网络的不稳定导致了每台服务器的物理时间不能确定事件的发生先后,所以在分布式系统的日志的时间有序不是平常意义的时间有序。

在数据库系统里,我们要区分日志、表和文件的细微区别。文件指的是字节的集合,表是记录的集合,集合本身是可以无序,可以修改的,而日志的载体可以是表,也可以是文件,但是其中存储的数据记录必须时间有序的。

总的而言,日志存储着在某个时刻发生了什么的信息,也就是when和what。

数据库里的日志

在数据库中,日志的作用在于保证数据和索引之间的同步及其持久化。数据库原子性和持久性也来源于日志。

日志会记录整个数据库发生的所有的变化。原子性要求数据可以任意回滚、撤回而不影响数据本身,日志因为会记录各个版本的数据,所以数据库可以在从日志中恢复未发生变化版本的数据,而日志本身不会和系统运行强相关中,在服务器突然发生崩溃时,数据库随时可以从日志中读取的最新版本的数据。

后来,随着系统备份重要性的提升,日志也被当做了数据同步的工具,备份系统可以从主库中抽取数据,自行解析其日志,而不影响主库的运行,完成数据的备份。

分布式系统里的日志

在分布式系统里,日志主要解决了如何保证数据顺序以及数据分布两个问题。为了说明这两个问题,不得不提分布式系统里一个很重要的概念,“State Machine Replication Principle”。 在维基百科里,是这么解释的:

“If two identical, deterministic processes begin in the same state and get the same inputs in the same order, they will produce the same output and end in the same state.”

deterministic表示一个进程本身不依赖于时间,也不依赖于任何外部输入,例如无论何时输入1,1+1这个过程都会返回2,但是例如getNowDays这种类型的函数,它依赖于时间,在每个时间段调用时,返回的结果都是不一样的,所以它是不deterministic的。state指的是数据在机器中保存的状态。所以上面这句话表示的是当你在在调用一个程序时,无论多少次,只要同样的输入顺序会获得同样的结果,“deterministic processing is deterministic”。

分布式系统非常依赖这个原则,只要系统内部各个机器的程序只要在读入相同的日志时都会输出相同的结果,这使得数据可以分布在集群中,而不用担心数据会在不同机器产生不同的结果,并且日志本身具有的时间有序,可以有效的确定一个时间发生的先后顺序。

简而言之,当每台机器都是状态机时,我们可以根据日志从任何时间开始进程,都能保证输出结果的并不会顺着时间发生变化。

日志的种类

在数据库里的日志可以区分为物理日志和逻辑日志两种:

  • 物理日志会记录数据的所有变化;
  • 逻辑日志则是只会记录SQL语句的增删改查对数据的影响。

但在分布式系统里,日志可以理解为两种模型。

  • state machine model认为所有机器都是平等的,用户发送的请求会首先发送到各个服务器,每个服务器上的日志进而发生改变,用户在读取日志时会是从各个服务器进行读取;
  • primary-backup model会将服务器区分为主从两种,用户发送的日志发送改变的请求都由主机接收处理,再由主机同步到日志上,从机再读取日志。

在数据库里相爱相杀的日志和表

在数据库里,日志类似于银行里每一次转账的记录,而表是银行里现有的存款记录。当日志发生改变时,会将发生的变化应用在表上,而表则是记录着最新状态的日志。相反的,当表发生改变时,改变的过程也会如实的记录在日志中,而这份日志保证了数据库可以实现近实时的备份数据。简而言之,表存储着数据,日志记录着变化。

原文发布于微信公众号 - 鸿的学习笔记(shujuxuexizhilu)

原文发表时间:2018-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据智能实战

HBase启动过于缓慢的原因及其优化策略

当HBASE导入了几十亿的数据记录时,某一天重启一下HBASE,发现启动过于缓慢,一直在提示PleaseHoldException:Master is init...

2369
来自专栏SeanCheney的专栏

Python的线程与进程

看过《Python分布式计算》,觉得线程和进程,最大的区别还是在于 —— 二者是如何与内存交互的。线程是共享式的内存架构,进程是分布式的内存架构,这才是问题的...

3428
来自专栏机器之心

资源 | 数据科学家必备的21个命令行工具

选自active wizards 机器之心编译 参与:蒋思源 在该篇文章中,我们将介绍用于快速分析存储于文本文件(日志、报文等等)中的数据的便利工具。 通常我们...

3008
来自专栏GopherCoder

『Ansible 上手指南』

1833
来自专栏前端开发

[记] 初次体验小程序绑定合法域名的坑

3.3K6
来自专栏性能与架构

负载均衡策略

1. HTTP重定向 当用户发来请求的时候,Web服务器通过修改HTTP响应头中的Location标记来返回一个新的url,然后浏览器再继续请求这个新url,...

4127
来自专栏java相关

Redis学习笔记01---配置文件

1304
来自专栏北京马哥教育

出了Linux 故障找不到方法?看大牛简单、朴实的解决思路

本文由马哥教育Linux云计算面授班23期学员推荐,转载自互联网,作者为Lis,Linux资深技术专家,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛...

4276
来自专栏Java后端技术

Centos7下安装redis实战(单机版以及集群)

  因项目需要,要引入redis做缓存,就在centos7下亲自安装了一遍redis,刚好趁着这个机会就来把redis的概念以及单机版和集群版redis安装步骤...

921
来自专栏我的技术专栏

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

1266

扫码关注云+社区

领取腾讯云代金券