先学习:Redis架构简介-CSDN博客

Redis压测

Redis一般应用于高并发的场景,所以一定要对Redis的性能做压测。

Redis提供了压测脚本redis-benchmark,可以对Redis进行快速的基准测试。

# 20个线程,100W个请求,测试redis的set指令(写数据)
redis-benchmark -a 123qweasd -t set -n 1000000 -c 20...Summary:throughput summary: 116536.53 requests per second ##平均每秒11w次写latency summary (msec):avg min p50 p95 p99 max0.111 0.032 0.111 0.167 0.215 3.199

Redis数据持久化

Redis持久化相关的配置,可以分为几个策略:

  • 无持久化:不保证数据安全,只将Redis当做缓存用
  • RDB(RedisDatabase):按照一定的时间间隔缓存Redis所有的数据快照
  • AOF(Append Only File):记录Redis收到的每一次写操作,在之前的基础上进行追加新的操作
  • RDB+AOF:

RDB特点

  • RDB文件紧凑,适合定期备份,非常适合灾难恢复
  • 主线程启动一个子线程进行RDB备份
  • 数据备份时,需要将内存的数据克隆一份,如果数据量比较大,容易造成Redis短暂的服务停用。
  • 不能进行实时备份,丢失数据风险

AOF特点

  • Redis默认1s进行一次AOF写入,数据更安全
  • AOF出现数据记录不完整的情况,可以使用redis-check-aof工具恢复
  • AOF文件通常比RDB文件更大
  • 写操作频繁的情况下,AOF的备份性能比RDB更慢

[root@192-168-65-214 appendonlydir]# redis-check-aof --fix appendonly.aof.1.incr.aof

混合持久策略(RDB+ AOF):

redis.conf配置文件中做配置

# Redis can create append-only base files in either RDB or AOF formats. Using

# the RDB format is always faster and more efficient, and disabling it is only

# supported for backward compatibility purposes.

aof-use-rdb-preamble yes

RDB

文件名默认dump.rdb。

何时触发RDB备份:

  • 达到配置文件的配置要求
  • 手动执行save或者bgsave指令时,会触发RDB快照。 其中save方法会在备份期间阻塞主线程。bgsve则不会阻塞主线程,会占用更多的cpu和内存。

  • 主从复制(看Redis版本)

配置文件备份策略:

# Save the DB to disk.

# save <seconds> <changes> [<seconds> <changes> ...]

# save ""

# Unless specified otherwise, by default Redis will save the DB:

# * After 3600 seconds (an hour) if at least 1 change was performed

# * After 300 seconds (5 minutes) if at least 100 changes were performed

# * After 60 seconds if at least 10000 changes were performed

# You can set these explicitly by uncommenting the following line.

# save 3600 1 300 100 60 10000  -- 备份策略

  • rdbcompression 是否启用RDB压缩,默认yes。 如果不想消耗CPU进行压缩,可以设置为no
  • stop-writes-oin-bgsave-error 默认yes, 在快照写入失败时,也能确保redis继续接受新的写入请求。如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制这种不一致。
  • rdbchecksum 默认yes。在存储快照后,还可以让redis使用CRC64算法来进行数据校样做会增加大约10%的性能消耗。如果希望获得最大的性能提升,可以关闭此功能。

rdb日志恢复指令:redis-check-rdb,  因为rdb文件是二进制文件,所以不太容易篡改。

AOF

文件

# The base name of the append only file.

# Append-only file names are created by Redis following a specific pattern.

# The file name's prefix is based on the 'appendfilename' configuration

# parameter, followed by additional information about the sequence and type.

# For example, if appendfilename is set to appendonly.aof, the following file

# names could be derived:

# - appendonly.aof.1.base.rdb    as a base file. -- rdb文件是二进制数据文件

# - appendonly.aof.1.incr.aof,  appendonly.aof.2.incr.aof    as incremental files. -- incr.aof是增量的操作日志

# - appendonly.aof.manifest as a manifest file. -- manifest文件信息元数据

appendfilename "appendonly.aof"

现在的AOF已经具备了RDB+AOF的功能。并且,拆分增量文件的方式,也能够进一步控制aof文件的大小。 虽然AOF具备了RDB的功能,但是因为AOF数据通常在不断变化,还是建议定期做RDB的备份。

appendonly.aof.1.incr.aof增量文件。里面其实就是按照Redis的协议记录了每一次操作。

127.0.0.1:6379> keys *

(empty array)

127.0.0.1:6379> set k1 v1

OK

127.0.0.1:6379> set k2 v2

OK

这组指令的文件示例:

