1,半持久化RDB 模式
2, 全持久化AOF模式
3,Redis主从复制备份
Redis所有数据 都是保存在内存中,Redis数据备份可以定期的通过异步方式保存在磁盘上,该方式称为半持久化模式,如果每一次数据变化都写入aof文件里面,则称为全持久化模式。同时还可以基于Redis 主从复制实现Redis备份与恢复。
1,半持久化RDB模式
半持久化RDB 模式也是REdis备份默认方式,是通过快照(snapshotting)完成的,当符合在Redis.conf配置文件中设置的条件时Redis会自动将内存中所以的数据进行快照并存储在硬盘上,完成数据备份。
Redis 进行RDB 快照的条件由用户在配置文件中自定义,有2个参数构成,时间和改动的键的个数。挡在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。在配置文件中已经预制了3个条件:
save 900 1 #900秒内有至少1个键被更改则进行快照;
save 300 10 #300秒内有至少10个键被更改则进行快照;
save 60 10000 #60秒内有至少10000个键被更改则进行快照。
默认可以存在多个条件,条件之间是或的关系,只要满足其中的一个条件,就会进行快照,如果想要禁用快照,只需要将所有的save的参数删除即可。Redis默认会将快照文件存储在redis数据目录。默认的文件名为: dump.rdb 文件,可以通过配置dir 和 dbfilename 2个参数分别指定快照的路径和文件名。也可以在rdeis命令行里执行config get dir 获取redis 数据保存路径 ,
Redis 实现快照的过程,redis 使用fork函数复制一份当前进程(父进程)的副本(子进程),父进程继续接收并处理客户端发来的命令。而子进程开始将内存中的数据写入硬盘中的临时文件,当子进程写入完所有的数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。
执行fork的时操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一个内存数据,当父进程要改其中谋片数据时,操作系统会将改片数据复制一份以保证子进程的数据不受影响,所以新的RDB 文件存储的时执行fork一刻的内存数据。
Redis在进行快照的过程中不会修改RDb文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的,这使得我们可以通过定时备份RDB 文件来实现Redis 数据库备份。
RDB 文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)
的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。除了自动快照,还可以手动发送save 和bgsave命令让REDIS 执行快照。2个命令的区别在于,前者是由主进程进程进行快照操作,会阻塞住其他请求,后者会通过fork子进程进行快照操作。
Redis启动后会读取RDb快照文件,将数据从硬盘载入到内存,根据数据量大小与结构和服务器性能不同,通常将一个记录一千万个字符串类型键,大小为1gb的快照文件载入到内存20-30秒钟。
通过rdb方式实现持久化,一旦redis异常退出,就会丢失最后一次快照以后更改的所有的数据,此时需要根据开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。
2,全持久化AOF 模式
如果数据很重要无法承受任何损失,可以考虑使用aof 方式进行持久化。默认redis没有开启aof(append only file)方式的全持久化模式。
在启动时redis 会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度比RDB会慢一些,开启aof持久化后每执行一条会更改redis 中的数据的命令,Redis就会将改命令写入到硬盘中的aof文件,aof文件保存位置和rdf文件的位置相同。都是通过dir参数设置的。默认的文件名是appendonly.aof,可以通过appendfilename 参数修改该名称。
Redis 允许同时开始aof 和rdb,既保证了数据安全又使得进行备份等操作十分容易。此时重启redis后redis会使用aof 文件来恢复数据,因为aof方式的持久化可能丢失的数据更少,可以在redis.conf 中通过appendonly 参数开启redis aof 全持久化模式:
appendonly yes #开启AOF持久化功能;
appendfilename appendonly.aof #AOF持久化保存文件名;
appendfsync always #每次执行写入都会执行同步,最安全也最慢;
#appendfsync everysec #每秒执行一次同步操作;
#appendfsync no #不主动进行同步操作,而是完全交由操作系统来做,每30秒一次,最快也最不安全;
auto-aof-rewrite-percentage 100 #当AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据;
auto-aof-rewrite-min-size 64mb #允许重写的最小AOF文件大小配置写入AOF文件后,要求系统刷新硬盘缓存的机制。
3,redis 主从复制备份
通过持久化功能, redis保证了即使在服务器重启的情况下也不会损失(或者少量的损失)数据,但是由于数据时存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失。
为了避免单点故障,我们希望将数据库复制在多个副本以部署在不同的服务器上,即使只有一台服务器出现故障其他服务器可以继续提供服务,这就要求当一台服务器上的数据库更新后,可以自动将更新的数据同步到其他的服务器上,redis提供了复制(replication)功能可以自动实现同步的过程。通过配置文件在redis从数据库中配置文件中加入 slaveof master-ip master-port即可 ,主数据无需配置。
redis主从复制优点以及应用场景,web应用程序可以基于主从同步实现读写分离以提高服务器的负载能力。在常见的场景中,读的频率一般比较大,以单机redis 无法应付大量的读请求时,可以通过复制功能建立多个从数据库,主数据只进行些操作,而从数据库负责读写操作,还可以基于lvs+keepalived+Redis 对redis 实现均和高可用。
从数据库持久化通常相对比较耗时,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库, 并在从数据库中启用持久化。同时在主数据库禁用持久化。
当从数据库崩溃时重启主数据库会自动将数据同步过来,所以无需担心数据丢失,而当主数据库崩溃时,需要将从数据库中使用slaveof no one 命令将从数据库提升成主数据库继续服务,并在原来的主数据库启动后使用 slave of 命令将其设置成新的主数据的从数据库,即可将数据同步回来。