redis对于持久化有快照及aof日志文件两种形式。

快照db文件,长处是二进制,大小比aof日志文件小。但会丢失最后一次成功备份时间到down机时间的数据。

aof相比而言文件大小就大了点,但相对快照来讲,不大easy丢失文件。

眼下redis检查数据文件是否有错对于快照及aof都可以支持,但修复则仅仅对aof文件有效。

快照文件每次备份都是全量备份,原理是先fork出一个子进程,父子进程共享数据域。接着子进程開始将共享数据域中的数据写入到一个暂时文件,写完之后原子性的替换掉原先的备份db文件。假设在备份过程中,有新的写请求进来,这时创建一个当前写请求相应数据的副本页面,新的写请求更新在副本页上。这就是copy-on-write。这样的方式当文件特别大时,不至于把内存撑爆。

快照文件能够用bgsave及save来进行触发,当然也能够配置每多少秒有多少写请求就触发备份,如 配置 save 100 1000 表示在100秒中有1000次写就触发备份。

aof文件,是追加式的添�到aof未尾。每次redis接收到写请求都会先写入到内存中的buffer中,然后刷新到磁盘文件里。什么时刷新到磁盘文件里能够用appendfsync来进行配置。

appendfsync的值能够是always,second,no。always表示写请求进来时,立即把数据写到磁盘,这样的方式当大量写请求时会造成磁盘等待。second表示每秒中操作系统将buffer中的数据写到磁盘。no,表明全然由操作系统控制写入到磁盘的时间(这比較危急,不知道会失多少数据)。

实际项目中用aof文件,定期做整理,aofrewrite,能够配置当aof文件添加�多少倍或者达到最小大小时进行整理。

前面是持久化内容,考虑假设读请求非常大,单台redis无法提供高性能服务时。这时能够使用主/备服务,主redis负责接收写请求与读请求,并将写请求同步到从redis。从redis仅仅可读。

主/从redis同步数据,原理比較简单,步聚例如以下:

1.从redis发送一个sync命令给主master (从redis能够对外接受读请求,也能够不接受)

2.主master运行一个bgsave,生成最新的备份文件,这个过程中假设有新的写请求则将它写入到backlog。

3.当主master生成最新备份db文件后,主master将它发送到从redisserver

4. 从redisserver接收完备份文件后,替换掉原从redis内存中的数据,然后ack给主master

5.主master最后将接受sync请求而且開始做bgsave起到从redis发回ack后这段时间的全部数据backlog发回到从redis

6.从redis解析backlog,并放入到内存其中

实践过程中发现,当主/从进行同步时,主redis必然会生成一个最新的db后缀的备份文件。而aof文件则是仅仅有当主master配置了appendonly为yes时这会

产生。假如主redis下同一时候存在aof和db备份文件,这时依据从redis是否支持aof来决定是否同步aof文件。

另一点须要特别注意的是,每次从slave重新启动,那同步的数据文件是主master下整个文件。

关于这点,能够自己实现解析aof文件来实现增量同步。

故障恢复:

主redis为 10.45.9.114,port6001

从redis为 10.45.9.111,port为6002





当主master挂了时,选择slave做为主master,命令例如以下:

在slave上运行:

bgsave,并运行 slaveof no one

这里的slaveof no one不会序列化到配置文件,重新启动后还是以配置文件里的设置为准



之后更新client,使其指向新的master,即10.45.9.111这台redis



master 10.45.9.114恢复后,将其做为新master的slave



这时查看数据文件是否损坏,这里用的是aof备份,因此使用命令:

./redis-check-aof /home/jbossas/Data/redis/redis-data/appendonly.aof

结果例如以下:

AOF analyzed: size=245, ok_up_to=245, diff=0

AOF is valid



假设aof文件损坏的坏,则须要使用下面命令来恢复:

./redis-check-aof --fix /home/jbossas/Data/redis/redis-data/appendonly.aof



之后设置10.45.9.114这台机子的redis配置文件 slaveof为 slaveof 10.45.9.111 6002

 

之后重新启动就可以

redis优化



降低内存,redis在对下面集合:

 ZSETS,LISTS,HASHS

 当它们的元素数量及value大小小于某个限值时,会用zipList(数组)来降低内存存储

 设置參数:

 list-max-ziplist-entries 512

 list-max-ziplist-value 64



 对于SETS也当元素个数小于某个限值时,也会存储成一个数组,intSet

 设置參数:

 set-max-intset-entries 512

对于原有的集合,redis存储数据时会比較占空间。

如list集合,redis採用一个链表来存

每一个结点存储一个数据,而这个结点须要额外的三个指针。这三个指针分别指向前结点,后结点以及当前数据域

