现在的位置: 首页 > 综合 > 正文

redis的快照方式和aof方式简介

2013年11月05日 ⁄ 综合 ⁄ 共 1154字 ⁄ 字号 评论关闭

Redis是一个“纯内存”数据库(至少在2.4版本以后vm机制就被废弃掉了),内存数据持久化的方式有两种——快照方式与AOF方式,这里简要介绍一下两者区别。

实验环境

Redis Master(下面简称M)

Redis Slave(下面简称S)

另外写一个脚本频繁向M插入数据

1,采取SnapShotting

  • S数据库挂掉,M数据库继续提供服务,重启S数据库后,恢复和M一样
  • M数据库挂掉,脚本插入出错,M数据库来不及持久化内存数据,重启M数据库后,S数据库也恢复到M的内容,就算S数据库做了save操作也会丢失M没来得及“快照”的数据。大致过程如下:
		M(0)		S(0)		~~client begin to push data
		M(10054)	S(10054)	~~snapshot at 10054
		M(40614)	S(40614)	~~kill master
		M(down)		S(40614)	~~save S
		M(restart)	S(40614)
		M(10054)	S(10054)	~~S loses data too

这里比较费解,为了充分利用M数据库的性能,其实我们可以把数据库的持久化放在S来操作,可是为什么M挂掉重启后S的持久化并没有生效呢,求解释。一种解决方案是遭遇M挂掉时将S作为主库(Slave of none),重启的M数据库作为从库(Slave of <S IP>)来保证修复期间数据的一致性。

2,M数据库采用Append Only File

  • S数据库挂掉,M数据库继续提供服务,重启S数据库后,恢复和M一样
  • M数据库挂掉,重启M以后redis会参照aof文件恢复数据库内容,大致过程如下:
		M(0)		S(0)		~~client begin to push data
		M(40613)	S(40613)	~~kill master
		M(down)		S(40613)	~~save S
		[M dump.rdb 18B appendonly.aof 9.1M) and ((S dump.rdb 5.7M)]
		M(restart)	S(40613)
		M(40613)	S(40613)
		[M dump.rdb 5.7M appendonly.aof 9.1M) and ((S dump.rdb 5.7M)]

aof文件占用磁盘大从上面的对照可以看出,而且使用aof功能后对性能上有一点影响,不过测试了一下,约莫估计性能差别也是在10%以内吧。

使用redis时最好设置maxmemory,根据我们的业务事先估计所需的内存量,我刚开始用redis时冒失地让它跑满虚拟机的内存,结果虚拟机经常出现死机。所以还需要预留一些闲置内存,按照下面一些资料的介绍说预留和redis占用内存同样大小的空间吧,没有详细分析测试。

相关资料

Redis存储及容灾策略

Redis 配置文件 redis.conf

对redis数据持久化的一些想法

Redis千万级的数据量的性能测试

抱歉!评论已关闭.