Redis存储及容灾策略

Redis利用内存发挥的高性能读写在很多场景下大有所为,但是Redis本身毕竟还是一个单机数据库,如果系统对其属于强依赖,那么还是必须做好必要的容灾,针对这个问题,有以下几种策略:

一、M/S切换

由于Redis是单机数据库,所以针对MySQL的一些容灾方案也能顺利适用,例如当Redis意外宕机,可以将请求马上切到备库,同时快速恢复数据。

二、AOF

Redis有两种持久化的方式,分别是SnapShotting和Append-Only File,其原理和特性可以参考《对redis数据持久化的一些想法》一文,总得来说,快照对性能影响更小,也只会备份需要的数据,但两次快照中间的数据是没法保证一定会持久化的。

相比之下AOF的粒度更细,持久化效果更好,类似于MySQL的BinLog,缺点是会损失一部分性能,而且会记录不必要的日志,这一点当系统运行时间很长时会特别突出,也许恢复所有数据本来只要1个小时,却可能要花100甚至1000小时去搞。

三、读取数据源直接恢复

这个方案是和业务场景相关的,由于之前某个项目中Redis起到了存放索引的作用,所以利用MySQL的数据可以容易地重新建立Redis的所有内容,这里可以临时搞一个Trigger,不断读MySQL写Redis,利用MySQL的顺序读和Redis高TPS的特性,实践中,可以在几分钟内重建上千万的数据量。

目前Redis在功能上通常仍用于Cache,如果需要保证HA的持久化存储,请考虑具体场景,此外也可以考虑是否可以使用原生分布式的memcached或升级硬件(如SSD、Fusion-IO)增强原有DB的性能。

我的应用里为了保证高性能,数据没有做dump,也没有用aof。因为不做dump发生的故障远远低于做dump的时候,即使数据丢失了,自动修复脚本可以马上数据恢复。毕竟对海量数据redis只能做数据分片,那么落到每个节点上的数据量也不会很多。

redis的虚拟内存建议也不要用,用redis本来就是为了达到变态的性能,虚拟内存、aof看起来都有些鸡肋。

现在还离不开redis,因为它的mget是现在所有db里性能最好的,以前也考虑过用tokyocabinet hash方式做mget,性能不给力。直接用redis,基本上单个redis节点mget可以达到10W/s

http://lkf0217.iteye.com/blog/1076700

从这个图中可以看出:

  1) 对于没有持久化的方式,读写都在数据量达到800万的时候,性能下降几倍,此时正好是达到内存10G,Redis开始换出到磁盘的时候。并且从那以后再也没办法重新振作起来,性能比Mongodb还要差很多。

  2) 对于AOF持久化的方式,总体性能并不会比不带持久化方式差太多,都是在到了千万数据量,内存占满之后读的性能只有几百。

  3) 对于Dump持久化方式,读写性能波动都比较大,可能在那段时候正在Dump也有关系,并且在达到了1400万数据量之后,读写性能贴底了。在Dump的时候,不会进行换出,而且所有修改的数据还是创建的新页,内存占用比平时高不少,超过了15GB。而且Dump还会压缩,占用了大量的CPU。也就是说,在那个时候内存、磁盘和CPU的压力都接近极限,性能不差才怪。

  总结一下:

  1) Redis其实只适合作为缓存,而不是数据库或是存储。它的持久化方式适用于救救急啥的,不太适合当作一个普通功能来用。对于这个版本的Redis,不建议使用任何的持久化方式。否则到时候可能会死的比较难看。说白了,期望Redis是memcached的升级版,带有各种数据结构,但是不要期望 Redis来和Mongodb/Kt等来比。

  2) 对于VM其实也是不建议开启,虽然开启VM可以让Redis保存比内存更多的数据,但是如果冷热数据不是很明显的话性能会非常差(我的测试都是随机查询 Key,冷热不明显)。当然,对于冷热明显的情况下可以设置200% - 400%的内存作为VM空间,也不建议设置10倍的内存空间作为VM(像我的配置一样)。

  3) ServiceStack.Redis客户端好像有几个Bug,首先RedisTypedClient的Dispose居然没有实现,应该是要调用 client.Dispose(),其次RedisNativeClient的Info属性不是每次都获取最新值的,第三 PooledRedisClientManager的WritePoolIndex和ReadPoolIndex只看到加没看到减的地方,也不知道这是干啥的,其实每次都取第一个不是Active的Client就可以了,PooledRedisClientManager也没有把超时使用的Active的 Client强制回收(避免使用的时候忘记Dispose占用过多的连接)。有关这几点,我会尝试联系ServiceStack.Redis的作者。

时间: 2024-10-26 05:41:03

Redis存储及容灾策略的相关文章

Redis全方位详解--磁盘持久化和容灾备份

