美文网首页redis
【redis】redis appendfsync 设置为 no

【redis】redis appendfsync 设置为 no

作者: Bogon | 来源:发表于2024-09-06 00:12 被阅读0次

Redis 提供了两种数据持久化的方式,分别是快照和追加文件。
快照方式,会按照指定的时间间隔,生成数据的快照,并且保存到磁盘文件中。
为了避免阻塞主进程,Redis 还会 fork 出一个子进程,来负责快照的保存。
这种方式的性能好,无论是备份还是恢复,都比追加文件好很多。

不过,它的缺点也很明显。在数据量大时,fork 子进程需要用到比较大的内存,保存数据也很耗时。
所以,你需要设置一个比较长的时间间隔来应对,比如至少 5 分钟。
这样,如果发生故障,你丢失的就是几分钟的数据。

追加文件,则是用在文件末尾追加记录的方式,对 Redis 写入的数据,依次进行持久化,所以它的持久化也更安全。

此外,它还提供了一个用 appendfsync 选项设置 fsync 的策略,确保写入的数据都落到磁盘中,具体选项包括 always、everysec、no 等。

  • always 表示,每个操作都会执行一次 fsync,是最为安全的方式;
  • everysec 表示,每秒钟调用一次 fsync ,这样可以保证即使是最坏情况下,也只丢失 1 秒的数据;
  • 而 no 表示交给操作系统来处理。

write只要把日志记录写到内核缓冲区,就可以返回了,并不需要等待日志实际写回到磁盘;而fsync需要把日志记录写回到磁盘后才能返回,时间较长。

image.png image.png image.png image.png image.png

redis 中 appendfsync 如果设置 no,表示交给操作系统来处理,操作系统是怎么处理的?

如果将 appendfsync 设置为 no,Redis 将不会主动调用 fsync() 函数将数据写入磁盘,而是将这个任务交给操作系统来处理。
操作系统会根据自己的策略来决定何时将内存中的数据写入磁盘,通常是在缓存数据达到一定数量或一定时间后才会进行写入。
这种方式可以提高 Redis 的写入性能,但是也会增加数据丢失的风险。
因此,建议在生产环境中将 appendfsync 设置为 always 或者 everysec,以保证数据的安全性。

操作系统会根据自己的策略来决定何时将内存中的数据写入磁盘,通常是在缓存数据达到一定数量或一定时间后才会进行写入。操作系统都有哪些策略?

操作系统的数据写入策略因不同的操作系统而异,以下是一些常见的策略:

  1. 基于时间:操作系统会定期将内存中的数据写入磁盘,通常是每隔一段时间就会执行一次写入操作。

  2. 基于数据量:操作系统会在内存中缓存一定量的数据,当缓存的数据达到一定数量时,会将这些数据一次性写入磁盘。

  3. 基于空闲时间:操作系统会在系统空闲的时候将内存中的数据写入磁盘,这种策略可以避免写入操作对系统性能的影响。

  4. 基于系统负载:操作系统会根据系统的负载情况来决定何时将内存中的数据写入磁盘,当系统负载较低时,会优先执行写入操作。

  5. 基于文件系统:不同的文件系统有不同的数据写入策略,例如 ext3 文件系统会在每隔 5 秒钟执行一次写入操作,而 ext4 文件系统则支持更高的写入速度。

需要注意的是,这些策略都是由操作系统内部实现的,具体的实现方式和效果可能因操作系统版本、硬件设备和应用程序等因素而异。

Linux 上有哪些内核参数可以控制吗?

操作系统提供了一些内核参数,可以控制数据写入策略和缓存机制,以下是一些常见的内核参数:

  1. vm.dirty_background_ratio:表示内存脏数据的比例阈值,当内存中脏数据的比例超过该阈值时,操作系统会开始将这些数据写入磁盘。

  2. vm.dirty_ratio:表示内存脏数据的最大比例阈值,当内存中脏数据的比例超过该阈值时,操作系统会强制将这些数据写入磁盘。

  3. vm.dirty_expire_centisecs:表示内存中脏数据的过期时间,当脏数据在内存中存活的时间超过该阈值时,操作系统会强制将这些数据写入磁盘。

  4. vm.dirty_writeback_centisecs:表示内存中脏数据的写入间隔时间,当脏数据在内存中存活的时间超过该阈值时,操作系统会将这些数据写入磁盘。

  5. vm.swappiness:表示内存交换机制的 aggressiveness,即操作系统在内存不足时,将内存中的数据写入交换分区的程度。该参数的值越高,操作系统将更倾向于将数据写入交换分区。

这些内核参数可以通过修改操作系统的配置文件来进行调整,不同的操作系统和内核版本可能支持不同的参数和取值范围。需要根据具体的应用场景和硬件环境来调整这些参数,以达到最佳的性能和稳定性。

参考

Redis响应严重延迟,如何解决?
https://ibyte.blog.csdn.net/article/details/108846620

Redis在持久化时产生的延迟
https://hiddenpps.blog.csdn.net/article/details/94518679

游戏陪玩源码中,Redis 发生高延迟的原因是什么?
https://blog.csdn.net/m0_58374018/article/details/122218778·

相关文章

  • Redis的 AOF 和 RDB 备份

    我们的这个Redis示例使用AOF进行持久化(appendonly)appendfsync策略采用的是everys...

  • coentos 安装redis

    下载redis 移动配置文件到安装目录下 设置redis为后台与开机启动 开启redis 开启远程访问 redis...

  • Redis 基础配置

    开启Redis远程连接 Redis默认只能本地登录 设置登陆密码 Redis默认密码为空 客户端连接Redis P...

  • 给Redis设置访问密码

    给Redis设置访问密码 标签(空格分隔): redis 给Redis设置访问密码 设置你的密码 查看你设置的密码...

  • redis:(error) NOAUTH Authenticat

    设置redis.conf文件中设置了redis密码后,再登录或者连接redis的时候会提示redis:(error...

  • Redis 简要使用

    Redis 设置认证 Python操作 Redis Node.js 操作Redis

  • Redis命令之AUTH

    AUTH password 起始版本:1.0.0 为redis服务请求设置一个密码。redis可以设置在客户端执行...

  • jeeplus设置Redis密码

    接手过来的jeeplus系统原本没有设置redis密码,近期要上线,为保证redis安全性,运维要求添加redis...

  • springboot 2.x整合redis

    引入redis依赖 设置连接redis的配置 Redis配置 配置redis连接 开始使用

  • 使用Docker容器搭建redis集群(多台机器部署)

    搭建Redis集群之前需知: 1.Docker 容器启动redis必须设置network为host模式,[redi...

网友评论

    本文标题:【redis】redis appendfsync 设置为 no

    本文链接:https://www.haomeiwen.com/subject/sehpsdtx.html