Redis高可用与持久化
持久化
持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘保
证数据不会因进程退出而丢失。
Redis持久化的功能
Redis是内存数据库,数据都是存储在内存中,为了避免服务器断电等原因导致Redis进程异常退出后数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从内存保存到硬盘;当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。
持久化两种方式:
RDB持久化:原理是将Reids在内存中的数据库记录定时保存到磁盘上。
AOF持久化(append only file)﹔原理是将Reids 的操作日志以追加的方式写入文件,类似于wysSOL的binlog.
由于AOF持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此AOF是目前主流的持久化方式,不过ROB持久化仍然有其用武之地。
RDB持久化
RDB持久化是指在指定的时间间隔内将内存中当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),
用二进制压缩存储,保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
RDB持久化触发条件
手动触发:
save命令和bgsave命令都可以生成RDB文件。
save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间,服务器不能处理任
何命令请求而bgsave命令会创建一个子进程,由子进程来负责创建RDB文件,父进程(即Redis主进程)则继续处
理请求。
bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此
save已基本被废弃,线上环境要杜绝save的使用。
自动触发:
在自动触发RDB持久化时,Redis也会选择bgsave而不是save来进行持久化。
save m n
自动触发最常见的情况是在配置文件中通过save m n,指定当m秒内发生n次变化时,会触发bgsave。
假设save 900,60,就是表示在900秒内有60条语句执行,触发rdb持久化
特殊触发
当手动关闭Redis时,会进行rdb方式的持久化(/etc/init.d/redis_6379 stop|restart )
RDB持久化过程
内存中----》写入磁盘中的保存方式
结果数据-----》写入磁盘中保存的数据对象
内存-----》写入磁盘后,会进行压缩,来减小*.rdb的磁盘占用空间
优缺点
缺点:
数据完成性不如AOF
RDB类似于快照
在进行备份时,会阻塞进程
优势:
持久化速度快(因为保存的数据结果),在写入*.rdb持久化文件会进行压缩,来减小自身的体积
集群中Redis主从复制,从是同步主服务器的数据,默认先使用RDB文件进行恢复操作,所以同步性能较高
AOF持久化
RDB持久化是将进程数据写入文件,而AoF持久化,则是将Redis执行的每次写、删除命令记录到单独的日志文
件中,查询操作不会记录;当Redis重启时再次执行AOF文件中的命令来恢复数据。
与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案。
AOF流程
命令追加
Redis先将写命令追加到缓冲区,而不是直接写入文件,主要是为了避免每次有写命令都直接写入硬盘,导致硬
盘To成为Redis负载的瓶颈。
命令追加的格式是Redis命令请求的协议格式,它是一种纯文木格式,具有兼容性好、可读性强、容易处理、操
作简单避免二次开销等优点。在AoF文件中,除了用于指定数据库的select命令(如select0为选中o号数据库)是
由Redis添加的,其他都是客户端发送来的写命令。
文件写入和文件同步
为了提高文件写入效率,在现代操作系统中,当用户调用write函数将数据写入文件时,操作系统通常会将数据
暂存到一个内存缓冲区里,当缓冲区被填满或超过了指定时限后,才真正将缓冲区的数据写入到硬盘里。这样的
操作虽然提高了效率,但也带来了安全问题:如果计算机停机,内存缓冲区中的数据会丢失;因此系统同时提供了
fsync、fdatasync等同步函数,可以强制操作系统立刻将缓冲区中的数据写入到硬盘里,从而确保数据的安全
性。
文件重写
随着时间流逝,Redis服务器执行的写命令越来越多,AOF文件也会越来越大;过大的AOF文件不仅会影响服务器
的正常运行,也会导致数据恢复需要的时间过长。
文件重写是指定期重写AoF文件,减小AOF文件的体积。需要注意的是,AOF重写是把Redis进程内的数据转化
为写命令,同步到新的AOF文件;不会对旧的AOF文件进行任何读取、写入操作!
关于文件重写需要注意的另一点是:对于AoF持久化来说,文件重写虽然是强烈推荐的,但并不是必须的:即使没
有文件重写,数据也可以被持久化并在Redis启动的时候导入;因此在一些现实中,会关闭自动的文件重写,然后
通过定时任务在每天的某一时刻定时执行。
AOF持久化过程
内存-----》append追加到缓冲区----》调用cpu资源来写入到磁盘中
操作日志记录中的执行语句-----》追加到缓冲区----》调用cpu写入磁盘中
内存-----》缓冲------》磁盘,写入后,会周期性的进行重写,跳过一些无效的操作来保存数据
AOF持久化触发条件
手动触发
自动触发
always 一直触发aof的持久化,每执行一条语句就触发一次aof持久化操作
every second 每秒触发一次持久化 每秒触发执行一次aof持久化操作
no 从不进行持久化
AOF根据Redis操作日志的记录,持续将日志中的执行操作保存在磁盘中
AOF优缺点
缺陷:
执行语句一直的情况下,aof备份的内容更大,rdb备份的内容较小
rdb备份的是结果
aof备份的是语句
aof消耗的性能更大,占用磁盘越来越大
优点:
aof的数据完整性比rdb高
重写功能较强 会对无效语句进行删除(目的就是为了节省aof文件占用的磁盘空间)
RDB和AOF的优先级
前提
因为Redis默认是将数据保存在内存中,所以若Redis启动、关闭时内存中的数据就会丢失
在Redis每次启动时,都会读取持久化文件,来回发数据到内存中,以保证Redis数据的完整性
aof》》》》rdb
配置文件就是6379.conf 可以修改各个参数
Redis内存碎片产生的原因
Redis存储数据的时候操作系统申请的内存空间可能会大于数据实际需要的存储空间
频繁修改Redis中的数据也会产生内存碎片