redis配置rbd宕机持久化,及重启恢复数据

1.Redis 持久化方案

  1. RDB(Redis DataBase)
  2. AOF(Append Of File)

这里我们使用RDB

2. RDB概述

RDB在指定的时间间隔内将内存当中的数据集快照写入到磁盘当中,也就是 Snapshot 快照,恢复时将快照文件当中的内容读取到内存 当中。

3.实现RDB配置

dbfilename

Redis 当中的快照的文件是名为 dump.rdb 文件,这是默认的,建议不修改

dir

默认为 Redis 启动时命令行所在的目录下 ./        (建议修改为固定回档文件夹)

重点:在不同目录下启动 Redis 时,`./` 指向的路径会发生变化。例如,在 `/usr/local/bin` 目录下启动 Redis,`./` 指向 `/usr/local/bin`;而在 `/root/` 目录下启动 Redis,`./` 则指向 `/root/`。这种路径变化可能导致配置文件加载错误。例如,如果 Redis 配置文件路径为 `./redis.conf`,在 `/root/` 目录下启动时,实际加载的配置文件路径为 `/root/redis.conf`,而非预期的 `/usr/local/bin/redis.conf`。 所以建议修改为固定回档文件夹。

快照配置

手动备份命令

redis-cli bgsave    Redis 会在后台异步进行快照操作,快照同时还可以响应客户端请求
redis-cli save  save 时只管保存,其它不管,全部阻塞。手动保存,不建议

自动备份大部分情况下无法满足使用 建议手动备份


特殊配置 以下配置无特殊要求可以忽略


stop-writes-on-bgsave-error

  • 意思是:当 Redis 无法写入磁盘的话(比如磁盘满了), 直接关掉 Redis 的写操作。推荐 yes

 rdbcompression

  • 对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis 会采用 LZF 算法进行压缩。
  • 如果你不想消耗 CPU 来进行压缩的话,可以设置为关闭此功能,默认 yes。

rdbchecksum

  • 在存储快照后,还可以让 redis 使用 CRC64算法来进行数据校验,保证文件是完整的。
  • 但是这样做会增加大约 10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能,推荐 yes 打开。

4.启动测试配置是否符合预期

redis-cli CONFIG GET dir
redis-cli CONFIG GET dbfilename

确认是否与你配置的一样,不一致可以参考dir配置重点项,或指定配置文件启动 redis-server /home/soft/redis-3.0.5/redis.conf  &

 5.RDB 备份&恢复

执行代码 获取必要信息

    redis-cli CONFIG GET dir  需要恢复的地址{/path}
    redis-cli CONFIG GET dbfilename 需要恢复的文件名称{filename}

     将rdb文件修改为{filename} 放入{/path/}下,重启redis,查看数据恢复情况

    注意:执行恢复前一定要执行这两行代码,获取准确信息,大部分情况下恢复不成功都是因为正确地址和预想的地址不一致,而不是配置又问题

    6. RDB 优势 和 劣势

    优势:

    1. 适合大规模的数据恢复
    2. 对数据完整性和一致性要求不高更适合使用
    3. 节省磁盘空间
    4. 恢复速度快

    劣势:

    1. 虽然 Redis 在 fork 时使用了写时拷贝技术(Cop-On-Write) ,但是如果数据庞大时还是比较消耗性能。
    2. 在备份周期在一定间隔时间做一次备份,所以如果 Redis 意外 down 掉 的话(如果正常关闭 Redis仍然会进行 RDB 备份,不会丢失数据),就会丢失最后一次快照后的所有修改。
    ### Redis 的使用方法及常见面试问题 #### 一、Redis 执行 Lua 脚本如何保证原子性? 当 Redis 执行 Lua 脚本时,它会将整个脚本作为一个整体来执行,在此期间其他客户端无法中断该脚本的执行[^1]。这是因为 Redis 是单线程模型,Lua 脚本一旦开始执行就会占用主线程直到完成,从而实现了所谓的“伪事务”。这种机制并不是通过显式的事务控制语句(如 `MULTI` 和 `EXEC`),而是依赖于单线程特性来保障脚本内的操作顺序性和一致性。 ```lua -- 示例 Lua 脚本 local count = redis.call('GET', KEYS[1]) if tonumber(count) > 0 then redis.call('DECR', KEYS[1]) return true else return false end ``` 上述代码展示了如何利用 Lua 脚本来实现复杂的逻辑并保持其原子性。 --- #### 二、Redis 单线程与多线程的关系及其性能瓶颈分析 尽管 Redis 在版本 6.0 前一直采用单线程架构设计,但从 Redis 6.0 开始引入了多线程支持用于优化网络 I/O 处理效率[^2]。然而值得注意的是,核心命令的实际执行仍然维持在单一主线程上以简化同步复杂度和减少竞争条件的发生概率[^4]。因此即使有了多线程改进措施,对于高并发场景下的大规模数据集管理来说,内存容量扩展依然是提升吞吐量的重要手段之一[^3]。 --- #### 三、关于 Redis 持久化的几种方式介绍 为了防止意外宕机造成的数据丢失风险,Redis 提供了几种不同的持久化策略选项: - **RDB (Redis Database File)**: 它会在指定的时间间隔内自动保存数据库状态快照至磁盘文件中; - **AOF (Append Only File)**: 记录每次写入操作的具体指令序列以便后续恢复原始数据集合内容; - 综合两者优点还可以启用混合模式即同时开启 RBD+AFO 方案进一步增强可靠性保障水平. --- ###
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值