博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis被bgsave和bgrewriteaof阻塞的解决方法
阅读量:7108 次
发布时间:2019-06-28

本文共 818 字,大约阅读时间需要 2 分钟。

hot3.png

 

Redis被bgsave和bgrewriteaof阻塞的解决方法

 

Redis 是一个性能非常高效的内存 Key-Value 存储服务, 同时它还具有两个非常重要的特性: 1. 持久化; 2. Value 数据结构. 这两个特性让它在不少场景轻松击败了 Memcached 和 Casandra 等.

Redis 的持久化在两种方式: Snapshotting(快照) 和 Append-only file(aof). 在一个采用了 aof 模式的 Redis 服务器上, 当执行 bgrewriteaof 对 aof 进行归并优化时, 出现了 Redis 被阻塞的问题, 此时, Redis 无法提供任何读取和写入操作.

按字面理解, bgrewriteaof 是在后台进行操作, 不应该影响 Redis 的正常服务. 原理也确实是这样的, Redis 首先 fork 一个子进程, 并在该子进程里进行归并和写持久化存储设备(如硬盘)的. 按照正常逻辑, 在一台多核的机器上, 即使子进程占满 CPU 和硬盘, 也不应该导致 Redis 服务阻塞啊!

其实, 问题就出在硬盘上.

Redis 服务设置了 appendfsync everysec, 主进程每秒钟便会调用 fsync(), 要求内核将数据”确实”写到存储硬件里. 但由于子进程同时也在写硬盘, 从而导致主进程 fsync()/write() 操作被阻塞, 最终导致 Redis 主进程阻塞了.

解决方法便是设置 no-appendfsync-on-rewrite yes, 在子进程处理和写硬盘时, 主进程不调用 fsync() 操作. 注意, 即使进程不调用 fsync(), 系统内核也会根据自己的算法在适当的时机将数据写到硬盘(Linux 默认最长不超过 30 秒).

转载于:https://my.oschina.net/demons99/blog/2231197

你可能感兴趣的文章
Timer
查看>>
ComboBox
查看>>
C++ sort()函数和C qsort()函数用法总结
查看>>
【图像处理】工业相机原理详述 (转载)
查看>>
【分布式】Zookeeper应用场景
查看>>
【堆】
查看>>
Asp.net基础概念整理(一) Web应用程序和网站的区别
查看>>
[02-02 ]Java数据库链接范列
查看>>
一些常用的Bootstrap模板资源站
查看>>
taro 填坑之路(二)taro 通过事件监听 实现组件间传值
查看>>
数组操作
查看>>
POJ 3613 Cow Relays
查看>>
20155222卢梓杰 课下测试04补做
查看>>
SQL注入
查看>>
怎么查看在centos中创建的用户组
查看>>
为什么说http协议是无状态协议
查看>>
[导入]Wap系统中Session信息保存问题解决方法
查看>>
动态输出javascript
查看>>
android_error
查看>>
Zepto源码注释
查看>>