Redis有两种持久化方式,AOF和RDB,AOF持久化是指追加写命令到aof文件的方式,RDB是指定期保存内存快照到rdb文件的方式。

RDB虽然可以通过bgsave指令后台保存快照,但fork()子进程是有开销的,在内存数据集较大的情况下会占用很长的cpu时间,fork新进程时,虽然可共享的数据内容不需要复制,但会复制之前进程空间的内存页表,如果内存空间有40G(考虑每个页表条目消耗 8 个字节),那么页表大小就有80M,这个复制是需要时间的,在有的服务器结点上测试,35G的数据bgsave瞬间会阻塞200ms以上,一般建议Redis使用内存不超过20g。I/O消耗,我们线上是在Slave节点开启rdb持久化,磁盘性能一般,1.2g的rdb文件持久化一分钟一次,一次大概耗时30s左右,所以rdb的频率也不能太频繁,需要根据情况做好配置。

AOF是追加写命令到aof文件的方式,优点是可以基本做到数据无损,缺点是文件增长较快,需要间歇性bgrewrite,bgrewrite也是一个既耗cpu又耗磁盘IO的操作,单cpu利用率最高可达100%。bgrewrite期间可以设置将新的写请求暂时缓存,bgrewrite完成后同步写盘,同步会暂时停止处理客户端请求,如果bgrewrite时间较长,缓冲区积压数据较多,核心阻塞时间会很长,所以如果必须要开启aof,一般建议找几个空闲时段设置脚本来做bgrewrite。

AOF还有一个比较坑的地方是刷盘策略fsync的设置,这个设置一般有3种方式:always、everysec、no,如果设置为no,就将写盘的时机交给操作系统,这在很大程度上牺牲了aof数据无损的优势,如果设置为always就意味着每条命令都会同步刷盘,会造成频繁I/O,所以一般建议是设置everysec,Redis会默认每隔一秒进行一次fsync调用,将缓冲区中的数据写到磁盘。但是当这一次的fsync调用时长超过1秒时。Redis会采取延迟fsync的策略,再等一秒钟。也就是在两秒后再进行fsync,这一次的fsync就不管会执行多长时间都会进行。这时候由于在fsync时文件描述符会被阻塞,所以当前的写操作就会阻塞,因为是同步操作所以核心处理阻塞,开启aof且要求Redis性能无损对磁盘有极高要求。下图是我们一段时间内的磁盘监控截图:

这种间歇性的磁盘IO毛刺就会使fsync阻塞,fsync阻塞时一般会输出如下日志:

持久化为Redis提供了异常情况下的数据恢复机制,但开启持久化是有代价的,哪一种持久化都可能造成CPU卡顿,影响对客户端请求的处理。不开启持久化又存在风险,如果一旦误重启master节点,或者试想这样一种场景,主从切换失败,很可能因为疏忽直接重启master,这时没有开启持久化的master会把所有slave的数据清0。所以是否开启持久化,怎样开启持久化是一个难题。和运维同事探讨了一些方案,这里总结一下供大家参考:

1、极端情况下可以容忍全量数据丢失,那么建议master关闭持久化,slave关闭持久化;

2、极端情况下不能容忍全量数据丢失,但可以容忍部分数据丢失,如果内存数据集较小且不会增长建议master开启rdb,slave开启rdb;如果数据集很大,或不确定数据集增长趋势,建议master关闭持久化,slave开启rdb

开启rdb需要cpu和磁盘性能保障。如果master关闭持久化,slave开启rdb需要保证slave的rdb不会被master误重启所覆盖,这里提供几种方案:

  • 重启脚本包一层命令先网络请求加载备机备份目录下的rdb文件后再执行start,可以防止误重启,但备机调整部署可能需要调整脚本,主机打开持久化也需要调整脚本

  • 定时将rdb文件通过网络io传给master节点(文件大比较耗时,文件增长需要考虑定时脚本执行间隔,否则会造成持续的网络io),而且也会有一定数据损失

  • 定时备份Slave的rdb到备份目录,不做任何其他操作,误重启时人工拷贝rdb到master节点(会有一定数据损失)

3、最大限度需要数据无损,建议master开启aof,slave开启aof

开启aof需要cpu和磁盘性能保障。开启aof建议fsync同步刷盘使用everysec,自定义脚本在应用空闲时定时做bgrewrite,bgrewrite期间增量数据做缓冲。

目前大部分业务都允许部分数据丢失,为使Redis性能最大化,关闭了Master持久化,slave开启rdb,为防止误重启对rdb做了5分钟一次备份,保留最近1小时的备份文件,必要时人工copy到master数据目录下恢复数据。后续硬件性能提升后,看情况再调整持久化机制

