分布式缓存-Redis集群

news2024/11/27 15:33:02

单点Redis的问题

数据丢失问题

Redis是内存存储,服务重启可能会丢失数据

并发能力问题

单节点Redis并发能力虽然不错,但也无法满足如618这样的高并发场景

故障恢复问题

如果Redis宕机,则服务不可用,需要一种自动的故障恢复手段

存储能力问题

Redis基于内存,单节点能存储的数据量难以满足海量数据需求

一、Redis持久化

1、RDB持久化

RDB

RDB全称Redis Database Backup fileRedis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

快照文件称为RDB文件,默认是保存在当前运行目录。

Redis停机时会执行一次RDB

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

RDB的其它配置也可以在redis.conf文件中设置:

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write技术:

当主进程执行读操作时,访问共享内存;
当主进程执行写操作时,则会拷贝一份数据,执行写操作。

总结:

RDB方式bgsave的基本流程?

fork 主进程得到一个子进程,共享内存空间
子进程读取内存数据并写入新的 RDB 文件
用新 RDB 文件替换旧的 RDB 文件。

RDB会在什么时候执行?save 60 1000代表什么含义?

默认是服务停止时。
代表 60 秒内至少执行 1000 次修改则触发 RDB

RDB的缺点?

RDB 执行间隔时间长,两次 RDB 之间写入数据有丢失的风险
fork 子进程、压缩、写出 RDB 文件都比较耗时

2、AOF持久化

AOF

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF

AOF的命令记录的频率也可以通过redis.conf文件来配:

配置项

刷盘时机

优点

缺点

Always

同步刷盘

可靠性高,几乎不丢数据

性能影响大

everysec

每秒刷盘

性能适中

最多丢失1秒数据

no

操作系统控制

性能最好

可靠性较差,可能丢失大量数据

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

RDBAOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

RDB

AOF

持久化方式

定时对整个内存做快照

记录每一次执行的命令

数据完整性

不完整,两次备份之间会丢失

相对完整,取决于刷盘策略

文件大小

会有压缩,文件体积小

记录命令,文件体积很大

宕机恢复速度

很快

数据恢复优先级

低,因为数据完整性不如AOF

高,因为数据完整性更高

系统资源占用

高,大量CPU和内存消耗

低,主要是磁盘IO资源

AOF重写时会占用大量CPU和内存资源

使用场景

可以容忍数分钟的数据丢失,追求更快的启动速度

对数据安全性要求较高常见

二、Redis主从

1、搭建主从架构

单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。

总结:

假设有AB两个Redis实例,如何让B作为Aslave节点?

B 节点执行命令: slaveof A IP A port

2、主从数据同步原理

主从第一次同步是全量同步

master如何判断slave是不是第一次来同步数据?这里会用到两个很重要的概念:

Replication Id :简称 replid ,是数据集的标记, id 一致则说明是同一数据集。每一个 master 都有唯一的 replid slave 则会继承 master 节点的 replid
offset :偏移量,随着记录在 repl_baklog 中的数据增多而逐渐增大。 slave 完成同步时也会记录当前同步的 offset 。如果 slave offset 小于 master offset ,说明 slave 数据落后于 master ,需要更新。

因此slave做数据同步,必须向master声明自己的replication id offsetmaster才可以判断到底需要同步哪些数据

总结:

简述全量同步的流程?

slave 节点请求增量同步
master 节点判断 replid ,发现不一致,拒绝增量同步
master 将完整内存数据生成 RDB ,发送 RDB slave
slave 清空本地数据,加载 master RDB
master RDB 期间的命令记录在 repl_baklog ,并持续将 log 中的命令发送给 slave
slave 执行接收到的命令,保持与 master 之间的同步

三、Redis哨兵

1、哨兵的作用和原理

哨兵的作用

Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:

监控 Sentinel 会不断检查您的 master slave 是否按预期工作
自动故障恢复 :如果 master 故障, Sentinel 会将一个 slave 提升为 master 。当故障实例恢复后也以新的 master 为主
通知 Sentinel 充当 Redis 客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给 Redis 的客户端

服务状态监控

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