序言 在上一篇博客中,博客介绍了redis的数据类型使用场景和redis分布式锁的正确姿势.我们知道一旦Redis重启,存在redis里面的数据就会全部丢失.所以这篇博客中向大家介绍Redis的磁盘持久化. REDIS持久化 以每隔一段时间对redis进行快照的方式实现持久化 RDB持久化 优点:1.对redis性能影响小. 2.数据集比较大的时候,恢复速度比AOF快.   3.RDB是一个非常紧凑的单一文件,很方便传到第三方数据中心(亚马逊S3),以便日后的灾难恢复. 缺点:1.因为RDB的快

让Veritas数据高可用容灾释放你的双手

简介:在大数据以PB增长的时代,保证数据高可用的同时,确保数据安全已经成为企业IT领导者及数据管理人员所急迫需解决的问题,Veritas深入地了解用户的各种存储需求,从而实现了简单.高效.可扩展.高敏捷.高洞察力的全线存储备份容灾解决方案.而为保证产品的高度兼容性,为此Veritas不断提升与精进,从而汇集了得天独厚的优势,实现了统一的混合云平台管理.成熟的企业级数据可伸缩性.超乎想象的即时数据恢复与自动复制.全索引直观数据检索等等,为几乎所有的企业数据环境提供了端到端的数据可用性解决方案.下面

主从集群搭建及容灾部署redis

redis主从集群搭建及容灾部署(哨兵sentinel) Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 l  Redis安装 l  整体架构 l  Redis主从结构搭建 l  Redis容灾部署(哨兵sentinel) l  Redis常见问题 Redis安装 发行版:CentOS-6.6 64bit 内核:2.6.32-504.el6.x86_64 CPU:intel-i7 3.6G 内存:2G 下载redis,选择合适的版本 [[email prot

redis主从集群搭建及容灾部署(哨兵sentinel)

Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 l  Redis安装 l  整体架构 l  Redis主从结构搭建 l  Redis容灾部署(哨兵sentinel) l  Redis常见问题 Redis安装 发行版:CentOS-6.6 64bit 内核:2.6.32-504.el6.x86_64 CPU:intel-i7 3.6G 内存:2G 下载redis,选择合适的版本 [[email protected] software]# wget http:/

容灾、备份、存储

百度词条---王建成解读 容灾:一般是异地,否则如何容得了灾?==>是不是本地.不同机房就不算容灾,究竟是地方还是技术本身才是关键? 经典语录:容灾系统是数据存储备份的最高层次. [数据级容灾]是指通过建立异地容灾中心,做数据的远程备份,在灾难发生之后要确保原有的数据不会丢失或者遭到破坏,但在数据级容灾这个级别,发生灾难时应用是会中断的.在数据级容灾方式下,所建立的异地容灾中心可以简单地把它理解成一个远程的数据备份中心.数据级容灾的恢复时间比较长,但是相比其他容灾级别来讲它的费用比较低,而且构建

存储容灾的相关限制

我们常常说存储容灾包括同城容灾和异地容灾,同时也包括同步容灾和异步容灾. 我们常说的同步容灾最大为100公里.该数值指的实际光纤长度是100公里,而不是物理距离,因为你不可能确保两个物理地之间恰巧有一根直线连接的光纤,一般经验中常选择的同步容灾站点物理距离在50-80公里之间.具体还需要根据应用对时延的要求和两地之间的实际测量时延为依据,100公里只是理论值. 存储的同步容灾只能在100公里的范围内实现.这是IT系统容灾界的标准法则. 该法则的计算理论依据为: 1)同步容灾需要任何一个I/O要同

【大话存储】学习笔记(17章),数据容灾

数据容灾 数据备份系统只能保证实际上被安全复制了一份,如果生产系统故障,必须将备份数据尽快的恢复到生产系统中继续生产,就叫容灾. 容灾可以分为四个级别: 数据级容灾:只是将生产站点的数据同步到远端. 与应用结合的数据级容灾:保证对应应用数据一致性. 应用级容灾:需要保证灾难发生以后,需要保证原生成系统中的应用系统在灾备站点可用. 业务级容灾:除了保证数据.应用系统在灾备站点可用,还要保证整个企业的业务系统仍对外可用,是最终层次的容灾. 概述 如果要充分保证数据的安全,只是在本地做备份是不够的,所

云环境下的容灾

声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! 云环境下的容灾 什么是容灾? 简单的说是对灾难的而应对策略.比如火灾,盗窃,人为损坏,火山,地震,洪水,战争,飓风等自然灾害或者人为灾害. RTO/RPO RPO(Recovery Point Objective): 指灾难后可能恢复到的时间点.涉及丢失业务数据的多少. RTO(Recovery Point Time): 指灾

47.本地Hyper-V虚拟机的异地(Azure)容灾(上)

将 Hyper-V VM 复制到 Azure 时,准备好本地 Hyper-V 基础架构. Hyper-V 主机可以由 System Center Virtual Machine Manager (VMM) 进行托管,也可以是独立的Hyper-V主机(不加域),这里我先介绍独立的Hyper-V主机进行异地容灾. 首先我本地有一台Hyper-V主机(本地的Hyper-V服务器名是Hyper-V)(这台主机需要可以访问Azure),上面跑了一个WEBSITE的虚拟机,提供的IIS的服务 确保 Hype