配置

  • appendonly 是否开启aof。 默认是不开启的。
  • appendSync同步方式, 默认1s同步一次
  • appenddirname AOF文件目录
  • auto-aof-rewrite-percentage, auto-aof-rewrite-min-size 文件触发重写策略。 
  • no-appendfsync-on-rewrite  aof重写期间是否同步

AOF日志恢复

修复的过程实际上就是将aof文件(appendonly.aof.1.incr.aof日志文件)的最后那一条不完整的指令删除掉。

主从复制Replica机制

配置方式

配从不配主原则

REPLICAOF host port|NO ONE : 一般配置到redis.conf中。

SLAVEOF host port|NO ONE: 在运行期间修改slave节点的信息。如果该服务已经是某个主库的从库了,那么就会停止和原master的同步关系。

-- 查看主从状态
127.0.0.1:6379> info replication

默认情况下,从库是只读的,不允许写入数据。因为数据只能从master往数据,就会造成数据不一致。但是从库没有禁止CONFIG、DEBUG等管理指令,这些指令如果和主节点不一致,还是容易造成数据不一致。

replica-read-only yes  -- redis.conf中的配置

rename-command CONFIG "" 。 -- redis.conf中增加这个配置,屏蔽掉slave上的CONFIG指令。

复制时机

主从复制。当Master数据有变化时,自动将新的数据异步同步到其他slave中。

主从复制过程

哨兵机制Sentinel机制

配置方式

sentinel.conf

如何发现Master宕机

  • S_DOWN(主观下线):通过心跳检测,一个Sentinel节点认为 Redis Master节点宕机了。
  • O_DOWN(客观下线): 当一个Sentinel认为Redis Master宕机了,Redis的Sentinel就会互相进行沟通,当超过quorum(Sentinel集群的半数)个Sentinel节点都认为master已经出现S_DOWN后,就会将master标记为O_DOWN。

切换新Master过程

<1> master变成O_DOWN后,Sentinel集群Leader的节点负责协调整个故障切换过程。

<2>Sentinel会在剩余健康的Slave节点中选举出一个节点作为新的Master。选举采用采用的Raft算法, 选举的规则如下:

  • 首先检查是否有提前配置的优先节点:各个服务节点的redis.conf中的replica-priority配置最低的从节点。这个配置的默认值是100。
  • 如果配置都一样,检查复制偏移量offset最大的从节点。也就是找同步数据最快的slave节点。因为他的数据相对更全。
  • 如果offset还是一样,最后按照slave的RunID字典顺序最小的节点。

<3>切换新的主节点。 Sentinel Leader给新的mater节点执行 slave of no one操作,将他提升为master节点。 然后给其他slave发送slave of 指令。让其他slave成为新Master的slave。

<4>如果旧的master恢复了,Sentinel Leader会让旧的master降级为slave,并从新的master上同步数据,恢复工作。

集群Cluster机制

配置方式

cluster-enabled yes   -- 开启集群模式

cluster-config-file nodes-6379.conf  -- 指定一个给集群进行修改的配置问文件

将多个独立的Redis服务整合成一个统一的集群:

--cluster create表示创建集群。 
--cluster-replicas 表示为每个master创建一个slave节点。
接下来,Redis会自动分配主从关系,形成Redis集群。[root@192-168-65-214 cluster]# redis-cli -a 123qweasd --cluster create --cluster-replicas 1 192.168.65.214:6381 192.168.65.214:6382 192.168.65.214:6383
192.168.65.214:6384 192.168.65.214:6385 192.168.65.214:6386

Redis在分配主从关系时,会优先将主节点和从节点分配在不同的机器上。

集群模式下的问题

1. 批量指令原子性问题

127.0.0.1:6381> mset k1 v1 k2 v2 k3 v3

(error) CROSSSLOT Keys in request don't hash to the same slot

不同的key对应到不同的槽位,分不到了不同的服务器,就出现分布式事务问题。

解决方案:

127.0.0.1:6381> CLUSTER KEYSLOT k1

(integer) 12706

127.0.0.1:6381> CLUSTER KEYSLOT roy{k1}

(integer) 12706

127.0.0.1:6381> CLUSTER KEYSLOT roy:k1

(integer) 12349

-- 使用相同的hash tag,能保证这些数据都是保存在同一个节点上的。

-- 如果key中有{},  只根据{}中的内容计算槽位。

127.0.0.1:6381> mset user_{1}_name roy user_{1}_id 1 user_{1}_password 123

-> Redirected to slot [9842] located at 192.168.65.214:6382

OK

2. 数据倾斜

大量的数据被存储到集群中的某个热点Redis节点上