主观下线:如果某 sentinel 节点发现某实例未在规定时间响应,则认为该实例 主观下线
客观下线:若超过指定数量( quorum )的 sentinel 都认为该实例主观下线,则该实例 客观下线 quorum 值最好超过 Sentinel 实例数量的一半。

选举新的master

一旦发现master故障,sentinel需要在salve中选择一个作为新的master,选择依据是这样的:

首先会判断 slave 节点与 master 节点断开时间长短,如果超过指定值( down-after-milliseconds * 10 )则会排除该 slave 节点
然后判断 slave 节点的 slave-priority 值,越小优先级越高,如果是 0 则永不参与选举
如果 slave-prority 一样,则判断 slave 节点的 offset 值,越大说明数据越新,优先级越高
最后是判断 slave 节点的运行 id 大小,越小优先级越高。

如何实现故障转移

当选中了其中一个slave为新的master后(例如slave1),故障的转移的步骤如下:

sentinel 给备选的 slave1 节点发送 slaveof no one 命令,让该节点成为 master
sentinel 给所有其它 slave 发送 slaveof 192.168.150.101 7002 命令,让这些 slave 成为新 master 的从节点,开始从新的 master 上同步数据。
最后, sentinel 将故障节点标记为 slave ,当故障节点恢复后会自动成为新的 master slave 节点

总结:

Sentinel的三个作用是什么?

监控
故障转移
通知

Sentinel如何判断一个redis实例是否健康?

每隔 1 秒发送一次 ping 命令,如果超过一定时间没有相向则认为是主观下线
如果大多数 sentinel 都认为实例主观下线,则判定服务下线

故障转移步骤有哪些?

首先选定一个 slave 作为新的 master ,执行 slaveof no one
然后让所有节点都执行 slaveof master
修改故障节点配置,添加 slaveof master

2、搭建哨兵集群

3、RedisTemplate的哨兵模式

Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。SpringRedisTemplate底层利用lettuce实现了节点的感知和自动切换。

首先,我们引入的Demo工程:

1.pom文件中引入redisstarter依赖:

2.然后在配置文件application.yml中指定sentinel相关信息:

3.配置主从读写分离

这里的ReadFrom是配置Redis的读取策略,是一个枚举,包括下面选择:

MASTER :从主节点读取
MASTER_PREFERRED :优先从 master 节点读取, master 不可用才读取 replica
REPLICA :从 slave replica )节点读取
REPLICA _PREFERRED :优先从 slave replica )节点读取,所有的 slave 都不可用才读取 master

四、Redis分片集群

1、搭建分片集群

分片集群结构

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

海量数据存储问题
高并发写的问题

使用分片集群可以解决上述问题,分片集群特征:

集群中有多个 master ,每个 master 保存不同数据
每个 master 都可以有多个 slave 节点
master 之间通过 ping 监测彼此健康状态
客户端请求可以访问集群任意节点,最终都会被转发到正确节点

2、散列插槽

Redis会把每一个master节点映射到0~1638316384个插槽(hash slot)上,查看集群信息时就能看到:

数据key不是与节点绑定,而是与插槽绑定。redis会根据key的有效部分计算插槽值,分两种情况:

key 中包含 "{}" ,且“ {} ”中至少包含 1 个字符,“ {} ”中的部分是有效部分
key 中不包含“ {} ”,整个 key 都是有效部分

例如:keynum,那么就根据num计算,如果是{itcast}num,则根据itcast计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。

总结:

Redis如何判断某个key应该在哪个实例?

16384 个插槽分配到不同的实例
根据 key 的有效部分计算哈希值,对 16384 取余
余数作为插槽,寻找插槽所在实例即可

如何将同一类数据固定的保存在同一个Redis实例?

这一类数据使用相同的有效部分,例如 key 都以 {typeId} 为前缀

3、集群伸缩

添加一个节点到集群

redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看:

比如,添加节点的命令:

4、故障转移

当集群中有一个master宕机会发生什么呢?

1.首先是该实例与其它实例失去连接

2.然后是疑似宕机:

3.最后是确定下线,自动提升一个slave为新的master

数据迁移

