• redis 之 持久化


    Redis支持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。

    1、RDB持久化

    RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。

    1.1、触发机制

    对RDB来说,提供了三种触发机制:save、bgsave、自动化。

    1.1.1、save

    该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流程如下:

     执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。

    1.1.2、bgsave

    执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:

    具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

    1.1.3、自动触发

    自动触发是由我们的配置文件来完成的。在redis.conf配置文件中,里面有如下配置:

    # redis是基于内存的数据库,可以通过设置该值定期写入磁盘。
    # 注释掉“save”这一行配置项就可以让保存数据库功能失效 
    # 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) 
    # 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化) 
    # 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化)
    save 900 1
    save 300 10
    save 60 10000
    
    #当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
    stop-writes-on-bgsave-error yes
    
    #使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间
    rdbcompression yes
    
    #是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。
    rdbchecksum yes
    
    #rdb文件的名称
    dbfilename dump.rdb
    
    #数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
    dir /data

    1.2、RDB的优势和劣势

    优势

    1. RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快。
    2. dump.db是一个二进制文件,文件占用空间小。
    3. 生成RDB文件的时候,redis主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO操作

    劣势

    1. 当出现异常退出时,会丢失最后一次快照后的数据
    2. 当fork的时候,内存的中的数据会被克隆一份,大致两倍的膨胀需要考虑。而且,当数据过大时,fork操作占用过多的系统资源,造成主服务器进程假死
    3. RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运 行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。

    1.3、使用场景

    1. 数据备份
    2. 可容忍部分数据丢失
    3. 跨数据中心的容灾备份

    2、AOF持久化

    以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取改文件重新构建数据。保存的是appendonly.aof文件。

    2.1、使用AOF

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

    appendonly yes

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

    2.2、AOF持久化策略

    #aof持久化策略的配置
    #no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
    #always表示每次写入都执行fsync,以保证数据同步到磁盘。
    #everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
    appendfsync everysec

    2.3、AOF重写

    AOF采用文件追加方式,文件会越来越大为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集.可以使用命令bgrewriteaof。

    2.3.1、如何实现重写的?

    AOF文件持续增长而过大时,会fork出一条新进程来将文件重写(也是先写临时文件最后再rename),遍历新进程的内存中数据,每条记录有一条的Set语句。重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

    2.3.2、AOF重写触发机制

    AOF重写过程可以手动触发和自动触发:

    手动触发:直接调用bgrewriteaof命令。

    自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时机

    auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认 为64MB。

    auto-aof-rewrite-percentage:代表当前AOF文件空间 (aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。

    自动触发时机=aof_current_size>auto-aof-rewrite-minsize&&(aof_current_size-aof_base_size)/aof_base_size>=auto-aof-rewritepercentage

    其中aof_current_size和aof_base_size可以在info Persistence统计信息中查看

    2.4、AOF的优势和劣势

    AOF的优势:

    1. 备份机制更稳健,丢失数据概率更低
    2. 可读的日志文本,通过操作AOF稳健,可以处理误操作。
    3. AOF日志文件没有任何磁盘寻址的开销,写入性能非常高,文件不容易破损。

    AOF的劣势:

    1. 比起RDB更占用磁盘空间。
    2. 回复备份的速度慢。
    3. 每次读写同步的话,有一定的性能压力。
    4. 存在BUG,可能不能完全恢复一摸一样的数据。

    3、AOF和RDB同时开启,Redis听谁的?

    同时开启Redis执行AOF。具体流程如下:

  • 相关阅读:
    Codeforces Round #439 (Div. 2) B. The Eternal Immortality
    Codeforces Round #439 (Div. 2) A. The Artful Expedient
    Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0
    ClassLoader
    UVA 10790 How Many Points of Intersection?
    HDU 4628 Pieces
    Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法
    thrift之TTransport层的分帧传输类TFramedTransport
    VB6基本数据库应用(四):数据的提取,新增和修改
    android 开发中判断网络是否连接的代码
  • 原文地址:https://www.cnblogs.com/zero-vic/p/13386676.html
Copyright © 2020-2023  润新知