解决方案:

  1. 调整key的结构,尤其是那些访问频繁的热点key,让数据能够尽量平均的分配到各个slot上。
  2. 调整slot的分布,将那些数据量多,访问频繁的热点slot进行重新调配,让他们尽量平均的分配到不同的Redis节点上。

集群通信协议

Redis集群之间通过gossip协议进行频繁的通信,用于传递消息和更新节点状态。gossip协议包含多种消息,包括ping,pong,meet,fail等等。

gossip集群是去中心化的,各个节点彼此之间通过gossip协议互相通信,保证集群内部各个节点最终能够达成统一。

Redis集群中,每个节点都有一个专门用于节点之间进行gossip通信的端口,就是自己提供服务的端口+10000.因此,在部署Redis集群时,要注意防火墙配置,不要把这个端口屏蔽。

集群选举Master

        当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master。由于挂掉的master 可能会有多个slave,从而存在多个slave竞争成为master节点的过程, 其过程如下:

1》slave发现自己的master变为FAIL

2》将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST信息(currentEpoch代表选举周期)

3》其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个 epoch只发送一次ack(master应该根据特定的决定响应结果

4》尝试Failover的slave收集master返回的FAILOVER_AUTH_ACK

5》slave收到超过半数master的ack后变成新Master

6》slave广播Pong消息通知其他集群节点

    

注意:slave节点并不是在master节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟,确保mater FAIL状态在集群中传播,slave如果立即尝试选举,其它masters或许尚未意识到FAIL状态,可能会拒绝投票.

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化Trae Apollo参数解释的批量获取

自动化Trae Apollo参数解释的批量获取一、背景介绍二、设计思路三、操作步骤1. 环境准备2. 获取界面坐标3. 定位关键元素4. 执行自动化查询5. 获取结果四、完整代码五、扩展应用一、背景介绍 在自动驾驶开发中&#xff0c;百度Apollo平台提供了大量参数用于调整系统行为。Trae…

数学模型:十大距离

十大距离 文章目录十大距离定义1. 欧氏距离&#xff08;Euclidean Distance&#xff09;2. 曼哈顿距离&#xff08;Manhattan Distance&#xff09;3. 切比雪夫距离&#xff08;Chebyshev Distance&#xff09;4. 闵可夫斯基距离&#xff08;Minkowski Distance&#xff09;5. …

流水线(Jenkins)打包拉取依赖的时候提示无法拉取,需要登录私仓的解决办法

在日常工作中&#xff0c;遇到了Jenkins拉取部门内部组件库失败的情况&#xff0c;原因是组件库后面放到了阿里云私仓&#xff0c;并且是没有公开的&#xff0c;所以就会有如下提示的&#xff0c;一开始我实在.npmrc文件写死阿里云提供的接入token&#xff0c;后面发现可能是因…

操作系统王道考研习题

1.1.4本节习题精选 一、单项选择题 01&#xff0e;操作系统是对(&#xff09;进行管理的软件。 A.软件 B.硬件 C.计算机资源 D.应用程序 01.c 操作系统管理计算机的硬件和软件资源&#xff0c;这些资源统称为计算机资源。注意&#xff0c;操作系统不仅管理处理机、存储器等硬件…

C语言extern的用法(非常详细,通俗易懂)

以往我们都是将所有的代码写到一个源文件里面&#xff0c;对于小程序&#xff0c;代码不过几百行&#xff0c;这或许无可厚非&#xff0c;但当程序膨胀代码到几千行甚至上万行后&#xff0c;就应该考虑将代码分散到多个文件中&#xff0c;否则代码的阅读和维护将成为一件痛苦的…

Git【开源分布式版本控制工具】安装-配置-常用指令-Git远程仓库-IDEA使用Git

参考博客&#xff1a;Git&#xff08;分布式版本控制工具&#xff09;_为什么哔哩哔哩有些视频没有字幕-CSDN博客 Git就是一个类似于百度云盘的仓库&#xff1b;重点是要掌握使用idea操作Git&#xff0c;企业用的最多&#xff0c;一般不会去使用命令 Git通过不断阶段保存文件…

JavaScript数组键值去重方法

使用 filter 和 Map 根据键值去重我来详细解释方法2&#xff0c;这是一种高效且简洁的数组去重方法&#xff0c;特别适合根据对象中的某个键值进行去重操作。完整代码function uniqueByKey(arr, key) {return [...new Map(arr.map(item > [item[key], item])).values()]; }分…

【机器学习笔记Ⅰ】9 特征缩放

特征缩放&#xff08;Feature Scaling&#xff09;详解 特征缩放是机器学习数据预处理的关键步骤&#xff0c;旨在将不同特征的数值范围统一到相近的尺度&#xff0c;从而加速模型训练、提升性能并避免某些特征主导模型。1. 为什么需要特征缩放&#xff1f; (1) 问题背景 量纲不…

10.9 大模型训练数据优化实战:3步让准确率从68%飙升至79%

大模型训练过程分析与数据优化 一、训练过程关键指标分析 (插入mermaid流程图:训练过程监控与优化闭环) #mermaid-svg-Gni031LkHA93fQYM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Gni031LkHA93fQYM .erro…

深度学习模型在C++平台的部署

一、概述深度学习模型能够在各种生产场景中发挥重要的作用&#xff0c;而深度学习模型往往在Python环境下完成训练&#xff0c;因而训练好的模型如何在生产环境下实现稳定可靠的部署&#xff0c;便是一个重要内容。C开发平台广泛存在于各种复杂的生产环境&#xff0c;随着业务效…

若以部署在linux,nginx反向代理,登录404,刷新404问题

history模式在router下面的index.js文件的最下面history: createWebHistory(import.meta.env.VITE_APP_CONTEXT_PATH),这两个配置文件都加上然后nginx里面的配置是这个位置按照实际情况&#xff0c;我的是用docker挂载的&#xff0c;所以在/usr/share/nginx/html/lw-clothing为…

SQL Server通过存储过程实现HTML页面生成

引言在现代企业应用中&#xff0c;数据可视化是提升决策效率的关键。SQL Server作为核心数据库管理系统&#xff0c;不仅处理数据存储和查询&#xff0c;还具备强大的扩展能力。通过存储过程直接生成HTML页面&#xff0c;企业能减少对中间层&#xff08;如Web服务器或应用程序&…

qt绘制饼状图并实现点击即放大点击部分

做得比较low #ifndef TEST_POWER_H #define TEST_POWER_H#include <QWidget> #include <QtMath> #include <QPainter> #include <QPushButton> #include <QVector> #include <cmath>namespace Ui { class test_power; } struct PieData {Q…

HashMap的put、get方法详解(附源码)

put方法 HashMap 只提供了 put 用于添加元素&#xff0c;putVal 方法只是给 put 方法调用的一个方法&#xff0c;并没有提供给用户使用。 对 putVal 方法添加元素的分析如下&#xff1a;如果定位到的数组位置没有元素 就直接插入。如果定位到的数组位置有元素就和要插入的 key …

双立柱式带锯床cad【1张总图】+设计说明书+绛重

双立柱式带锯床 摘 要 随着机械制造技术的进步&#xff0c;制造业对于切割设备的精度、效率和稳定性要求越来越高。双立柱式带锯床作为一种重要的切割设备&#xff0c;必须能够满足工业生产对于高精度、高效率的需求。 双立柱式带锯床是一种重要的工业切割设备&#xff0c;其结…

在线JS解密加密配合ECC保护

在线JS解密加密配合ECC保护 1. ECC加密简介 定义 ECC&#xff08;Elliptic Curve Cryptography&#xff09;是一种基于椭圆曲线数学的公钥加密技术&#xff0c;利用椭圆曲线离散对数问题&#xff08;ECDLP&#xff09;实现高安全性。 背景 1985年&#xff1a;Koblitz&#xff0…

使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建

前言回顾 在上一篇文章《搭建持久化的 INFINI Console 与 Easysearch 容器环境》中&#xff0c;我们详细介绍了如何使用基础的 docker run 命令&#xff0c;手动启动和配置 INFINI Console (1.29.6) 和 INFINI Easysearch (1.13.0) 容器&#xff0c;并实现了关键数据的持久化&…

Word 怎么让段落对齐,行与行之间宽一点?

我们来分两步解决&#xff1a;段落对齐 和 调整行距。 这两个功能都集中在Word顶部的【开始】选项卡里的【段落】区域。 第一步&#xff1a;让段落对齐 “对齐”指的是段落的左右边缘如何排列。通常有四种方式。 操作方法&#xff1a;将鼠标光标点在你想修改的那个段落里的任意…

Attention机制完全解析:从原理到ChatGPT实战

一、Attention的本质与计算步骤 1.1 核心思想 动态聚焦&#xff1a;Attention是一种信息分配机制&#xff0c;让模型在处理输入时动态关注最重要的部分。类比&#xff1a;像人类阅读时用荧光笔标记关键句子。 1.2 计算三步曲&#xff08;以"吃苹果"为例&#xff09; …

2025年3月青少年电子学会等级考试 中小学生python编程等级考试三级真题答案解析(判断题)

博主推荐 所有考级比赛学习相关资料合集【推荐收藏】1、Python比赛 信息素养大赛Python编程挑战赛 蓝桥杯python选拔赛真题详解