4.进阶篇:Redis 持久化处理

Redis持久化详解与实战

Redis持久化方式

Redis是支持RDB和AOF两种持久化的机制,持久化的功能可以有效的避免当进程崩溃、退出时造成的数据损失。当进程退出后,我们下次启动的时候,利用之前持久化的文件马上就可以恢复原有的数据。我们先大致理解一下官方的介绍:

RDB持久化的方式,是在指定条件下,能对数据库进行快照存储。比如手动触发或者自动按照时间间隔。

AOF持久化是以记录命令为条件来完成的。

AOF打开的时候,对Redis的所有写操作全部按照redis的协议格式进行保存,把新的命令追加到文件末尾来完成aof文件的保存。前边也介绍过可以通过BGREWRITEAOF 这个命令完成aof文件的重写,不至于让aof文件过大,成为磁盘或者恢复时的负担。

Redis 还可以同时打开RDB和AOF持久化,重启的时候优先使用AOF文件,因为AOF文件更完整。

持久化模式对比图表

存储方式 优点 缺点 场景建议
RDB 1、文件紧凑,占用磁盘小

2、适用灾难恢复,可把文件备份至异地

3、恢复快,在大数据时恢复速度比AOF快

1、出现故障时、数据会少量丢失

2、保存RDB系统资源紧张时可能会影响访问

1、允许少量数据丢失,需要更好的性能下选择 比如存放每天的定期的数据,比如计算好的推荐数 据,由于几乎不更新使用这种模式更快的恢复,数 据上也不会有太大损失
AOF 1、数据安全性高,最多一秒数据损失

2、数据文件可修复,易恢复

3、可重新AOF,降低磁盘容量消耗

4、误操作命令可通过A0F文件重写恢复

1、A0F对比RDB同等数据更占用磁盘容量

2、使用fsync速度对比会变慢。

3、恢复是需要fork更大的内存

4、恢复时可能会因为文件内某个命令出 现bug恢复失败

1、对数据安全性有较高要求的时候。 比如我存放文章评论、点赞等信息。故障时减少数 据损失
RDB+AOF 1、同上两条

2、不会同时执行rdb快照和AOF重新避免高I/0

3、数据安全系数更好

1、磁盘消耗两份文件肯定更占用磁盘

2、CPU消耗,定期执行两种的持久化

用于数据安全性较高的数据,定期远程备份RDB。我 们对历史数据有恢复或者查询要求时,也建议选择 这种。可以更好的保证数据的完整性
MEM 1、速度快

2、速度很快

3、速度非常快

故障不可恢复 缓存雪崩概念 数据量小、纯缓存。集群缓存等。在使用过程中 无需保存数据,仅为提高用户感受提升访问速度

RDB快照详解

在通常的情况下,Redis的快照将会保存在dump.rdb的二进制文件中,文件在我们配置的datadir 的目录下可以找到。

我们可以对Redis进行设置,让redis在 “x秒内数据集至少Y个改动”这种条件下自动保存一次快照。比如设置为 save 20 500 这个配置20秒内 500个改动保存一次。本次保存至下次满足条件保存的数据,崩溃时会丢失。

多个策略并行 通过配置可以看到我们可以根据实际的应用场景,设置多个保存策略,当满足某一个策略时,都会保存数据集。2.png

RDB工作方式

1.调用fork(),发起一个子进程。不影响父进程的正常工作。

2.父进程处理正常请求,子进对数据集进行保存。

3.子进程完成新的RDB文件,Redis将使用新的RDB文件替换并删除旧文件。此机制可不产生垃圾文件。3.png上图可以看到执行bgsave操作时,产生一个临时的rdb文件,在重新完成后,将更新和替换原来的dump.rdb文件。

孤舟大师免费大奉送了

Python篇

为了让大家能更好的理解和演示,希望大家也能有同样的数据环境。比如bgsave的操作,如果数据量比较小的话,是不能捕捉到临时文件替换rdb文件的。所以希望大家可以使用简单的工具,创造出模拟数据。学习起来更直观和容易理解。

1.安装python

2.安装pip

3.编写脚本插入数据

这里风险脚本内容,安装python和python-redis大家开动脑筋,多多思考和用脑啊。哈哈

#!/usr/bin/python
# -*- coding:utf-8 -*-  
import redis
//连接redis
r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True)
//使用for循环,插入1-5000000条记录
for i in range(1,5000000):
    r.set('name%d' %i, 'yiyeguzhu%d' %i)

Append-only file,AOF 详解

 

通过字面意思也可以清晰看到 只对文件进行追加,真的简单易懂啊。下边我们来更加深入了解一下,这个追加文件,到底是怎么回事儿吧。

1.首先通过配置文件打开 AOF 功能,临时配置的希望加不要忘记哦,参考config set 命令。appendonly yes2.打开AOF功能之后,我们所有对数据的写操作,插入或者update、以及删除都会写入到AOF文件末尾。

3.AOF 的重写 以点赞数量为例,我们只需要对点赞的数量进行统计出最后的总数即可。我们每次点赞操作都会调用 INCR 来获取当前的值即可。但是AOF文件会记录到我们每一次调用的记录。这样会导致我们的AOF文件比较臃肿。因为前边的数据记录对于我们来讲没有意义。这个时候我们可以通过 BGREWRITEAOF 进行重写。

4.和RDB相同调用子进程来完成,不影响父进程处理其他请求。重新完成后,新的aof文件会替换旧文件。4.png5.AOF持久化策略之fsync

只要数据有变化马上追加到文件内 对于大量写入的不适合,会严重影响性能

每秒执行一次文件写入 速度快,出现故障时仅丢失1秒数据,默认为每秒写入这种模式。

从不写入到磁盘,等待手动调用。这种性能好,安全性不高。

 

# appendfsync always   #数据变化马上fsync
appendfsync everysec   #每秒同步一次
# appendfsync no       #从不进行fsync

6.AOF文件查看

大家可以通过策略制定每秒把数据变化同步到数据文件中,这个追加保存是按照redis内部协议完成的。但是大家可以通过以上的python脚本,模拟写入操作,然后观察一下AOF文件内容的变化。5.png

题外篇

终于写完了,知识很重要、如何运用知识更重要。好比《侠客行》 里的石破天一样,单纯的有一身好的内力是不够的。还是需要通过实战和高手指导,融汇贯通。

由于经常修改配置,需要重启redis,深感不便啊。简单写了个重启的脚本,大家参考一下。功能过于简单,不做讲解。

 

#!/bin/bash
stop() {
  kill -9 `ps aux | grep redis-server | grep 6379 | grep -v grep | awk '{print $2}'`
}
start() {
 ./bin/redis-server ./conf/redis.conf
}
case "$1" in
      "start")
          start
          echo "redis server start"
             ;;
       "stop")
          stop
          echo "redis server stop"
             ;;
        "restart")
           stop
           start
           echo "redis server restart"
             ;;
          *)
           echo "input stop/start/restart"
             ;;
esac

 

@版权声明:51CTO独家出品,未经允许不能转载,否则追究法律责任

 

版权声明:
作者:WaterBear
链接:https://l-t.top/2118.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录