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的服务器负载图如下:
Master Server load:
Slave server load:
上面的情况本来不会也不应该发生的,是因为以前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,其他不变。
今天暂时写这么多吧,以后再补充。
分享到:
相关推荐
10.1.2 redis常见性能问题和解决方案
10.1.5 Redis 常见的性能问题都有哪些?如何解决?
本手册将详细探讨Redis性能问题的排查与解决方法。 一、Redis性能瓶颈分析 1. 内存管理:Redis的数据全部存储在内存中,因此内存使用效率是关键。当内存不足时,Redis可能会启用LRU(最近最少使用)或LFU(最不...
4. 并发get操作时,memcache和redis的TPS在1KB数据时接近,但在10KB和100KB数据时,memcache保持较高TPS,而redis性能下降。 【总结】 根据测试结果,redis在单线程set和get操作中表现出色,但在高并发set操作且...
为了监控Redis的流量,Redis提供了相应的监控机制,它可以帮助系统管理员和开发人员了解Redis服务器的性能和运行状况,从而进一步优化和调整系统。 最后,Redis在Java程序员中非常受欢迎,尤其是在面对高并发场景时...
Redis硬核性能优化主要关注如何识别和解决Redis性能下降的问题,以及如何进行系统性的优化流程。Redis作为一款高性能的键值存储数据库,广泛应用于缓存和数据存储场景,但其性能受到多种因素影响。 一、Redis变慢的...
本项目是基于C#的NewLife.Redis高性能Redis协议封装设计源码,包含119个文件,其中包括95个C#源文件、6个csproj文件、3个YAML文件、2个PNG图片文件、2个pubxml文件、1个Editorconfig文件、1个gitignore文件、1个eddx...
1.2 redis 常见性能问题和解决方案 1.3 MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据 1.4 Memcache 与 Redis 的区别都有哪些? 1.5 Redis 常见的性能问题都有哪些?如何...
Redis 常见阻塞原因和解决方法 Redis 是一个基于内存的数据存储系统,具有高性能和高效的特点,但是在实际使用中,Redis 也可能会出现阻塞的问题,影响系统的性能和稳定性。下面我们将介绍 Redis 中常见的阻塞原因...
综上所述,Redis以其高性能、丰富的数据结构和灵活的持久化策略,成为许多开发者首选的内存数据存储解决方案。然而,合理地规划和管理内存使用,以及选择合适的集群方案,是使用Redis时必须考虑的关键因素。
在本文中,我们将重点讨论Redis的类库、String类型的应用,以及如何利用Redis来解决订单秒杀超卖的问题。同时,还会涉及C# .Net Core下极光推送的代码实现。 首先,让我们来看看C# .Net Core下如何使用Redis的类库...
本文中提到的node redis client采用的基于node-redis封装的二方包,因此问题排查也基于node-redis这个模块。接下来通过本文给大家分享提升node.js中使用redis的性能
标题"用Go编写的基于代理的高性能Redis集群解决方案Codis.rar"指出,这是一个使用Go编程语言实现的,针对Redis集群的高性能解决方案,名为Codis。Codis是一个中间件,旨在解决单个Redis实例在处理大规模数据和高并发...
1. Redis性能特性: Redis以其内存存储、单线程模型和丰富的数据结构(如字符串、哈希、列表、集合、有序集合)而闻名,这使得它在读写速度上表现出色。它的性能主要体现在以下几个方面: - 高速读写:由于数据...
Redis是一款开源的高性能键值对存储系统,常被用作数据库、缓存和消息中间件。本书《Redis开发与运维...通过阅读本书,读者可以系统地掌握Redis的各项核心功能和最佳实践,为高效利用Redis解决实际问题奠定坚实的基础。
本文将详细介绍 Redis 客户端常见的异常类型、原因和解决方法。 一、无法从连接池获取连接异常 在使用 JedisPool 连接 Redis 时,可能会出现无法从连接池获取连接的异常。这是因为 JedisPool 中的 Jedis 对象个数...
总的来说,Redis和RedisDesktop的结合使用,为开发者提供了高效、便捷的数据存储和管理解决方案。无论是用于缓存、消息队列还是其他用途,Redis的高性能和丰富功能,加上RedisDesktop的直观操作,都是IT行业中不可或...
总的来说,通过结合Redis的乐观锁机制、连接池优化和分布式锁,我们可以有效地解决高并发环境下的连接超时和超卖问题,保障系统的稳定性和正确性。在实际项目中,还需要根据具体业务需求和系统架构进行调整和优化。