利用cluster failover命令可以手动让集群中的某个master宕机,切换到执行cluster failover命令的这个slave节点,实现无感知的数据迁移。其流程如下:

手动的Failover支持三种不同模式:

缺省:默认的流程,如图 1~6
force :省略了对 offset 的一致性校验
takeover :直接执行第 5 歩,忽略数据一致性、忽略 master 状态和其它 master 的意见

5、RedisTemplate访问分片集群

RedisTemplate底层同样基于lettuce实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:

1. 引入 redis starter 依赖
2. 配置分片集群地址
3. 配置读写分离

与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1070293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习|深度学习|重磅推出---全网最全Numpy简明教程(一)

本教程面向初学者的Numpy简明教程,学好Numpy才能在深度学习、机器学习、AI等领域进军,如果感觉此文不错,欢迎和博主交流探讨 文章目录 1、Numpy介绍2、创建ndarray数组2.1、np.array2.2、np.ones2.3、np.zeros2.4、np.full2.5、np.eye2.6、np…

ChatGPT私有数据结合有什么效果?它难吗?

ChatGPT的出现可谓是惊艳了全世界,ChatGPT的问答能力通过了图灵测试,使其回答问题的方式与人类几乎无法区分。大家不甘于只在官方的对话页面问答,想利用 GPT 模型的自然语言能力结合私有数据开拓更多的应用场景。 | ChatGPT私有数据结合特点 …

ARM:使用汇编完成三个灯流水亮灭

1.汇编源代码 .text .global _start _start: 设置GPIOF寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0]ORR R1,R1,#(0x1<<5)STR R1,[R0]设置GPIOE寄存器的时钟使能LDR R0,0X50000A28LDR R1,[R0] 从r0为起始地址的4字节数据取出放在R1ORR R1,R1,#(0x1<<4) 第4位设…

day24-JS进阶(构造函数,new实例化,原型对象,对象原型,原型继承,原型链)

目录 构造函数 深入对象 创建对象三种方式 构造函数 new实例化执行过程(important!) 实例成员&静态成员 实例对象&实例成员 静态成员 内置构造函数 基本包装类型 Object Object.keys(obj)返回所有键组成的字符串数组 Object.values(obj)返回所有值组成的字…

C# 替换字符串最后一个逗号为分号

使用场景&#xff0c;sql语句的insert into table(c1,c2,c3) values (v1,v2,v3),(v1,v2,v3),(v1,v2,v3), 为了提高执行效率&#xff0c;在一个insert into中执行时&#xff0c;在循环中拼接语句&#xff0c;最后一个逗号需要替换为分号才能执行。 public static string Replace…

采集软件在市场营销中的应用价值

随着互联网的发展&#xff0c;市场竞争愈发激烈&#xff0c;如何获取准确、全面的市场信息成为企业成功的关键。数据利器作为一款强大的市场营销助手软件&#xff0c;具备多项功能&#xff0c;帮助您实现精准营销&#xff0c;发现商机。 软件功能&#xff1a; 搜索引擎采集&…

docker:修改容器的共享内存大小

错误提示&#xff1a; RuntimeError: DataLoader worker (pid 83709) is killed by signal: Bus error. It is possible that dataloader’s workers are out of shared memory. Please try to raise your shared memory limit. 解决办法&#xff1a; 1&#xff1a;创建新容器…

docker虚拟网桥和业务网段冲突处理

ifconfig查看docker虚拟网桥ip地址 docker inspect --format{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} $(docker ps -aq)查询所有容器的ip 修改docker-compose networks networks xxx-network: driver: bridge ipam: c…

web应用常见的其他漏洞总结

1.暴力破解用户名和密码 admin:admin, test:test, weblogic:weblogic, root:passwd 2. 扫敏感目录及备份文件 以ation 为扩展名的文件&#xff0c;通过7kb和k8&#xff0c;破壳扫描&#xff0c;扫描出来一个Web.rar文件&#xff0c;可获取MSSQL SSA连接用户名密码,通过测试…

2.6 宽带接入技术

