Redis设实 - 11 AOF持久化
2017-08-17 16:59
281 查看
《Redis设计与实现 黄建宏 著》第11章
该书基于Redis2.9,即Redis3.0开发版编写
AOF(Append Only File)持久化通过保存Redis服务器执行的写命令记录数据库状态
服务器执行完一个写命令后,该命令以协议格式追加到服务器状态aof_buf缓冲区:
typedef struct redisServer{
// ...
// AOF缓冲区
sds aof_buf;
// ...
}redisServer;
文件写入、文件同步(sync)
Redis服务器进程是一个事件循环(loop),循环中的文件事件负责接收客户端命令请求、向客户端发送命令回复,时间事件负责执行像serverCron函数这样需定时运行的函数
服务器在每次结束一个事件循环前,会判断是否需要将aof_buf缓冲区内容写入和保存到AOF文件
服务器配置中appendfsync选项可配置缓冲区写入AOF文件的策略:
appendfsync选项默认为everysec
注,若计算机发生停机,内存缓冲区中的数据将会丢失,为此,系统提供fsync和fdatasync两个同步函数,强制让操作系统立即将缓冲区数据写入到硬盘,从而确保写入数据的安全性
2) 从AOF文件中分析并读取一条写命令
3) 使用伪客户端执行读出的写命令
4) 循环执行2)、3),直到AOF文件中所有写命令处理完毕
重写功能通过读取当前数据库状态实现,不需对现有AOF文件进行任何操作
重写后的AOF文件通常会比普通AOF文件的体积小很多
为避免执行重写命令时造成客户端输入缓冲区溢出,重写程序在处理列表、哈希表、集合、有序集合4种可能带有多个元素的键时,会先检查键包含元素的数量,若元素数量超过redis.h/REDIS_AOF_REWRITE_ITEMS_PER_CMD常量值(64),则重写程序将使用多条命令记录键的值,而非使用一条命令
Redis设置了AOF重写缓冲区,该缓冲区在子进程创建后开始使用
Redis服务器执行完写命令后,将该命令发送给AOF缓冲区和AOF重写缓冲区
子进程完成AOF重写工作后,向父进程发送信号,父进程接到该信号后,调用信号处理函数执行以下操作:
1) 将AOF重写缓冲区的内容写入到新AOF文件,此时新AOF文件保存的数据库状态和服务器当前数据库状态完全一致
2) 对新AOF文件改名,原子地(atomic)覆盖现有AOF文件,完成新旧AOF文件替换
注,上述过程中,只有信号处理函数执行时会对服务器进程(父进程)造成阻塞
该书基于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文件替换
注,上述过程中,只有信号处理函数执行时会对服务器进程(父进程)造成阻塞
相关文章推荐
- 6、Redis从入门到放弃 之 持久化RDB和AOF
- Redis持久化————AOF与RDB模式
- redis aof持久化遇到的Can't open the append-only file Permission denied
- 由redis持久化AOF重写想到Excel保存过程
- redis持久化AOF与RDB配置
- redis的持久化方式RDB和AOF的区别
- redis持久化之AOF(Append Only File)及其总结
- redis追加持久化-aof(append only file)
- Redis持久化配置-AOF
- redis的 rdb 和 aof 持久化的区别
- Redis两种持久化方式rdb,aof
- Redis——持久化方式RDB和AOF的区别
- Redis的快照持久化-RDB与AOF
- redis持久化RDB和AOF
- Redis的2种持久化方式Snapshot(RDB)和Append-only file(AOF)的配置和对比
- 【Redis源码剖析】 - Redis持久化之AOF
- Redis的AOF持久化的实现
- Redis(13)--Redis的持久化之AOF方式
- redis持久化RDB和AOF
- redis持久化RDB和AOF