Redis 性能管理 主从复制与哨兵模式
目录
redis性能管理
内存碎片率
如何清理内存
面试题
Redis雪崩
Redis集群大面积故障
面试:Redis的缓存击穿
Redis的缓存穿透
Redis的集群高可用方案
redis的主从复制
哨兵模式
redis性能管理
| redis的数据缓存在内存当中 |
info memory
#在redis数据库中查看的命令,可以看到当前它使用系统内存的情况used_memory:1800800
#表示redis数据占用的内存,单位是字节used_memory:_rss:5783552
#表示redis向操作系统申请的内存used_memory_peak:1800800
#redis使用内存的峰值,最高值#运维工作日常:系统巡检,还有关键组件巡检,数据库,nginx,redis,docker,k8s
内存碎片率
used_memory:_rss / used_memory
#用向操作系统申请的内存除以redis数据占用的内存得出为内存碎片率
#内存的碎片率指系统已经分配给了redis,但是redis未能够有效利用的内存工作中非常重要的指标allocator_frag_ration:1.19
#分配器碎片的比率,redis主进程调度时产生的内存空间,比例越小越好,值越高,内存的浪费越多allocator_rss_ration:7.15
#分配器占用的物理内存的比率,告诉你主进程调度执行时占用了多少物理内存ass_overhead_ration:0.31
#rss是向系统申请的内存空间,redis占用物理空间额外的开销比例,比率越低越好,表示redis实际占用的物理内存和向系统申请的内存越接近,额外的开销越低,mem_fragmentation_ratio:3.33
#内存碎片的比例,越低越好,内存的使用率越低越好
如何清理内存
| 自动清理 | 自动清理需要配置redis文件 且一定需要设置redis的最大内存阀值 vim /etc/redis/6379.conf |
| 手动清理 | 客户端输入命令 redis-cli memory purge |
#配置文件一定要设置阀值
Vim /etc/redis/6379.confactivedefrag yes
#最后一行插入 ,开启自动清理,只要达到一定的阀值(需要手动配置,如下)maxmemory 1gb
#567行 达到阀值,会自动清理碎片,需要配合开启key的回收机制maxmemory-policy volatile-lru
#599行左右,使用redis内置的LRU算法,把已经设置了过期时间的键值对中淘汰数据,移除最近最少使用键值对(针对已经设置了过期时间的键值对)(推荐该配置)maxmemory-policy volatile-ttl
#已经设置了过期时间的键值对,从当中挑选一个即将过期的键值对。(针对有设置生命周期的键值对)maxmemory-policy volatile-random
#从已经设置了过期时间的键值对当中,挑选数据随机淘汰键值对(对设置了过期时间的键值对进行随机移除)allkeys-lru
#根据LRU算法当中对所有的键值对,进行淘汰,移除最少使用的键值对,(针对所有的键值对)allkeys-random
#对所有键值对当中任意选择数据进行淘汰maxmemory-policy noeviction
#禁止键值对回收,不删除任何键值对,直到redis把内存塞满,写不了,报错为止.(推荐这个配置)
面试题
| 你在工作当中发现redis占用内存过高的效率问题,如何解决 | |
| 1 | 日常巡检当中,对redis占用情况做监控 |
| 2 | 设置redis占用系统内存的阀值,避免占用系统全部内存 |
| 3 | 内存碎片清理,有手动清理和自动清理 |
| 4 | 配合合适的key回收机制 |
Redis雪崩
| 也叫缓存雪崩,大量的应用请求无法再redis缓存当中处理,请求会全部发送到后台数据库,数据库并发能力本身就很差,一旦高并发,数据库很快崩溃 |
Redis集群大面积故障
| 原因 | 在redis缓存中,大量数据同时过期,大量的请求无法得到处理,还有可能是redis实例宕机,或者恶意删除了键值对。 |
| 解决方案 | |
| 事前 | 高可用架构,防止整个缓存故障,主从复制和哨兵模式,redis集群 |
| 事中 | 在国内用的比较多的方式 HySTRIX(基于代码机制实现),熔断机制(到达请求阀值立即断开),降级(到达阀值之后自动降低并发请求数量),限流(只允许一定数量的请求到服务器上),这几个方式来降低雪崩发生之后的损失,确保数据库存活,速度慢一点,效率低一点可以接收,但不能没有响应 |
| 事后 | 通过redis备份,快速缓存预热 |
面试:Redis的缓存击穿
| 1 | 缓存击穿主要是热点数据缓存过期,或者被删除,当多个请求并发访问热点数据,请求转发到了后台数据库,从而导致数据库的性能快速下降 |
| 2 | 键值对还在,但是值被替换了,原有的请求找不到之后,同样也会去请求后台数据库 |
| 经常被请求的缓存数据最好设置为永不过期 |
Redis的缓存穿透
| 缓存中没有数据,数据库也没有对应的数据,但是有用户一直发起这个没有的请求,而且请求的数据格式很大,这就是黑客在利用漏洞攻击,用来压垮应用数据库 |
Redis的集群高可用方案
| 1 | 持久化 |
| 2 | 高可用 主从复制,哨兵模式,集群 |
redis的主从复制
| 概念 | 它是redis实现高可用的基础,哨兵模式和集群都是在主从复制的基础之上实现高可用 主从复制实现数据的多机备份以及读写分离(主服务器负责写,从服务器只能读),缺点是故障无法自动恢复,需要人工干预,写操作的负载均衡 |
| 原理 | 主节点(master)从节点(slave)组成,数据复制是单向的,只能从主节点到从节点,从节点只能读 |
| 工作流程 | 首先slave1会向主发送一个syn command 请求建立连接,主节点收到之后不管slave是第一次连接还是从新连接,主节点都会启动一个后台进程,执行Bgsave,并且主节点会把所有修改数据的命令加载到缓存和数据文件之中,数据文件创建完毕之后由master传送给slave,slave会把这个数据文件,先保存到硬盘,再加载到内存 主从复制推荐使用AOF |

