Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

reids持久化机制解释 #2697

Open
Open
Labels
doc-bugContent error
@YangooSen

Description

AOF 持久化方式有哪些? 这里提到的

appendfsync always:主线程调用 write 执行写操作后,后台线程( aof_fsync 线程)立即会调用 fsync 函数同步 AOF 文件(刷盘),fsync 完成后线程返回,这样会严重降低 Redis 的性能(write + fsync)

实际上可能是主线程直接调用 fsync,而没有用到后台线程。7.2版本源码中

try_fsync:
 /* Don't fsync if no-appendfsync-on-rewrite is set to yes and there are
 * children doing I/O in the background. */
 if (server.aof_no_fsync_on_rewrite && hasActiveChildProcess())
 return;
 /* Perform the fsync if needed. */
 if (server.aof_fsync == AOF_FSYNC_ALWAYS) {
 /* redis_fsync is defined as fdatasync() for Linux in order to avoid
 * flushing metadata. */
 latencyStartMonitor(latency);
 /* Let's try to get this data on the disk. To guarantee data safe when
 * the AOF fsync policy is 'always', we should exit if failed to fsync
 * AOF (see comment next to the exit(1) after write error above). */
 if (redis_fsync(server.aof_fd) == -1) {
 serverLog(LL_WARNING,"Can't persist AOF for fsync error when the "
 "AOF fsync policy is 'always': %s. Exiting...", strerror(errno));
 exit(1);
 }
 latencyEndMonitor(latency);
 latencyAddSampleIfNeeded("aof-fsync-always",latency);
 server.aof_last_incr_fsync_offset = server.aof_last_incr_size;
 server.aof_last_fsync = server.unixtime;
 atomicSet(server.fsynced_reploff_pending, server.master_repl_offset);
 } else if (server.aof_fsync == AOF_FSYNC_EVERYSEC &&
 server.unixtime > server.aof_last_fsync) {
 if (!sync_in_progress) {
 aof_background_fsync(server.aof_fd);
 server.aof_last_incr_fsync_offset = server.aof_last_incr_size;
 }
 server.aof_last_fsync = server.unixtime;
 }
}

设置是 AOF_FSYNC_ALWAYS 的时候,会立即调用 redis_fsync(server.aof_fd);而AOF_FSYNC_EVERYSEC 的分支会才调用 aof_background_fsync(server.aof_fd) 在后台异步执行刷盘

Metadata

Metadata

Assignees

No one assigned

    Labels

    doc-bugContent error

    Projects

    No projects

    Milestone

    No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

        AltStyle によって変換されたページ (->オリジナル) /