您的位置:首页 > 数据库 > Redis

Redis设实 - 11 AOF持久化

2017-08-17 16:59 281 查看
《Redis设计与实现 黄建宏 著》第11章
该书基于Redis2.9,即Redis3.0开发版编写

AOF(Append Only File)持久化通过保存Redis服务器执行的写命令记录数据库状态

AOF持久化三个步骤:

命令追加(append)
服务器执行完一个写命令后,该命令以协议格式追加到服务器状态aof_buf缓冲区:
typedef struct redisServer{
// ...
// AOF缓冲区
sds aof_buf;
// ...
}redisServer;
文件写入、文件同步(sync)
Redis服务器进程是一个事件循环(loop),循环中的文件事件负责接收客户端命令请求、向客户端发送命令回复,时间事件负责执行像serverCron函数这样需定时运行的函数
服务器在每次结束一个事件循环前,会判断是否需要将aof_buf缓冲区内容写入和保存到AOF文件
服务器配置中appendfsync选项可配置缓冲区写入AOF文件的策略:



appendfsync选项默认为everysec
注,若计算机发生停机,内存缓冲区中的数据将会丢失,为此,系统提供fsync和fdatasync两个同步函数,强制让操作系统立即将缓冲区数据写入到硬盘,从而确保写入数据的安全性

Redis读取AOF文件并还原数据库状态步骤:

1) 创建不带网络连接的伪客户端(fake client)
2) 从AOF文件中分析并读取一条写命令
3) 使用伪客户端执行读出的写命令
4) 循环执行2)、3),直到AOF文件中所有写命令处理完毕

AOF重写

命令:BGREWEITEAOF
重写功能通过读取当前数据库状态实现,不需对现有AOF文件进行任何操作
重写后的AOF文件通常会比普通AOF文件的体积小很多

AOF重写实现原理

从数据库读取(多个)键当前的值,用一条命令记录键值对,代替之前记录这些键值对的多条命令
为避免执行重写命令时造成客户端输入缓冲区溢出,重写程序在处理列表、哈希表、集合、有序集合4种可能带有多个元素的键时,会先检查键包含元素的数量,若元素数量超过redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD常量值(64),则重写程序将使用多条命令记录键的值,而非使用一条命令

AOF重写过程

AOF重写程序在子进程执行
Redis设置了AOF重写缓冲区,该缓冲区在子进程创建后开始使用
Redis服务器执行完写命令后,将该命令发送给AOF缓冲区和AOF重写缓冲区
子进程完成AOF重写工作后,向父进程发送信号,父进程接到该信号后,调用信号处理函数执行以下操作:
1) 将AOF重写缓冲区的内容写入到新AOF文件,此时新AOF文件保存的数据库状态和服务器当前数据库状态完全一致
2) 对新AOF文件改名,原子地(atomic)覆盖现有AOF文件,完成新旧AOF文件替换
注,上述过程中,只有信号处理函数执行时会对服务器进程(父进程)造成阻塞
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis AOF持久化