美文网首页
通过redis实现服务器崩溃宕机的数据恢复

通过redis实现服务器崩溃宕机的数据恢复

作者: 也许会了 | 来源:发表于2020-08-27 16:47 被阅读0次

由于redis存储在内存中且提供一般编程语言常用的数据结构存储类型,所以经常被用于做服务器崩溃宕机的数据恢复处理。

服务器可以在某些指定过程中将需要保存的数据以json对象等方式存储到redis中,也就是我们常说的快照,当服务器运行时读取redis来判断是否有待需要恢复数据继续处理的业务。

当一次业务处理结束后再删除redis的数据即可。

redis提供两种将内存数据导出到硬盘实现数据备份的方法:

RDB方式(默认)

RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上。进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。RDB是redis默认采用的持久化方式,在配置文件中已经预置了3个条件:

save 900 1    # 900秒内有至少1个键被更改则进行快照

save 300 10   # 300秒内有至少10个键被更改则进行快照

save 60 10000 # 60秒内有至少10000个键被更改则进行快照

可以存在多个条件,条件之间是“或”的关系,只要满足其中一个条件,就会进行快照。 如果想要禁用自动快照,只需要将所有的save参数删除即可。

Redis默认会将快照文件存储在当前目录(可CONFIG GET dir来查看)的dump.rdb文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。

Redis实现快照的过程

Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);

父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件;

当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。

在执行fork的时候操作系统(类Unix操作系统)会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时(如执行一个写命令

),操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork一刻的内存数据。

Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。这使得我们可以通过定时备份RDB文件来实

现Redis数据库备份。RDB文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。

除了自动快照,还可以手动发送SAVE或BGSAVE命令让Redis执行快照,两个命令的区别在于,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过fork子进程进行快照操作。

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。根据数据量大小与结构和服务器性能不同,这个时间也不同。通常将一个记录一千万个字符串类型键、大小为1GB的快照文件载入到内

存中需要花费20~30秒钟。

通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。这就需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。

AOF方式

默认情况下Redis没有开启AOF(append only file)方式的持久化,可以在redis.conf中通过appendonly参数开启:

appendonly yes

在启动时Redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些

开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:

appendfilename appendonly.aof

配置redis自动重写AOF文件的条件

auto-aof-rewrite-percentage 100  # 当目前的AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据

auto-aof-rewrite-min-size 64mb   # 允许重写的最小AOF文件大小

配置写入AOF文件后,要求系统刷新硬盘缓存的机制

# appendfsync always   # 每次执行写入都会执行同步,最安全也最慢

appendfsync everysec   # 每秒执行一次同步操作

# appendfsync no       # 不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次),最快也最不安全

Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少

redis = require('redis'),//导入js模块

RDS_PORT = ,        //端口号

RDS_HOST = '',    //服务器IP

RDS_OPTS = {},            //设置项

redisdb = redis.createClient(RDS_PORT, RDS_HOST, RDS_OPTS);//创建连接

redisdb.select(20);//指定分区库

redisdb.on('ready', function (res) {

console.log('ready');

});

redisdb.on('connect', function () {

console.log('connect');

});

exports.redisdb = redisdb;

function redis_opt(opt, key, value, callback) {

if (opt == 'get') {

redisdb.get(key, function (err, data) {

if (err == null) {

callback(data);

}

else {

callback(err);

}

});

}

else if (opt == 'set')

{

redisdb.set(key,value, function (err,result) {

if (err == null) {

callback(result);

}

else {

callback(err);

}

});

}

else if (opt == 'del')

{

redisdb.del(key, function (err, result) {

if (err == null) {

callback(result);

}

else {

callback(err);

}

});

}

else

{

callback("error opt!");

}

}

function update(key)

{

redis_opt("get", key, null, function (data) {

console.log("the redis data is " + data);

if (data) {

count = parseInt(data);

redis_opt("set", key, ++count , function (data) {

console.log("set " + count  + " " + data);

});

}

else {

redis_opt("set", key, 10000, function (data) {

console.log("set " + 10000 + " " + data);

});

}

});

}

function clear(key)

{

redis_opt("del", key, null, function (ret) {

console.log("del " + key + " " + ret);

});

}

function main()

{

var key = "count_test";

setInterval(function () { clear(key) }, 5000);

setInterval(function () { update(key) }, 1000);

}

//testmain();

main();

以上代码为简单的计时器函数,即服务器启动后定时读取redis的数据,如果存在则累加修改,不存在则初始化,同时为了方便说明,又设置了一个定时删除数据的定时器。

本文来自PHP中文网的redis教程​栏目:https://www.php.cn/redis/

相关文章

  • 通过redis实现服务器崩溃宕机的数据恢复

    由于redis存储在内存中且提供一般编程语言常用的数据结构存储类型,所以经常被用于做服务器崩溃宕机的数据恢复处理。...

  • Redis持久化

    Redis持久化 为什么要持久化 Redis是内存数据库,宕机后数据会消失。 Redis重启后快速恢复数据,要提供...

  • (6)主从复制和哨兵

    先来简单了解下redis中提供的集群策略, 虽然redis有持久化功能能够保障redis服务器宕机也能恢复并且只有...

  • Redis - 持久化

    Redis是内存数据库,宕机后数据会消失。Redis重启后快速恢复数据,需要提供持久化机制 RDB RDB(Red...

  • Redis学习笔记系列(八)——Redis持久化

    6. Redis持久化 由于Redis是内存数据库,如果Redis实例宕机或者服务器断电,则重启后,Redis中的...

  • 自我系统学习Redis小记-02

    04 | AOF日志:宕机了,Redis如何避免数据丢失? 1、一个问题引出持久化:一旦服务器宕机,内存中的数据将...

  • 小伙用 12 张图给你讲明白 Redis 持久化!

    00 前言 很多小伙伴都用 Redis 做缓存,那如果 Redis 服务器宕机,内存中数据全部丢失,应该如何做数据...

  • 【Java进阶营】Redis的持久化策略

    如何保证Redis宕机之后重启可以将数据进行恢复?一般需要定时进行持久化将内存中的数据写入到硬盘中。Redis支持...

  • 日更六

    Redis的AOF机制会持久化保存Redis所有的操作记录,用于服务器宕机后的数据还原。那Redis什么时候将AO...

  • 【Redis 系列】redis 学习八,redis 持久化 RD

    Redis 持久化 redis 是内存数据库,如果不将内存中数据库保存到磁盘上,那么服务器一旦宕机,或者 redi...

网友评论

      本文标题:通过redis实现服务器崩溃宕机的数据恢复

      本文链接:https://www.haomeiwen.com/subject/qethsktx.html