实验
主机1
[root@c1 ~]# systemctl stop firewalld
[root@c1 ~]# setenforce 0
[root@c1 ~]# vim /etc/redis/6379.confbind 0.0.0.0
#70行,监听地址改成所有网段都可以通信daemonize yes
#137行,打开logfile /var/log/redis_6379.log
#172行,日志文件要打开dir /var/lib/redis/6379
#264行,这是工作目录appendonly yes
#AOF持久化模式打开
[root@c1 ~]# /etc/init.d/redis_6379 restart主机2
[root@c2 ~]# systemctl stop firewalld
[root@c2 ~]# setenforce 0
[root@c2 ~]# vim /etc/redis/6379.confbind 0.0.0.0
#70行,所有网段都可以通信daemonize yes
#137行,守护进程打开dir /vr/lib/redis/6379
#264行,日志文件要打开replicaof 192.168.233.66 6379
#在288行,开启后从节点将成为只读模式,指向主的ip,6379是主的端口号appendonly yes
#AOF同步要打开[root@c2 ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...主机3
[root@c3 ~]# systemctl stop firewalld
[root@c3 ~]# setenforce 0
[root@c3 ~]# vim /etc/redis/6379.confbind 0.0.0.0
#70行daemonize yes
#288行,后台同步打开replicaof 192.168.233.66 6379
#288行,打开appendonly yes
#700行,打开[root@c3 ~]# /etc/init.d/redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...#如果要确定是否配置成功可以查看一下日志
主机1
[root@c1 ~]# tail -f /var/log/redis_6379.log
4928:M 22 Nov 2023 23:14:28.212 * Synchronization with replica 192.168.233.67:6379 succeeded
4928:M 22 Nov 2023 23:18:54.708 * Synchronization with replica 192.168.233.68:6379 succeeded
#表示已经配置且同步成功#然后直接验证主从是否可以进行复制,从是否为只读且不能写入
哨兵模式
| 概念 | 先有主从复制再有哨兵模式,在主从复制的基础之上,从而实现主节点故障的自动切换 |
| 原理 | 哨兵模式是一个分布式系统,用于在主从结构之间,对每台redis的服务进行监控,主节点出现故障时,从节点通过投票的方式选择一个新的master,哨兵模式也需要至少三个节点 |
| 结构 | 哨兵节点:监控,不存储任何数据 数据节点:主节点和从节点都是数据节点 |
| 工作流程 | 每个哨兵节点之间每隔一秒,会通过ping命令方式,互相监控主从之间的节点心跳线,主节点在一定时间内没有回复或者回复了错误的消息,这个时候,哨兵就会主观的认为主节点下线了,而超过半数的哨兵节点认为主节点下线,则会被认为主节点客观下线,一旦被认为客观下线,哨兵节点会通过raft算法(选举算法),每个节点共同投票选举出一个新的master,然后新的master实现主节点转移和故障恢复通知 |
| 主节点的选举过程 1.已经下线的从节点不会被选为主节点 2.选择配置文件当中,从节点优先级最高的replica-prioity 100 3.选择一个复制数据最完整的从节点 |