redis持久化与可用性的更多相关文章

  1. Redis持久化的两种方式(RDB和AOF)

    redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File). RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储 ...

  2. Redis持久化概念

    redis持久化概念 Author:SimpleWu GitHub-redis 什么是持久化? 概念:把内存的数据保存在磁盘的过程. Redis的持久化? redis是内存数据库,它把数据存储在内存中 ...

  3. Redis持久化存储与复制功能简述

    一.分布式系统基础理论 分布式系统的两个基础理论: 1.CAP理论 如图: Consistency(强一致性):数据一致更新,所有数据变动都是同步的.Availability(可用性):好的响应性能. ...

  4. redis学习(三)redis持久化

    redis持久化 1.redis持久化介绍 我们知道redis性能之所以强悍,是因为redis在运行时将数据都存放在了访问效率远高于硬盘的内存之中.可是这带来了新的问题:在redis或者外部系统重启时 ...

  5. Redis 持久化深入--机制、可靠性及比较

    本文是对 antirez 博客中 Redis persistence demystified 的翻译和总结.主要从Redis的持久化机制,提供何种程度的可靠性以及与其他数据库的比较三个方面进行讨论. ...

  6. 细说Redis持久化机制

    概述 Redis不仅能够作为缓存来使用,也能够作为内存数据库. Redis作为内存数据库使用时.必需要解决一个问题:数据的持久性.有些将Redis作为缓存使用的场景也需要将缓存的数据持久化到存储介质上 ...

  7. Redis持久化----RDB和AOF 的区别

    关于Redis说点什么,目前都是使用Redis作为数据缓存,缓存的目标主要是那些需要经常访问的数据,或计算复杂而耗时的数据.缓存的效果就是减少了数据库读的次数,减少了复杂数据的计算次数,从而提高了服务 ...

  8. redis持久化RDB和AOF

    Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AO ...

  9. Redis持久化

    Redis持久化 快照(默认) 将内存中的数据以快照的方式写入到二进制文件中,默认文件名是dump.rdb. 配置自动化做快照持久化(如redis在n秒内如果超过m个key被修改就自动做快照) sav ...

随机推荐

  1. 在ubuntu10.0.4下更新git

    今天想到要在ubuntu10.0.4下下载android的源码学习一下.源码下载用到了git.以前安装过git以为应该没什么问题的,没想到报了 “fatal: git 1.7.2 or later r ...

  2. ECO

    ECO(生态环保的简写) 在与环保相关的概念和资料中,ECO 是ECOLOGICAL的缩写,用来表示生态环保的意思.与之相关产生了一些新的名词,尤其是在房地产楼书中常常被提及,如: ECO-HOME, ...

  3. Unity2D屏幕适配方案

    看了cnblogs里的一篇文章,终于理解了Unity2D的摄像机系统:http://www.cnblogs.com/flyFreeZn/p/4073655.html 我根据他的方案,改写了两种适配方案 ...

  4. 标头“Vary:Accept-Encoding”指定方法及其重要性分析

    原文地址:http://www.webkaka.com/blog/archives/how-to-set-Vary-Accept-Encoding-header.html 在webkaka的网站速度诊 ...

  5. Python学习笔记3-Python元组、数组、字典集合的操作

    在Python中数组中的每一项可以是不同的数据类型 元组:只能读不能写的数组 aTuple=(1,'abc','tmc',79.0,False) print aTuple[1:3] print typ ...

  6. 支付宝“订单交易失败 ALI64” 报错的原因

    移动快捷支付,往往需要集成支付宝的sdk,集成的过程相对简单,只要按照支付宝的文档,进行操作一般不会出问题. 下面主要说明一下,集成sdk后报 "订单交易失败 请稍后再试(ALI64)&qu ...

  7. hdu 5540 Secrete Master Plan(水)

    Problem Description Master Mind KongMing gave Fei Zhang a secrete master plan stashed × matrix, but ...

  8. javascritp第十课:面向对象

    js中的函数就是对象,对象就是函数,当js中需要使用面向对象,使用js闭包模拟面向对象,当函数作为对象使用时,每个单词首字母都大写 var obj=new object();  //js中默认就是ob ...

  9. 动画原理——绘制正弦函数&环绕运动&椭圆运动

    书籍名称:HTML5-Animation-with-JavaScript 书籍源码:https://github.com/lamberta/html5-animation  1.正弦函数.x位置递增, ...

  10. EBS R12 修改 apps 密码[Z]

    注意:修改密码时应保证所有用户已退出, 最好是关闭应用实例.不用关闭数据库.在修改密码之前一定要改备下数据库中的FND_ORACLE_USERID和FND_USER表.FNDCPASS工具会自动把AP ...