文档章节

write-ahead-log与append-only-file的原理

巴顿.太一
 巴顿.太一
发布于 2017/04/08 09:34
字数 928
阅读 77
收藏 0
点赞 0
评论 0

    无论是RMSDB,还是NOSQL DB,如何最大程度上保证故障时的数据恢复,都涉及到数据持久化的技术。本位重点说明write-ahead-log与append-only-file这两种持久化机制的原理。

    write-ahead-log,WAL日志,是数据库中一种高效的日志算法。从数据库原理而言,它实现的是redo日志模式。即修改数据库时,不直接修改数据库内容,而是将修改完的数据写入日志同步到磁盘上,这样对其他读进程就没有影响。如果数据库崩溃,重启后扫描日志文件,然后更新到数据库中。为了提高效率,WAL日志模式提供checkpoint操作,来定时进行数据更新操作。

    以SQLite、MapDB为例,WAL的实现就是是按照上面原理来的。在更新数据页时,会将更新完的页先同步到磁盘上,并定时进行checkpoint操作。读数据库的时候,为了读到最新的页面,需要扫描日志文件,得到最新的数据页。为了提高日志文件扫描速度,还需要设计一些wal-index索引来加快对WAL日志的操作速度。

    append-only-file,AOF日志,以Redis为例。在Redis异常死掉时,最近的数据会丢失(丢失数据的多少视你save策略而定),当业务量很大时,可能丢失的数据会很多。Append-only方法可以做到全部数据不丢失,但Redis的性能就要差些。AOF就可以做到全程持久化,开启AOF之后,Redis每执行一个修改数据的命令,都会把它添加到aof文件中,当Redis重启时,将会读取AOF文件进行“Log-Rewriting 重放”以恢复到Redis关闭前的最后时刻。

    Log-Rewriting随着AOF文件越来越大,重放速度会越来越慢。但是AOF中如同流水账一样,会记录很多某一个key的全部变化过程。因此Redis有了一种比较有意思的特性:会在后台重建AOF文件,而不会影响client端操作。在任何时候执行BGREWRITEAOF命令,会对当前AOF中的数据进行整合,为每个key重新生成最短序列的AOF文件,这些数据完全可以用于构建当前某个Key的数据情况,而不会存在多余的变化情况(比如状态变化,计数器变化等),从而缩小了AOF文件的大小。所以当使用AOF时,redis推荐同时使用BGREWRITEAOF。

    AOF文件刷新的方式,有三种,参考配置参数appendfsync :appendfsync always每提交一个修改命令都调用fsync刷新到AOF文件,非常非常慢,但也非常安全;appendfsync everysec每秒钟都调用fsync刷新到AOF文件,很快,但可能会丢失一秒以内的数据;appendfsync no依靠OS进行刷新,redis不主动刷新AOF,这样最快,但安全性就差。默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾。

    LOG Rewrite的工作原理:同样用到了copy-on-write:首先redis会fork一个子进程;子进程将最新的AOF写入一个临时文件;父进程增量的把内存中的最新执行的修改写入(这时仍写入旧的AOF,rewrite如果失败也是安全的);当子进程完成rewrite临时文件后,父进程会收到一个信号,并把之前内存中增量的修改写入临时文件末尾;这时redis将旧AOF文件重命名,临时文件重命名,开始向新的AOF中写入。

© 著作权归作者所有

共有 人打赏支持
巴顿.太一
粉丝 3
博文 67
码字总数 75265
作品 0
海淀
技术主管
redis 源代码分析 – persistence

redis有全量(save/bgsave)和增量(aof)的持久化命令。 全量的原理就是遍历里所有的DB,在每个bucket,读取链表的key和value并写入dump.rdb文件(rdb.c 405)。 save命令直接调度rdbSave函...

鉴客 ⋅ 2011/08/31 ⋅ 0

编写GO的WEB开发框架 (十): Log和Access_Log

日常开发中,Log是必不可少的一部份,一个易用的框架,应该提供一套易用的日志处理方法,本篇来讲一下我是怎么实现日志相关处理的,内容包括日志的开关、日志记录和方法调用以及access_log。...

TimWong ⋅ 2016/03/12 ⋅ 0

