原文地址:http://blog.itpub.net/26477398/viewspace-1258932/

1.Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

2.Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。

3.Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

下面是我的一个实际项目的情况,大概情况是这样的:一个Master,4个Slave,没有Sharding机制,仅是读写分离,Master负责写入操作和AOF日志备份,AOF文件大概5G,Slave负责读操作,当Master调用BGREWRITEAOF时,Master和Slave负载会突然陡增,Master的写入请求基本上都不响应了,持续了大概5分钟,Slave的读请求过半也无法及时响应,上面的情况本来不会也不应该发生的,是因为以前Master的这个机器是Slave,在上面有一个shell定时任务在每天的上午10点调用BGREWRITEAOF重写AOF文件,后来由于Master机器down了,就把备份的这个Slave切成Master了,但是这个定时任务忘记删除了,就导致了上面悲剧情况的发生,原因还是找了几天才找到的。

将no-appendfsync-on-rewrite的配置设为yes可以缓解这个问题,设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入。最好是不开启Master的AOF备份功能。

4.Redis主从复制的性能问题,第一次Slave向Master同步的实现是:Slave向Master发出同步请求,Master先dump出rdb文件,然后将rdb文件全量传输给slave,然后Master把缓存的命令转发给Slave,初次同步完成。第二次以及以后的同步实现是:Master将变量的快照直接实时依次发送给各个Slave。不管什么原因导致Slave和Master断开重连都会重复以上过程。Redis的主从复制是建立在内存快照的持久化基础上,只要有Slave就一定会有内存快照发生。虽然Redis宣称主从复制无阻塞,但由于磁盘io的限制,如果Master快照文件比较大,那么dump会耗费比较长的时间,这个过程中Master可能无法响应请求,也就是说服务会中断,对于关键服务,这个后果也是很可怕的。

以上1.2.3.4根本问题的原因都离不开系统io瓶颈问题,也就是硬盘读写速度不够快,主进程 fsync()/write() 操作被阻塞。

5.单点故障问题,由于目前Redis的主从复制还不够成熟,所以存在明显的单点故障问题,这个目前只能自己做方案解决,如:主动复制,Proxy实现Slave对Master的替换等,这个也是Redis作者目前比较优先的任务之一,作者的解决方案思路简单优雅,详情可见 Redis Sentinel design draft http://redis.io/topics/sentinel-spec。

总结:

1.Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。

2.如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

3.为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。

4.尽量避免在压力较大的主库上增加从库

5.为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<--Slave1<--Slave2<--Slave3.......,这样的结构也方便解决单点故障问题,实现Slave对Master的替换,也即,如果Master挂了,可以立马启用Slave1做Master,其他不变。

Redis常见性能问题和解决办法相关推荐

  1. 移动端常见兼容性问题及解决办法

    移动端常见兼容性问题及解决办法 参考文章: (1)移动端常见兼容性问题及解决办法 (2)https://www.cnblogs.com/crazycode2/p/6624742.html 备忘一下.

  2. android.mk 编译32位_C/C++初学者常见编译错误及其解决办法

    用户在C/C++集成开发环境(例如 Dev-C++)中编辑了源代码,执行编译之后,常常会因为源代码中存在问题而出现编译错误(它们会显示在编译窗口中).初学者常常会面对这些错误而不知如何处理.本文下面列 ...

  3. Oracle常见ORA错误及解决办法

    Oracle常见ORA错误及解决办法 问题1 1.1 错误现象: EXP-00008: ORACLE error 1013 encountered ORA-01013: user requested ...

  4. android 关闭jack_Android7.0编译 jack常见错误类型及解决办法

    我使用的源码为SudaMod,3.1分支的源代码,第一次编译Android M以上的源码,就莫名其妙的遇到了几个关于JACK的坑,以下就列举几个常见的错误以及解决办法. 第一个错误: Out of m ...

  5. 歌华有线回看显示服务器忙,歌华有线机顶盒常见故障问题及解决办法

    [导读]机顶盒的使用让更多的高清节目和高清频道为人们所观看,丰富了人们的娱乐生活,但是使用过程中常常会遇到故障.下面就为您介绍一下歌华有线机顶盒常见故障问题及解决办法. 随着电视机的发明与发展,电视已 ...

  6. 光复印机常见故障代码及解决办法

    光复印机常见故障代码及解决办法光复印机常见故障代码及解决办法光复印机常见故障代码及解决办法光复印机常见故障代码及解决办法 sc194,302,320,322,390,401,402,500,541,5 ...

  7. VS2019遇见的常见错误之一及其解决办法( MSB803 找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决

    VS 2019 遇见的常见错误之一及其解决办法( MSB803 找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解 ...

  8. 传奇外网架设常见的问题及解决办法-传奇创建人物失败/不开门/PAK显示密码错误/脚本错误

    传奇外网架设常见的问题及解决办法-传奇创建人物失败/不开门/PAK显示密码错误/脚本错误 在架设传奇的时候是否有遇到无法创建人物.pak密码错误等一系列情况呢?咱们都知道是架设不对的问题,但是具体是哪 ...

  9. PHP网站常见“一句话木马”攻击解决办法

    如何破解PHP网站"一句话木马" PHP网站常见"一句话木马"攻击解决办法 近期,公司发布的PHP网站挂域名对外发布一段时间,发现经常遭到"一句话木马 ...

最新文章

  1. SpringMVC调用接口一直乱码
  2. STL——内存基本处理工具
  3. Java 线程 — ThreadPoolExecutor
  4. zookeeper宏观认识
  5. ICLR 2021 | 美团、上交大等:鲁棒的可微分神经网络搜索DARTS-
  6. docker高级应用之动态扩展容器空间大小
  7. qt int转换成qstring_「QT界面编程实例」创建颜色下拉框并改变窗体颜色(调色板)...
  8. linux关闭自检测进程,CentOS下自动发邮件检测某进程是否存在
  9. MFC开发IM-第十七篇、CString TCHAR的互相转换
  10. python全栈开发网络_Python全栈开发:django网络框架(二)
  11. js课程 2-6 js如何进行类型转换及js运算符有哪些
  12. 网络的日常——破解电信光猫后开启NAT接口映射
  13. C语言连连看秒杀辅助
  14. Interview Tips with Consulting Firms
  15. 操作系统与计算机组织基本知识(一)
  16. python的MYSQLdb
  17. 以太坊:在合约里调用指定地址的另一已部署合约
  18. 我的理想计算机应用作文,我的理想当一名程序员作文
  19. Ecshop及大商创198版本,解决Deprecated: preg_replace()报错
  20. 无源晶振用示波器如何测量

热门文章

  1. 北京哪里学计算机中控,多媒体教室中控系统
  2. ffmpeg 命令集的简单实用方法
  3. linux防火墙设置禁用网络,linux如何禁用防火墙
  4. 计算机网络报告书,河北工业大学计算机网络课程设计报告书
  5. 15.125GB是多少MB
  6. 数组-奇数位上都是奇数或者偶数位上都是偶数(牛客网)
  7. 走在全球化长征路上的BitZ
  8. 阻容感基础08:电感特性原理(2)- 电磁感应定律
  9. Artisteer 3.1
  10. 【C++】运算符重载2-深拷贝深赋值、前加加后加加的重载