zoukankan      html  css  js  c++  java
  • Redis(六)

    Redis的持久化

    Redis 为什么要持久化?

    Redis 中的数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis 支持各种不同方式的排序。与 Memcached 一样,为了保证效率,数据都是缓存在内存中。

    对,数据都是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据都会消失殆尽,再也找不回来了。所以,为了让数据能够长期保存,就要将 Redis 放在缓存中的数据做持久化存储。

    Redis提供了2种不同形式的持久化方式

    RDB(Redis Database)

    AOF (Append Of File)

    RDB

    在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复是将快照文件直接读到内存里。

    备份如何执行的

    Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换

    到上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据恢复操作,且对于

    数据恢复的完整性不是很敏感,那么RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失(正常退出如shutdown会完整保存)。

    关于fork

    在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会被exec系统调用,出于效率考虑,Linux中引入了“写时复制技术”(需要写的时候再复制),

    一般情况父进程和子进程会共用同一段物理内存,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。

    RDB的保存文件

    在redis.conf中配置文件名称,默认为dump.rdb

    dbfilename dump.rdb

    rdb文件的保存路径,也可以修改,默认为./,也就启动redis的当前路径下

    dir ./

    rdb的保存策略

    save seconds changes 多少秒之内完成对数据库的多少次更改之后就会持久化

    save 900 1 在900秒完成一次对数据库的更改就会进行持久化

    命令save

    只管保存,其他不管,对Redis的所有操作全都阻塞

    stop-writes-on-bgsave-error yes

    当Redis无法写入磁盘的话,直接关掉Redis的写操作。

    rdbcompression yes

    进行rdb保存时,将文件压缩

    rdbchecksum yes

    在存储快照后,还可以将Redis用CRC64算法来进行数据的校验,以检查数据是否准确,但这样会增加大约10%的性能消耗,如果希望获取到最大性能,可以关闭此功能

    rdb的备份

    先通过config get dir 查询rbd文件的目录

    将*.rbd的文件拷贝到别的地方

    rdb的恢复

    关闭Redis

    先把备份的文件拷贝到工作目录下

    启动Redis,备份文件会直接加载

    rdb的优点:

    节省磁盘空间

    恢复速度快

    rdb的缺点:

    虽然使用了写时拷贝技术,但数据太大时还是会消耗性能

    备份周期在一定间隔时间做一次备份,如果Redis意外down掉,就会丢失最后一次快照后的所有修改,就是我之前所说的RDB的缺点是最后一次持久化后的数据可能丢失

    rdb与aof

    rdb保存的数据,aof保存的指令

    AOF

    以日志的形式来记录每个写操作,通过执行日志文件的指令完成数据恢复工作

    AOF默认不开启,需要手动在配置文件中配置

    appendonly no

    可以在redis.conf中配置文件名称,默认为appendonly.aof

    appendfilename "appendonly.aof"

    AOF文件的保存路径,同rdb文件一致

    dir ./ #这个配置对rdb有用,对aof也有用#

    aof和rdb同时开启,Redis会听谁的?

    以AOF为准

    AOF文件故障备份

    AOF的备份机制和性能虽然和RDB不同,但是备份和恢复的操作同RDB一样,都是拷贝备份文件,需要恢复时再拷贝到Redis工作目录下,启动系统即加载

    AOF和RDB同时开启,系统默认取AOF的数据

    AOF文件故障恢复

    AOF文件的保存路径与RDB文件的保存路径一致

    如遇到AOF文件损坏,可通过

    redis-check-aof --fix appendonly.aof 进行恢复(基本没啥屌用)

    AOF同步频率设置

    始终同步,每次Redis的写入都会立刻记入日志

    每秒同步,每秒记入日志一次,如果宕机,本秒的数据可能丢失

    不主动进行同步,把同步时机交给OS(操作系统)

    appendfsync always 始终同步

    appendfsync everysec 每秒同步

    appendfsync no 不主动进行同步

    Rewrite

    AOF采用文件追加方式,由于指令的增多,文件会越来越大,为避免出现此种情况,新增重写机制,当AOF文件大小超过所设定的阈值时

    Redis就会启动AOF文件的内容压缩,只保留可恢复数据的最小指令集,可以使用命令bgrewriteaof

     

    AOF优点

    备份机制更稳定,丢失数据概率低

    可读的日志文本,通过操作AOF,可以处理误操作,比如flushdb就是写指令

    AOF的缺点

    比RDB占用更多的磁盘空间

    恢复备份速度更慢

    每次读写都同步的话,有一定性能压力

    存在个别BUG,可能会造成不恢复

  • 相关阅读:
    Log4Net记录到MySql
    创建快照
    grep的用法(CentOS7)及有关正则表达式的使用
    samba
    mkdir
    raid0和raid5的 实验过程
    route
    source和sh执行脚本时的差异
    echo命令的简单用法和实例
    smbpasswd和pdbedit
  • 原文地址:https://www.cnblogs.com/qyx66/p/12207793.html
Copyright © 2011-2022 走看看