How Logs Work On MySQL With InnoDB Tables

这篇帖子个人感觉写得非常棒,不转不行 In this article I will describe how logs work with MySQL and InnoDB. Very little of this material is in the manual. I gleaned it from the so......

长平狐 ⋅ 2012/11/01 ⋅ 0

logcat保存当前应用程序的日志并上传服务器或指定邮箱

package org.and.util; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; impo......

crystaltiger ⋅ 2013/11/18 ⋅ 0

Log4j日志输出详解

log4j的初始化,Logger的实例为NOPLogger,所有Appender,委托给 rootLogger管理,今天我们来看一下,日志的打印输出。 日志输出源头为下一句 Java代码 log.info("========test daily level...

sdrkmb ⋅ 2016/10/23 ⋅ 0

重归混沌/silly

silly Depend sudo apt-get install libreadline-dev(debain) yum install readline-devel(centos) Build make linux make macosx Run ./silly Config daemon, 1 --> run as daemon, 0 --> n......

重归混沌 ⋅ 2017/07/18 ⋅ 0

Hadoop学习笔记7: 0.1.0的conf学习

0.1.0文件分析 类的关系图 Configurable【接口】 public interface Configurable { void setConf(Configuration conf); //一个接口函数方法,设置配置对象 Configuration getConf(); //一个接...

强子哥哥 ⋅ 2014/08/07 ⋅ 0

MySQL 5.5 数据库 innodb_change_buffering 怪异问题分析

【导读】 最近我们接手一个第三方开发的游戏运维,所有的安装文档和软件包及配置参数都是第三方提供的,其中数据库部分使用的MySQL官方开源版本 MySQL5.5.20,配置文件也是第三方提供的,我们...

鉴客 ⋅ 2012/03/28 ⋅ 0

FastDFS集群tracker实现负载均衡

简单介绍: FastDFS作者余庆,是一套开源的分布式文件系统。 功能:文件存储、同步、上传、下载,提供负载均衡功能,适合用于图片、视频的存放。 角色: tracker 作用:任务调度接受客户端的...

蜗牛的嘲讽 ⋅ 2017/06/27 ⋅ 0

Write-Ahead Transaction Log

引用:http://msdn.microsoft.com/en-us/library/ms186259(SQL.90).aspx 最近在学习sql server事务日志的东西,知道现在大部分数据库都支持先写log再写数据的策略,也就是保证数据不先于日志...

嗯哼9925 ⋅ 2017/12/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

vuex学习

1、getters基本用法: 在store.js里面用const声明我们的getters属性。 const getters={ count:function (state) { return state.count +=100; }} export default new Vuex.S......

大美琴 ⋅ 42分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 54分钟前 ⋅ 0

G6 关系数据可视化图形库 简单使用

官网 https://antv.alipay.com/zh-cn/g6/1.x/index.html 效果 首先生成给定数目的小球,并设置随机的颜色 按照顺序,设置小球的角度以及坐标 设置定时器,每隔一定的时间修改小球的角度和坐标...

阿豪boy ⋅ 56分钟前 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

桥接设计模式

1、概述: 将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化 如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构 桥接模式将继承模式转化成关联关系,他降...

职业搬砖20年 ⋅ 今天 ⋅ 0

20.zip压缩 tar打包 打包并压缩

6月25日任务 6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩 6.5 zip压缩工具: zip支持压缩目录 zip压缩完之后原来的文件不删除 不同的文件内容其实压缩的效果不一样 文件内有很多重复的用xz压...

王鑫linux ⋅ 今天 ⋅ 0

double类型数据保留四位小数的另一种思路

来源:透析公式处理,有时候数据有很长的小数位,有的时候由在四位以内,如果用一般的处理方法,那么不足四位的小树会补充0到第四位,这样子有点画蛇添足的感觉,不太好看。所以要根据小数的...

young_chen ⋅ 今天 ⋅ 0

Django配置163邮箱出现 authentication failed(535)错误解决方法

最近用Django写某网站,当配置163邮箱设置完成后,出现535错误即:smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed') Django初始配置邮箱设置 EMAIL_HOST = "smtp.1...

陈墨轩_CJX ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部