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,其他不变。
原文链接:http://zhupan.iteye.com/blog/1576108
分享到:
相关推荐
10.1.2 redis常见性能问题和解决方案
标题"用Go编写的基于代理的高性能Redis集群解决方案Codis.rar"指出,这是一个使用Go编程语言实现的,针对Redis集群的高性能解决方案,名为Codis。Codis是一个中间件,旨在解决单个Redis实例在处理大规模数据和高并发...
Redis 高可用技术解决方案主要关注如何确保在系统故障时仍能提供持续的服务,并且保证数据的可靠性和一致性。本文将对Redis的四种常见使用方式进行详细分析,包括它们的优缺点,以便选择最适合特定业务场景的解决...
### Redis热点Key与大Key解决方案 #### 一、热点Key问题及解决方案 **问题描述**: 在使用Redis作为缓存时,热点Key是指那些访问频率非常高但更新频率相对较低的键值对。这类键的存在可能导致所有请求集中在少数几...
【Redis实战解决方案】在IT行业中,Redis作为一款高性能的键值存储系统,常用于缓存、消息队列等多种场景。然而,在实际应用中,我们可能会遇到一些常见的问题,如双写一致性、缓存雪崩、缓存穿透以及缓存并发竞争。...
【Redis高可用技术解决方案】 Redis作为一种高性能的键值存储系统,广泛应用于缓存、消息队列等场景。然而,为了确保服务的连续性和数据的可靠性,实现Redis的高可用性至关重要。以下是一些常见的Redis高可用技术...
Redis Cluster是Redis的分布式解决方案,提供了数据分区和自动故障转移。每个节点存储一部分数据,当节点故障时,集群会自动重新分配数据。这种方式能处理大规模数据和高并发,但部署和管理复杂,需要理解槽分区概念...
Redis,作为一个高性能的键值数据库,常常被用于处理高并发场景下的数据存储和访问问题。在高并发环境下,Redis提供了多种策略和优化措施来保证服务的稳定性和性能。以下是一些关于Redis高并发解决方案的关键知识点...
哨兵作为Redis的高可用解决方案,能够监控Redis主从服务器的运行状态,并在出现问题时进行自动故障转移,保证服务的持续可用性。 总结来说,《Redis开发与运维》是一本全面覆盖Redis核心技术要点和实际操作的优秀...
本项目是基于C#的NewLife.Redis高性能Redis协议封装设计源码,包含119个...该项目是一个高性能的Redis协议封装库,支持.Net Core,经过一年多日均80亿调用量验证,旨在为用户提供一个高效、稳定的Redis客户端解决方案。
1. Redis性能特性: Redis以其内存存储、单线程模型和丰富的数据结构(如字符串、哈希、列表、集合、有序集合)而闻名,这使得它在读写速度上表现出色。它的性能主要体现在以下几个方面: - 高速读写:由于数据...
一个现代化的替代品,可用于替代...它提供了高性能和可扩展的内存存储解决方案,适用于各种应用场景。Dragonfly的设计目标是提供更好的性能、更好的扩展性和更好的稳定性,成为一个可靠的内存缓存和数据存储解决方案。
### Redis高可用技术解决方案 #### 一、引言 随着互联网应用规模的不断扩大和技术的快速发展,数据服务的稳定性成为衡量一个系统是否可靠的关键指标之一。Redis作为一种广泛使用的内存数据库,其高可用性的实现...
如何发现Redis热点Key,解决方案有哪些 Redis热点Key是指在Redis服务器中被频繁访问的Key,导致服务器性能下降、缓存溢出、流量集中等问题。因此,发现和解决Redis热点Key是非常重要的。 一、热点问题产生原因 ...
Redis 是一款广泛使用的开源键值存储系统,常用于构建高性能的分布式缓存和数据库解决方案。在实际应用中,Redis 可能会遇到多种异常场景,影响系统的稳定性和性能。以下是一些常见问题的分析和解决方案: 1. **...
### 如何发现Redis热点Key及解决方案 #### 一、热点Key问题产生的原因 热点Key问题在Redis这样的分布式缓存系统中十分常见,特别是在面对突发流量或特定数据项被频繁访问的情况下更为显著。这类问题通常由以下几个...
### Redis高可用技术解决方案 #### 一、引言 Redis作为一种高性能的键值数据库,在现代互联网应用中扮演着至关重要的角色。随着业务规模的增长和技术需求的变化,如何构建一个既稳定又可靠的Redis服务变得越来越...
再者,Redis Cluster是Redis的分布式集群解决方案,通过数据分片实现水平扩展,提供高可用性和读写能力。每个节点存储一部分数据,故障时可自动转移,解决了主从模式的部分问题。但Cluster有其自身的复杂性,如槽...
在生产环境中,选择合适的Redis架构是至关重要的,它直接影响到系统的稳定性和性能。本文将深入探讨Redis的生产架构选型,包括其版本特性、架构类型及其适用场景。 首先,关于Redis的版本选择,最新版本通常包含更...
3. **网络延迟**:网络连接质量对Redis性能有显著影响。可以考虑使用连接池、预热连接,以及优化网络配置来减少延迟。 4. **并发访问**:Redis默认单线程模型可能导致并发处理能力受限。可通过主从复制、Sentinel...