Redis的持久化是指将内存中的数据持久化到磁盘中,以保证数据在重启或宕机后不会丢失。
Redis提供了两种主要的持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。
RDB(Redis DataBase)
1、RDB快照原理
RDB持久化方式会定期生成当前时刻的数据快照,然后将快照保存到磁盘上。这种方式相当于对整个数据库进行了一次快照,因此适用于备份和恢复数据。
2、RDB配置
在Redis的配置文件redis.conf
中,可以通过设置save
参数来配置RDB的触发条件,
save 60 1
上述配置表示如果在60秒内至少发生了1个键的改动,则执行持久化操作。
3、redis.conf 其他配置
除了save参数外,redis.conf还提供了其他与RDB相关的配置项,如stop-writes-on-bgsave-error用于在持久化失败时停止写入操作。
4、RDB的备份恢复
通过将RDB文件复制到其他位置或服务器,可以轻松地进行备份和恢复操作。
5、RDB优缺点
RDB的优点是快速、轻量,适合用于备份和恢复数据;缺点是在发生故障时可能会丢失部分数据。
AOF(Append Of File)
1、AOF原理
AOF持久化方式会记录Redis服务器所处理的每个写入操作命令,并将其追加到文件末尾。当服务器重启时,可以通过重新执行AOF文件中的命令来恢复数据。
2、AOF配置
通过设置appendonly yes参数来开启AOF持久化功能,例如:
appendonly yes
3、AOF的备份恢复
AOF文件是一个纯文本文件,可以通过复制、移动或压缩来进行备份和恢复。
4、重写流程
AOF文件会随着写入命令的增加而不断增大,为了减小文件体积并提高性能,Redis提供了AOF重写功能。重写过程会将现有的AOF文件重写成一系列与原命令相同但更简洁的命令。
5、AOF优缺点
AOF的优点是数据更加持久、可靠,适合用于长时间运行的实例;缺点是AOF文件可能会变得很大,导致恢复操作较慢。
AOF和RDB对比
Redis 4.0 混合持久化
Redis 4.0引入了混合持久化机制,将AOF和RDB两种持久化方式结合起来,以兼顾两者的优点。具体配置和优缺点请参考Redis官方文档。
fork优化
当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创建子进程,对于大多数操作系统来说fork是个重量级错误。虽然fork创建的子进程不需要拷贝父进程的物理内存空间,但是会复制父进程的空间内存页表。例如对于10GB的Redis进程,需要复制大约20MB的内存页表,因此fork操作耗时跟进程总内存量息息相关,如果使用虚拟化技术,特别是Xen虚拟 机,fork操作会更耗时。
fork耗时问题定位:对于高流量的Redis实例OPS可达5万以上,如果fork操作耗时在秒级别将拖慢Redis几万条命令执行,对线上应用延迟影响非常明显。正常情况下fork耗时应该是每GB消耗20毫秒左右。可以在info stats统计中查latest_fork_usec指标获取最近一次fork操作耗时,单位微秒。
如何改善fork操作的耗时:
◆ 1)优先使用物理机或者高效支持fork操作的虚拟化技术,避免使用Xen。
◆ 2)控制Redis实例最大可用内存,fork耗时跟内存量成正比,线上建议每个Redis实例内存控制在10GB以内。
◆ 3)合理配置Linux内存分配策略,避免物理内存不足导致fork失败 4)降低fork操作的频率,如适度放宽AOF自动触发时机,避免不必要的全量复制等。