Redis持久化机制

Redis提供常见的两种数据持久化方式AOF和RDB方式,目的是在于防止进程退出之后造成数据丢失问题

RDB

RDB持久化方式是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化的过程一般分为手动持久化和自动触发持久化

优点

1、RDB是一个紧凑的二进制文件,代表Redis在某一个时间点的数据写照,非常适合备份和全量复制等场景。
2、Redis加载RDB恢复数据远快于AOF方式。

缺点

1、RDB方式无法做到实时持久化或者秒级数据持久化,因为bgsave每次运行都需要fork子进程,属于重量级操作,频繁执行代价太高。
2、RDB文件使用特定的二进制保存,Redis版本演进过程中有多个RDB版本,存在老版本服务器无法兼容新版本格式问题。

AOF

针对RDB无法实时持久化问题,Redis 提供了AOF 方式进行解决,目前是Redis主流的持久化方式

AOF以独立日志的方式记录每次写命令,重启时候再重新读取命令执行,以达到恢复数据的目的。

AOF的工作流程
1、所有写入命令会追加到aof_buf(缓冲区)中
2、AOF缓冲区会根据同步策略向硬盘做同步操作
3、随着AOF文件越来越大,需要定期对AOF做文件重写,以达到压缩文件的目的
4、当服务器重启时候,加载aof文件进行数据恢复

AOF 缓冲区文件同步策略

1、always:每次写入都需要同步aof文件,在一般SATA硬盘上,Redis 只能支持大约几百TPS,跟redis的高性能特性背道而驰,不建议配置
2、配置no,由于操作系统每次同步aof 周期不可控,而且每次加大同步硬盘数量,虽然提升性能,但是安全无法保证
3、配置everysec,是redis建议的同步策略,也是默认,命令写入aof_buf后调用系统write操作,write操作完成之后,线程返回,fsync同步文件操作由专门线程每秒调用一次

write写机制:Linux在内核提供也缓冲区用来提高硬盘io,write操作在写入系统之后,直接返回,同步硬盘操作依赖于系统调度机制,例如缓冲区空间写满或者达到特定时间周期,同步文件之前,如果此时系统宕机,缓冲区内数据将丢失

AOF同步流程

1、执行aof重写请求,如果当前正在执行bgsave请求,重写命令会延迟到当前bgsave命令执行完成之后
2、父进程创建子进程
3.1、父进程创建完成子进程之后,所有请求继续执行,所有修改命令依旧写入aof_buf缓冲区,更新到当前aof文件,保证原有aof 机制正确运行
3.2、由于fork操作运用写时复制技术,子进程只能共享fork操作时的内存数据,由于父进程仍然相应命令,redis 使用aof重写缓冲来保存这部分数据,防止新的aof生成期间丢失这部分数据
4、子进程根据内存快照按照合并规则写入到新生成的aof文件
5.1、新AOF写入完成之后,子进程发送信号给父进程,父进程更新统计信息,此时服务器处于阻塞状态,无法正常相应命令
5.2、父进程把aof重新缓冲区的内容更新到新的aof文件里面
5.3、 使用新的aof文件,替换老文件,完成aof文件重写

你可能感兴趣的:(redis,golang,服务端,redis)