zoukankan      html  css  js  c++  java
  • redis-运维-持久化

    什么是redis持久化

    将数据持久化到硬盘,当redis重启时使数据不会消失 继续使用

    快照

    通过快照可获得某一个时刻的数据副本并持久化到硬盘,可以通过快照复制到其他服务器创建相同的数据服务器,也可以留在本地便重启恢复数据使用。

    快照如果创建失败或者未创建,将会丢失上一次创建快照之后的命令数据。

    创建快照的几种时机

    1.使用bgsave命令,redis会调用一个fork创建一个子进程,子进程负责将快照写入硬盘,父进程继续接受请求

    本地:0>bgsave
    Background saving started

    2.使用save命令,save和bgsave 都会调用调用 rdbSave 函数 save会阻塞主线程,而bgsave会fork一个子进程调用,并立即返回"Background saving started" bgsave更适合线上运维使用

    更适合线上运维使用 

    本地:0>save
    OK

    3.配置了config save {秒} {多少次写入} 满足条件会自动调用bgsave

    启动需要指定:./redis-server redis.conf  config

    #   满足以下条件将会同步数据:
    #   900秒(15分钟)内有1个更改
    #   300秒(5分钟)内有10个更改
    #   60秒内有10000个更改
    #   Note: 可以把所有“save”行注释掉,这样就取消同步操作了
    
    save 900 1
    save 300 10
    save 60 10000
    
    # 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
    rdbcompression yes
    
    # 指定本地数据库文件名,默认值为dump.rdb
    dbfilename dump.rdb
    ————————————————
    # 工作目录.
    # 指定本地数据库存放目录,文件名由上一个dbfilename配置项指定
    # 
    # Also the Append Only File will be created inside this directory.
    # 
    # 注意,这里只能指定一个目录,不能指定文件名
    dir ./

    4.通过SHUTDOWN来关闭redis服务器会执行一次save命令

    本地:0>SHUTDOWN
    Connection error:Execution timeout

    5.子服务器向主服务器发送sync命令,如果主服务器没执行过bgsave或者最近没执行,则会触发一次bgsave

    缺点

    会丢失部分数据,备份会造成阻塞,bgsave 虽然是fork一个子进行进行写入硬盘,但是生成一个快照会造成redis的阻塞,生成快照会随着redis内存占用增长而增长。

    一个gb数据大约会消耗10~20毫秒,如果20gb则会阻塞 200~400毫秒(可以将自动备份改为手动执行备份,比如通过脚本 每天晚上凌晨备份)

    save和bgsave 《redis实战》

    可能虚拟机没有足够你内存 到时bgsave耗时很久

    AOF持久化

    AOF持久化是将写命令 写入到AOF文件末尾,然后根据AOF日志文件重放写命令就能恢复数据

    AOF开启配置

    启动需要指定conf:./redis-server redis.conf 

    # 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
    # 因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no yes则为打开
    appendonly yes
    
    # 指定更新日志条件,共有3个可选值:
    # no:表示等操作系统进行数据缓存同步到磁盘(快) 不推荐使用,当系统崩溃会丢失不定的数据
    # always:表示每次写操作后手动调用fsync()将数据写到磁盘(慢,安全) 会对磁盘进行大量写入 对磁盘性能要求太高,
    #转盘式硬盘每秒可执行200个写命令,固态硬盘每秒可执行几万个写命令
    # everysec:表示每秒同步一次(折衷,默认值) 推荐使用 极端情况也会丢失1秒内的数据
    appendfsync everysec
    #如果AOF日志文件增大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。
    auto-aof-rewrite-percentage 100
    #重写日志的最小尺寸,这样避免了达到指定百分比但尺寸仍然很小的情况还要重写。
    auto-aof-rewrite-min-size 64mb

    《redis实战》

    AOF重写

    aof和快照一样,会fork一个子进行进行重写

    随着时间推移,执行的写命令越来越多,AOF日志文件则会越来越大。如果不加以控制 会比快照文件大几倍,在进行AOF进行重写时删除一个旧的十几GB的AOF文件导致操作系统挂起数秒

    AOF手动重写

    本地:0>bgrewriteaof
    Background append only file rewriting started

    AOF自动重写

    #当AOF文件大于64M并且是上一次重写后的1倍 则触发重写 自动调用bgrewriteaof
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb

     AOF和RDB文件修复

    当redis服务器down机aof或者RDB数据格式错误,启动不起来时

    [root@db redis]# cd /usr/local/redis/bin
    [root@db redis]# cp appendonly.aof appendonly.aof.bak
    [root@db redis]# redis-check-aof --fix appendonly.aof
    0x        c93488e5: Expected prefix '
    AOF analyzed: size=3375772775, ok_up_to=3375663333, diff=109442
    This will shrink the AOF from 3375772775 bytes, with 109442 bytes, to 3375663333 bytes
    Continue? [y/N]: y
    Successfully truncated AOF
  • 相关阅读:
    【云图】如何制作附近实体店的地图?-微信微博支付宝
    【云图】如何设置支付宝里的家乐福全国连锁店地图?
    【云图】如何设置微信里的全国实体店地图?
    【云图】如何制作官网上的实体店分布图?
    MYSQL 锁机制 分析
    数据结构-线性表-栈-递归
    mysql 异步执行 query //@todo
    C语言操作mysql
    linux gcc头文件搜索路径
    LINUX下动态库及版本号控制
  • 原文地址:https://www.cnblogs.com/LQBlog/p/13297803.html
Copyright © 2011-2022 走看看