视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Redis数据持久化机制AOF原理分析之配置详解
2020-11-09 07:35:46 责编:小采
文档


//如果不支持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 mb

这两个配置就暂不解释,见下面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指令四个部分,下面的博客将介绍这三个部分的实现。

下载本文
显示全文
专题