您的当前位置:首页正文

Redis数据持久化机制AOF原理分析之配置详解

2020-11-09 来源:筏尚旅游网

//如果不支持fsync,或者aof rdb子进程正在运行,那么直接返回,
//但是数据已经写到aof文件中,只是没有刷新到硬盘
if (server.aof_no_fsync_on_rewrite &&
	(server.aof_child_pid != -1 || server.rdb_child_pid != -1))
	return;

appendfilename

含义:AOF的文件名

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

这两个配置就暂不解释,见下面redisServer结构体中中有关AOF参数的注释

redisServer数据结构中有关AOF的参数

struct redisServer {
	…………
	
 /* AOF persistence */
 int aof_state; /* REDIS_AOF_(ON|OFF|WAIT_REWRITE) */
 int aof_fsync; /* Kind of fsync() policy */
 char *aof_filename; /* Name of the AOF file */
 int aof_no_fsync_on_rewrite; /* Don't fsync if a rewrite is in prog. */
 int aof_rewrite_perc; /* Rewrite AOF if % growth is > M and... */
 off_t aof_rewrite_min_size; /* the AOF file is at least N bytes. */ aof文件最小字节数
 off_t aof_rewrite_base_size; /* AOF size on latest startup or rewrite. */ 上一次aof文件的大小
 off_t aof_current_size; /* AOF current size. */ 当前aof文件的大小
 int aof_rewrite_scheduled; /* Rewrite once BGSAVE terminates. */
 pid_t aof_child_pid; /* PID if rewriting process */ 子进程的pid
 list *aof_rewrite_buf_blocks; /* Hold changes during an AOF rewrite. */
 sds aof_buf; /* AOF buffer, written before entering the event loop */
 int aof_fd; /* File descriptor of currently selected AOF file */ aof文件描述符
 int aof_selected_db; /* Currently selected DB in AOF */
 time_t aof_flush_postponed_start; /* UNIX time of postponed AOF flush */
 time_t aof_last_fsync; /* UNIX time of last fsync() */
 time_t aof_rewrite_time_last; /* Time used by last AOF rewrite run. */
 time_t aof_rewrite_time_start; /* Current AOF rewrite start time. */
 int aof_lastbgrewrite_status; /* REDIS_OK or REDIS_ERR */
 unsigned long aof_delayed_fsync; /* delayed AOF fsync() counter */
 int aof_rewrite_incremental_fsync;/* fsync incrementally while rewriting? */
	
	…………
}

字符串aof_buf与链表aof_rewrite_buf_blocks分别是追加AOF文件与rewrite AOF文件后处理差异数据的重要参数

initServerConfig函数对AOF参数的初始化及注释

server.aof_state = REDIS_AOF_OFF; //AOF文件是否开启
server.aof_fsync = REDIS_DEFAULT_AOF_FSYNC; //fsync策略,默认为每秒fsync
server.aof_no_fsync_on_rewrite = REDIS_DEFAULT_AOF_NO_FSYNC_ON_REWRITE;//aof rdb子进程运行中是否支持fsync,即写入AOF文件后,将数据刷新到硬盘
server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC; //自动rewrite增量值
server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE; //AOF文件最小字节数
server.aof_rewrite_base_size = 0; //自动rewrite计算aof文件增量的基数,等于上一次aof文件的字节数
server.aof_rewrite_scheduled = 0; //rewrite任务计划,当客户端发送bgrewriteaof指令,如果当前rewrite子进程正在执行,那么将客户端请求的bgrewriteaof变为计划任务,待AOF子进程结束后执行rewrite
server.aof_last_fsync = time(NULL); //最近fsync数据到硬盘时间
server.aof_rewrite_time_last = -1; //rewrite持续的时间
server.aof_rewrite_time_start = -1; //rewrite开始的时间
server.aof_lastbgrewrite_status = REDIS_OK; //rewrite后的状态
server.aof_delayed_fsync = 0; //延迟fsync到硬盘的次数
server.aof_fd = -1; //AOF文件描述符
server.aof_selected_db = -1; /* Make sure the first time will not match */
server.aof_flush_postponed_start = 0; //上次推迟fsync到硬盘的时间
server.aof_rewrite_incremental_fsync = REDIS_DEFAULT_AOF_REWRITE_INCREMENTAL_FSYNC;//rewrite AOF文件时是否采用增量式fsync
其中aof_current_size参数未初始化,该值的初始化在Server启动加载AOF文件数据时初始化。

小结

本文就是简单介绍Redis中有关AOF机制实现的相关参数的意义,方便对接下来AOF数据持久化机制的理解,AOF机制的实现比较复杂,大致分为Server启动加载AOF文件数据、将新的数据追加到AOF文件中、自动rewrite AOF文件、客户端请求BGREWRITEAOF指令四个部分,下面的博客将介绍这三个部分的实现。

显示全文