实验
主机1
[root@c1 ~]# vim /opt/redis-5.0.7/sentinel.confprotected-mode no
#17行,取消注释,关闭保护模式port 26379
#21行,哨兵模式的默认端口daemonize yes
#26,指定哨兵模式是否后台运行改成也是pidfile /var/run/redis-sentinel.pid
#31行,哨兵模式的进程文件logfile "/var/log/sentinel.log"
#36行,指定他的日志文件的存放路径dir "/var/lib/redis/6379"
#65行,指定它的数据库存放路径sentinel monitor mymaster 192.168.233.66 6379 2
#84行,指定初始的主服务器,ip要指向主,6379为主的端口,2表示最少需要2台服务器认为主已经下线,才会进行主从切换,6台服务器就要3台或者4台sentinel down-after-milliseconds mymaster 30000
#113行,判断服务器宕机的最小超时时间30000毫秒,也就是30秒内没有反应就会主观认为主服务器已下线sentinel failover-timeout mymaster 180000
#146行,判断服务器宕机的最大超时时间180000毫秒,也就是180秒内没有反应,两台从节点就会共同投票主节点下线,进行主从切换[root@c1 redis-5.0.7]# cd /opt/redis-5.0.7/
[root@c1 redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 17695主机2
[root@c2 redis-5.0.7]# vim /opt/redis-5.0.7/sentinel.confprotected-mode no
#17行,取消注释保护模式关闭daemonize yes
#26行,后台运行打开logfile "/var/log/sentinel.log"
#36行,指定日志文件路径dir /var/lib/redis/6379
#65行,指定数据库的工作目录sentinel monitor mymaster 192.168.233.66 6379 2
#84行,指向原主服务器ip#最小超时时间与最大超时时间需要打开113行最小,146行最大[root@c2 opt]# cd /opt/redis-5.0.7/
[root@c2 redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 57998主机3
[root@c3 ~]# vim /opt/redis-5.0.7/sentinel.confprotected-mode no
#17行,取消注释保护模式关闭daemonize yes
#26行,后台运行打开logfile "/var/log/sentinel.log"
#36行,指定日志文件路径dir /var/lib/redis/6379
#65行,指定数据库的工作目录sentinel monitor mymaster 192.168.233.66 6379 2
#84行,指向原主服务器ip#最小超时时间与最大超时时间需要打开113行最小,146行最大[root@c3 redis-5.0.7]# redis-sentinel sentinel.conf &
[1] 48920主机1
[root@c1 redis-5.0.7]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.233.66:6379,slaves=2,sentinels=2
#表示为主服务器,ip为66,有两个从服务器,2台机器(一主两从应该是3)
[root@c1 redis-5.0.7]# tail -f /var/log/sentinel.log
#看从节点的信息,ID is cf399f2635f3f5004a61346698b524701afbbb67 id等于ip地址#之后就可以验证主从复制与故障切换,可能会有延迟
相关文章:
Redis 性能管理 主从复制与哨兵模式
目录 redis性能管理 内存碎片率 如何清理内存 面试题 Redis雪崩 Redis集群大面积故障 面试:Redis的缓存击穿 Redis的缓存穿透 Redis的集群高可用方案 redis的主从复制 哨兵模式 redis性能管理 redis的数据缓存在内存当中 info memory #在redis数据库中查…...
volatile 详解
目录 一. 前言 二. 可见性 2.1. 可见性概述 2.2. 内存屏障 2.3. 代码实例 三. 不保证原子性 3.1. 原子性概述 3.2. 如何解决 volatile 的原子性问题呢? 四. 禁止指令重排 4.1. volatile 的 happens-before 关系 4.2. 代码实例 五. volatile 应用场景 5…...
Flink Operator 使用指南 之 Flink Operator安装
介绍 Flink Kubernetes Operator 充当控制平面来管理 Apache Flink 应用程序的完整部署生命周期。尽管 Flink 的Native Kubernetes 集成已经允许用户在运行的 Kubernetes(k8s) 集群上直接部署 Flink 应用程序,但自定义资源和Operator Pattern 也已成为 Kubernetes 原生部署体…...
类与对象(上篇)
前言 在之前我们学的C入门主要是为现在学习类与对象打基础,今天我们才算真正开始学习C了。因为类与对象的知识点比较多,所以我们将它分为三部分讲解,今天我们学习类与对象的上篇。 一、面向过程和面向对象的初步认识 1、面向过程 面向过程顾…...
使用SpringBoot集成MyBatis对管理员的查询操作
增删改查中的查询操作,对所有的普通管理员进行查询操作。 效果展示: 不仅可以在打开页面时进行对管理员的自动查询操作,还可以在输入框进行查询。 首先是前端向后端发送POST请求,后端接收到请求,如果是有参数传到后端…...
数据报文去哪儿了
背景 今天遇到一个诡异的现象,当接口附加一个IP时,主IP业务正常,附加IP死活不行,tcpdump抓包确可以正常抓到到业务的报文,但是在PREROUTING raw添加规则确没有命中,说明报文没有到netfilter框架内ÿ…...
Mysql中join on中的like使用
1、使用mysql中的函数CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。 SELECT * FROM Table1 INNER JOIN Table2 ON Table1.col LIKE CONCAT(%, Table2.col, %) 2、放弃使用join语句 SELECT * FROM Table1, T…...
微信运营神器:从群发到批量添加,让你的微信营销更轻松
在这个数字化时代,微信已经成为了我们生活中不可或缺的一部分。对于许多企业和个人来说,微信营销也是非常重要的一部分。但是,微信营销并不是一件容易的事情,需要花费大量的时间和精力。为了解决这个问题,今天我们将向…...
白杨SEO:2B企业营销是什么?当下主流的短视频直播平台有哪些?企业营销要做短视频直播选哪个平台更好?
今天白杨SEO就正式来讲讲2B企业营销选择哪个短视频直播平台更好? 图片在公众号:白杨SEO上看。 文章大纲提前看: 1、先说说2B企业营销是什么? 2、当下主流的短视频直播平台有哪些? 3、2B企业营销要做短视频直播选哪…...
将word中的表格无变形的弄进excel中
在上篇文章中记录了将excel表拷贝到word中来: 记录将excel表无变形的弄进word里面来-CSDN博客 本篇记录:将word中的表格无变形的弄进excel中。 1.按F12,“另存为...”,保存类型:“单个文件页面”,保存。…...
美国服务器在大陆连不上怎么回事?
在租用任何美国服务器之前,都需要先搞清楚一些使用问题,毕竟服务器能够不间断地访问也是站在们所期望的。但有时,美国服务器网站或许也会突然出现在大陆打不开的情况,在面临这种情况时,我们应该怎么做? 查看连不…...
postgresql数据库中update使用的坑
简介 在数据库中进行增删改查比较常见,经常会用到update的使用。但是在近期发现update在oracle和postgresql使用却有一些隐形区别,oracle 在执行update语句的时候set 后面必须跟着1对1的数据关联而postgresql数据库却可以一对多,这就导致数据…...
高可用elasticsearch集群搭建
目录 一、环境准备 二、机器配置 2.1 创建用户 2.2 修改用户权限 2.3 解析主机名 2.4 优化最大文件数 2.5 优化最大进程数 2.6 优化虚拟内存 2.7 重载配置 三、部署 3.1 创建文件夹并赋予权限 3.2 解压安装包并赋予权限 3.3 配置环境变量 3.4 创建数据、证书存放目录并赋…...
Linux本地MinIO存储服务远程调用上传文件
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…...
C语言 子函数调malloc申请内存返回给主函数使用——可行,但要注意
一般情况,子函数中动态申请内存,将地址返回给主函数,理论上应该也是可以的,需要子函数返回动态内存地址,主函数实参是相应的地址变量即可。只不过,主函数实参传入子函数之前,可能会将指针置空&a…...
Python入门教程之条件语句与运算符优先级详解
文章目录 Python 条件语句Python运算符优先级关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 Python 条件语句 …...
高通Camera HAL3: CamX、Chi-CDK要点
目录 一、概述 二、目录 三、CamX组件之前的关系 一、概述 高通CamX架构是高通实现的相机HAL3架构,被各OEM厂商广泛采用。 二、目录 代码位于vendor/qcom/proprietary下: camx:通用功能性接口的代码实现集合chi-cdk:可定制化…...
springboot+vue热带野生动物园景点预约门票订票系统
热带野生动物园景点预约订票系统为野生动物园提供景点管理服务的系统,通过登录系统,管理该野生动物园所有的景点信息、景点分类信息、野生动物园新闻、通知公告、回复会员留言等,并可以通过订单管理查看会员预定的订单信息,对订单…...
Flutter和Android的混合跳转
1、项目特点 项目是Flutter作为主工程,将Android module或SDK作为模块嵌入到flutter中,与通常所熟悉的Android(或iOS)工程将flutter 为module嵌入到工程中有所不同。 2、业务需求 任意界面间的跳转,不管是flutter页…...
CyberRT-共享内存实现
CyberRT共享内存类图 共享内存消息发布 数据用共享内存发布时,首先会创建ShmTransmitter对象,包含两个主要成员segment和notifier,Segment用于创建共享内存(上面绿色部分),Notifer 最终构建ReadableInfo通…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