tips:注意,一般是在命令行做主从,同时主关闭持久化

做主从:

redis-cli -h ip -p
ip:>slaveof ip

关闭持久化:

config set save ""

redis主从持久化讨论的更多相关文章

  1. redis + 主从 + 持久化 + 分片 + 集群 + spring集成

    Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...

  2. Linux下的redis的持久化,主从同步及哨兵

    redis持久化 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失, 为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. RDB持久 ...

  3. Redis 主从配置和参数详解

    安装redis 下载redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz 解压redis tar -xvf redis-.ta ...

  4. redis主从,哨兵回忆手册

    redis主从 持久化的开启与主从集群是否生效无关系 Slave Server同样是以非阻塞的方式完成数据同步.在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据(注意初次同步则会阻 ...

  5. Redis数据"丢失"讨论及规避和解决的几点总结

    Redis大部分应用场景是纯缓存服务,请求后端有Primary Storage的组件,如MySQL,HBase;请求Redis的键未命中,会从primary Storage中获取数据返回,同时更新Re ...

  6. 深入理解Redis的持久化机制和原理

    Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...

  7. 那一天,我被Redis主从架构支配的恐惧

    面试官:要不你来讲讲你最近在看的点呗?可以拉出来一起讨论下(今天我也不知道要问什么) 候选者:最近在看「Redis」相关的内容 面试官:嗯,我记得已经问过Redis的基础和持久化了 面试官:要不你来讲 ...

  8. redis 主从同步

    修改redis.conf配置文件 vi redis.conf 在编辑模式下 输入  /slaveof 来搜索 将slaveof启用 即 将#删除 依次配置所有 slave 并将进程 kill 掉 重启 ...

  9. Redis主从自动failover

    Redis主从架构持久化存在一个问题,即前次测试的结论,持久化需要配置在主实例上才能跨越实例保证数据不丢失,这样以来主实例在持久化数据到硬 盘的过程中,势必会造成磁盘的I/O等待,经过实际测试,这个持 ...

随机推荐

  1. 加密连接工具Cryptcat

    加密连接工具Cryptcat   Cryptcat是网络工具Netcat的加密版本.Cryptcat支持TCP.UDP两种网络协议.它可以在两个计算机之间建立指定的连接,并使用特定的密钥对传输数据进行 ...

  2. SD 一轮集训 day3 染色(color)

    蜜汁打表题.. (首先L=1和L=N的情况过于傻逼(而且是特殊情况),可以先写出来,然后剩下的L的做法在下面) 首先你要写一个打表程序,找出{1,2,....,n} 乘若干个 循环唯一的轮换可以搞出的 ...

  3. 「PKUWC 2018」随机算法 (第二版,正解做法)

    上一版貌似是打了 O(3 ^ N) 暴力和 一条链的情况,得了60分.... 第一次做的时候光想练一练暴力...就没去想正解,谁知道正解比暴力好写不知道多少,mmp 设 f(S) 为 选集合S中的点可 ...

  4. 【数论】【枚举约数】【欧拉函数】bzoj2705 [SDOI2012]Longge的问题

    ∵∑gcd(i, N)(1<=i <=N) =k1*s(f1)+k2*s(k2)+...+km*s(km) {ki是N的约数,s(ki)是满足gcd(x,N)=ki(1<=x< ...

  5. [Gym101194G][CHINA-Final2016]Pandaria

    题目大意: 给你一个$n(n\le10^5)$个点,$m(m\le2\times10^5)$条边的无向图,每个点有一个颜色$c_i$,每条边有一个边权$w_i$.$q(q\le2\times10^5) ...

  6. 5.6(java学习笔记) queue

    一.queue接口 queue的中文意思是队列,是一种以先进先出方式处理数据的集合. 队列还提供额外的插入.提取和检查操作.这些方法都以两种形式存在:一种在操作失败时抛出异常,另一种返回特殊值(根据操 ...

  7. 如何移除inline-block元素之间的空白

    我们想要的是<li>元素可以紧贴在一起,但是很显然,结果“出乎意料”.那么有什么方法可以让结果符合我们的预期呢?所能想到的解决方法至少有以下四种,而每种方法也都有其优劣所在,至于要如何选择 ...

  8. ajaxfileupload-上传文件示例

    1.引用文件 ajaxfileupload.js @{ ViewBag.Title = "数据导入"; Layout = "~/Views/Shared/_IndexLa ...

  9. 日积月累--exception记录

    关于Android的sqlite数据类型text长度限制的问题? 这也许不能称为一个bug,但是比较坑,所以贴在了这里.在Android的sqlite中存储一个字符串,发现总是数据丢失,我去查询sql ...

  10. JS 创建长度为100的数组,数值为角标

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...