首页 > 数据库 >Redis核心知识之—— 时延问题分析及应对、性能问题和解决方法【★★★★★】...

Redis核心知识之—— 时延问题分析及应对、性能问题和解决方法【★★★★★】...

时间:2023-04-05 20:38:18浏览次数:46  
标签:... 结点 AOF Redis Master 时延 进程 重写


 参考网址:

Redis常见的性能问题和解决方法:http://www.searchdatabase.com.cn/showcontent_63439.htm

Redis主从配置详细过程:http://sofar.blog.51cto.com/353572/861276

 

读后感:

1、在架构设计中,有“分流”一招,说的是将处理快的请求和处理慢的请求分离来开,否则,慢的影响到了快的,让快的也快不起来;这在redis的设计中体现的非常明显,redis的纯内存操作,epoll非阻塞IO事件处理,这些快的放在一个线程中搞定,而持久化,AOF重写、Master-slave同步数据这些耗时的操作就单开一个进程来处理,不要慢的影响到快的;

2、控制每个redis实例的最大内存量,一般建议不超过20G,可根据自己服务器的性能来确定(内存越大,持久化的时间越长,复制页表的时间越长,对事件循环的阻塞就延长) 

     新浪微博给的建议是不超过20G,而我们虚机上的测试,要想保证应用毛刺不明显,可能得在10G以下;

3、master-slave:在主结点上开持久化,主结点不对外提供查询,查询由slave结点提供,从结点不提供持久化;这样,所有的fork耗时的操作都在主结点上,而查询请求由slave结点提供; 

Redis核心知识之—— 时延问题分析及应对、性能问题和解决方法【★★★★★】..._结点

简单的实现方案是主不具有可替代性,坏了之后,redis集群对外就只能提供读,而无法更新;待主结点启动后,再继续更新操作;对于之前的更新操作,可以用MQ缓存起来,等主结点起来之后消化掉故障期间的写请求;

4、子进程持久化时,子进程的write和主进程的fsync冲突造成阻塞

在开启了AOF持久化的结点上,当子进程执行AOF重写或者RDB持久化时,出现了Redis查询卡顿甚至长时间阻塞的问题, 此时, Redis无法提供任何读写操作;

原因分析: 
Redis 服务设置了 appendfsync everysec, 主进程每秒钟便会调用 fsync(), 要求内核将数据”确实”写到存储硬件里. 但由于服务器正在进行大量IO操作, 导致主进程 fsync()/操作被阻塞, 最终导致 Redis 主进程阻塞.

当执行AOF重写时会有大量IO,这在某些Linux配置下会造成主进程fsync阻塞;

解决方案: 
设置 no-appendfsync-on-rewrite yes, 在子进程执行AOF重写时, 主进程不调用fsync()操作;注意, 即使进程不调用 fsync(), 系统内核也会根据自己的算法在适当的时机将数据写到硬盘(Linux 默认最长不超过 30 秒). 
这个设置带来的问题是当出现故障时,最长可能丢失超过30秒的数据,而不再是1秒。

解决方案: 
将硬盘设置的足够大,将AOF重写的阈值调高,保证高峰期间不会触发重写操作;在闲时使用crontab 调用AOF重写命令;

 

Redis常见的性能问题和解决方法

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

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

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

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

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

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

 









标签:...,结点,AOF,Redis,Master,时延,进程,重写
From: https://blog.51cto.com/tinywan/6171609

相关文章

  • Redis基础知识之—— 缓存应用场景
    一、MySql+Memcached架构的问题Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现。Memcached服务器使用基于Slab的内存管理方式,有利于减少内存碎片和频繁分配销毁内存所带来的开销。各个Slab按需......
  • Redis实践操作之—— keyspace notification(键空间通知)
    源码地址:https://github.com/Tinywan/PHP_Experience一、需求分析:设置了生存时间的Key,在过期时能不能有所提示?如果能对过期Key有个监听,如何对过期Key进行一个回调处理?如何使用Redis来实现定时任务?二、序言:    本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比......
  • Redis 在消息队列中的应用
    1.Redis的List数据类型1.1List数据类型的特点List列表是Redis提供的一种重要的数据类型。它是由若干个字符串元素组成的集合,并且每个字符串元素都是按照插入顺序排序的。也可以将列表理解为多个字符串组成的一个集合对象,并按照链表(LinkList)的插入顺序排序。在读......
  • redis主从同步、哨兵自动故障迁移具体过程解析
    前言本问阐述Redis主从同步、哨兵监控和故障迁移的过程,并通过各个服务日志加以验证。准备工作主从和哨兵安装见安装过程。为了方便通过日志观察同步过程,你可以在每个Redis和Sentinel配置文件中修改下面参数,实现前台运行并将日志输出到控制台。#这两个配置是为了实......
  • RedisTemplate Pipeline 封装和使用,优化Redis操作
    前言公司游戏项目服务端运行过程中,依赖Redis保存游戏过程数据。与客户端一次交互会对Redis进行大量的操作,在内网开发环境下测试,一次操作开销在1-2ms,建立连接和网络开销累积在一起大大降低了响应速度,这种场景下可以使用RedisPipeline进行优化。RedisPipelineRedis服......
  • Redis布隆过滤器的原理和安装使用
    前言本文讲述布隆过滤器(RedisBloom)的基本原理和安装使用。RedisBloom是什么?RedisBloom是Redis中过滤器模块,可以用来判断值是否存在,常用来解决缓存穿透问题。查询数据时,先用RedisBloom判断数据是否存在,不存在则直接返回,存在则从缓存/数据库获取后返回。比如查询接......
  • Redis 在排行榜中的应用
    1.Redis的SortedSet数据类型1.1SortedSet数据类型的特点SortedSet有序集合是Redis提供的一种重要的数据类型。它是由不重复且有序的字符串元素组成的,而且每个元素都会关联一个double类型的分数,通过该分数来为集合中的成员进行从小到大的排序。SortedSet的......
  • Redis持久化RDB和AOF原理解析、使用和优缺点对比
    前言本文讲述Redis两种持久化方式RDB和AOF优缺点以及原理。为何需要持久化?Redis是基于内存操作的,进程终止、服务器宕机后内存数据会丢失,但是在很多使用场景中我们希望数据不丢失,服务重启之后数据还能恢复到停机前的状态,特别是使用Redis做数据库的情况。Redis持久化......
  • Docker yum install的时候报错:Rpmdb checksum is invalid: dCDPT(pkg checksums): ...
    闲话就不说了,直接上Dockerfile:FROMhub.c.163.com/library/centos:7.2.1511MAINTAINERbyzsk_johnRUNyum-yinstallvimnet-tools&&yumcleanallEXPOSE22CMD["/bin/bash","-D"]注意一点,如果拆开写RUN,也就是yuminstallvim-y&&yuminst......
  • Redis 在身份认证中的应用
    1.Redis在Session共享问题中的应用传统Session-Cookeis身份认证方法中,一个Session只保存在一台服务器上,适合域单体应用。随着项目规模的增加,项目的架构也不断向微服务分布式集群演进,传统的Session-Cookie方式在集群环境下就不能很好的工作了,这时就产生了Session共......