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

    Auth:Jin
    Date: 20140604
    参考:
    http://redis.readthedocs.org/en/latest/topic/persistence.html#redis
    http://www.cnblogs.com/cxd4321/archive/2012/12/14/2817669.html

    RDB和AOF模式,默认RDB

    一、RDB
    ################################ SNAPSHOTTING #################################
    #
    # Save the DB on disk:
    #
    # save <seconds> <changes>
    save 900 1
    save 300 10
    save 60 10000
    900秒内至少有个1个key更改
    300秒内至少有10key个更改
    60秒内至少有10000key个更改
    三种情况都是从内存刷到磁盘

    这种持久化方式被称为快照(snapshot)。
    其他配置
    stop-writes-on-bgsave-error yes
    # 存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes
    rdbcompression yes
    rdbchecksum yes
    dbfilename dump.rdb #保存文件
    dir /var/lib/redis/default/ #保存目录

    二、AOF
    从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。
    ############################## APPEND ONLY MODE ###############################
    1.打开AOF功能
    appendonly no
    修改为yes打开

    2.选择刷操作的方式 默认每秒
    # appendfsync always
    appendfsync everysec
    # appendfsync no
    你可以配置 Redis 多久才将数据 fsync 到磁盘一次。
    有三个选项:
    always 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
    everysec 每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
    no 从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。
    推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。

    AOF策略设置为always或者everysec时,后台处理进程(后台保存或者AOF日志重写)会执行大量的I/O操作
    在某些Linux配置中会阻止过长的fsync()请求。注意现在没有任何修复,即使fsync在另外一个线程进行处理
    为了减缓这个问题,可以设置下面这个参数no-appendfsync-on-rewrite
    no-appendfsync-on-rewrite no #有问题才打开,没问题不打开

    3. AOF自动重写
    当AOF文件增长到一定大小的时候Redis能够调用 BGREWRITEAOF 对日志文件进行重写
    它是这样工作的:Redis会记住上次进行些日志后文件的大小(如果从开机以来还没进行过重写,那日志大小在开机的时候确定)
    基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动
    同时需要指定一个最小大小用于AOF重写,这个用于阻止即使文件很小但是增长幅度很大也去重写AOF文件的情况
    # 设置 percentage
    为0就关闭这个特性
    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb
    应该是大于64M会重写

    4.如果 AOF 文件出错了,怎么办?
    服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。
    当发生这种情况时, 可以用以下方法来修复出错的 AOF 文件:
    1)为现有的 AOF 文件创建一个备份。 cp一份。
    2)使用 Redis 附带的 redis-check-aof 程序,对原来的 AOF 文件进行修复。
    $ redis-check-aof --fix
    3)(可选)使用 diff -u 对比修复后的 AOF 文件和原始 AOF 文件的备份,查看两个文件之间的不同之处。
    4)重启 Redis 服务器,等待服务器载入修复后的 AOF 文件,并进行数据恢复。

    5.在线从rdb持久化切换到AOF持久话
    2.2以上版本可以
    1)为最新的 dump.rdb 文件创建一个备份。将备份放到一个安全的地方。
    cp /var/lib/redis/default/dump.rdb /var/lib/redis/default/bak-dump.rdb
    2)执行以下两条命令:
    redis-cli> CONFIG SET appendonly yes
    redis-cli> CONFIG SET save ""
    3)确保命令执行之后,数据库的键的数量没有改变。
    4)确保写命令会被正确地追加到 AOF 文件的末尾。
    5)修改配置文件 appendonly yes
    步骤 2执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。
    步骤 2 执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能。
    测试
    redis 127.0.0.1:6379> set level 2011
    OK
    # tail -f /var/lib/redis/default/appendonly.aof
    level
    $4
    2011

  • 相关阅读:
    Angular JS 中的内置方法之$watch
    Angular JS 中 指令详解
    Angular JS 中 ng-controller 值复制和引用复制
    git 使用技巧
    itextpdf 解析带中文的html问题
    详解Java 8中Stream类型的“懒”加载
    JSP网页处理过程
    [Java 8] (10) 使用Lambda完成函数组合,Map-Reduce以及并行化
    深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
    Android:联系人Contacts之ContentResolver query 参数详解
  • 原文地址:https://www.cnblogs.com/diege/p/3768553.html
Copyright © 2011-2022 走看看