zoukankan      html  css  js  c++  java
  • redis持久化与可用性

      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採用一个链表来存

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


  • 相关阅读:
    (转)[Unity3D]计时器/Timer
    characterCustomezition的资源打包代码分析
    论文笔记:语音情感识别(四)语音特征之声谱图,log梅尔谱,MFCC,deltas
    论文笔记:语音情感识别(三)手工特征+CRNN
    论文笔记:语音情感识别(二)声谱图+CRNN
    论文笔记:2018 PRCV 顶会顶刊墙展
    论文笔记:Emotion Recognition From Speech With Recurrent Neural Networks
    CTC(Connectionist Temporal Classification)介绍
    论文笔记:语音情感识别(一)语音知识概览
    710 Random Pick with Blacklist
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3891776.html
Copyright © 2011-2022 走看看