思维导图&#xff1a; 前言&#xff1a; 我的理解&#xff1a; 1. **早期互联网接入技术的局限性**&#xff1a; - 作者首先回顾了早期用户通过电话线和调制解调器连接到互联网服务提供商&#xff08;ISP&#xff09;的方式&#xff0c;指出这种方式的速度上限是56 kbit/…

顺序表的简单介绍

目录 前提须知&#xff1a; 数据结构&#xff1a; 什么是数据结构&#xff1f; 数据结构特点&#xff1a; 为什么需要数据结构&#xff1a; 顺序表&#xff1a; 线性表&#xff1a; 与数组区别&#xff1a; 静态顺序表与动态顺序表&#xff1a; 二者之间的区别&#x…

应用安全系列之四十:登录常见问题以及预防方法

对于所有系统而言,登录是一个必备的而且最重要的功能。随着系统越来越复杂,服务越来越多,为了方便用户使用系统的服务,SSO应运而生,SSO虽然方便了用户使用系统,也增加了风险。因为一旦登录出现问题,就很容易通过登录访问整个系统。可见,对于登录如果没有控制好,攻击者…

HALCON的基础运用案例:- 例1- 3D点云的分割

前言&#xff1a; 在这个例子里面展示了用HALCON的操作函数segment_object_model_3d&#xff0c;来把一个输入的2.5D的3D图像进行分割。这里因为图像是一组圆柱体&#xff0c;有运用了一个物体的判别操作函数&#xff1a;dev_display_fitting_results。然后&#xff0c;自动给…

Python 代码调试

from pdb import set_trace as stx 是一个Python代码中常用的调试技巧之一&#xff0c;它用于在代码中插入断点以进行调试。这行代码的作用是将Python标准库中的 pdb&#xff08;Python Debugger&#xff09;模块中的 set_trace 函数导入&#xff0c;并将其重命名为 stx&#x…

ArcMap:第二届全国大学生GIS技能大赛(广西师范学院)详解-上午题

目录 01 题目 1.1 第一小题 1.2 第二小题 1.3 第三小题 1.4 数据展示 02 思路和实操 2.1 第一问思路 2.2 第一问操作过程 2.2.1 地理配准 2.2.2 镶嵌 2.2.2.1 第一种镶嵌方法 2.2.2.2 第二种镶嵌方法 2.2.3 裁剪 2.2.4 DEM信息提取 2.2.5 分类 2.3 第二问思路 …

DependsOn注解失效问题排查

文章目录 前言一、现象描述1.1.背景描述1.2.第一次修改&#xff0c;使用DependsOn注解1.3.第二次修改&#xff0c;设置方法入参 二、看看源码2.1.Spring实例化的源码2.2.调试2.3.验证 总结 前言 最近几天遇到一个比较有意思的问题&#xff0c;发现Spring的DependsOn注解失效&a…

强化学习框环境 - robogym - 学习 - 4

强化学习环境 - robogym - 学习 - 4 文章目录 强化学习环境 - robogym - 学习 - 4项目地址为什么选择 robogym如何消去目标位置的阴影&#xff1f;如何让物体颜色变得正确&#xff1f; 项目地址 https://github.com/openai/robogym 为什么选择 robogym 自己的项目需要做一些机…

小白自学笔记—网络安全(黑客笔记)

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

29 WEB漏洞-CSRF及SSRF漏洞案例讲解

目录 CSRF漏洞解释&#xff0c;原理等CSRF漏洞检测&#xff0c;案例&#xff0c;防御等防御方案2、设置随机Token3、检验referer来源 SSRF漏洞会比csrf漏洞重要一些SSRF_PHP&#xff0c;JAVA漏洞代码协议运用演示案例:SSRF_漏洞代码结合某漏洞利用测试 如何查找ssrf漏洞 SSRF漏…

测量温度的优选模块:新型设备M-THERMO3 16

| 具有16个自由选择通道的新型温度测量设备M-THERMO3 16 IPETRONIK推出的温度测量设备——M-THERMO3 16作为新一代设备的首个模块&#xff0c;它为模块化测量技术确立了标准。该模块具有16个通道&#xff0c;各通道不仅分辨率高达24位ADC&#xff0c;而且能够自由选择热电偶类…