Redis集群理解以及Tendis的优化

主从模式

主从同步

  • 同步过程:
    • 全量同步(第一次连接):RDB文件加缓冲区,主节点fork子进程,保存RDB,发送RDB到从节点磁盘,从节点清空数据,从节点加载RDB到内存
    • 增量同步(断连后连接,且缓冲区没有满,满的话触发全量):发送缓冲区数据

主从复制

  • 同步过后就是主从之间的复制
  • redis的主从复制是异步(即主节点写完立刻返回客户端,主节点再将命令发给它的从)的,主从之间彼此都有心跳检测保证异步传输的数据可靠,主ping从以判断存活,从上报偏移量以保证数据丢失时再从主节点的复制缓冲区中拉取丢失数据。
    • 主从复制的延迟问题:repl-disable-tcp-nodelay配置可以设置马上同步或者等待缓冲区满再同步
    • 故障问题:主节点挂了需要手动处理

从节点的强一致性读

基于以上,从节点和主节点会有一定的延迟,但是有些业务需要保证二者数据是强一致的,有两个办法可以做到从节点的强一致性读

通过全局序列号实现“强一致性读”
  1. 主节点为每个写操作生成一个递增的全局序列号(Sequence Number)。
  2. 主节点会同步这个序列号给所有从节点。
  3. 从节点在处理读请求时,先向主节点请求最新序列号,然后等待 自身数据同步至该序列号后,再返回数据。
    实现方式
  • 主节点使用 Redis INCR 作为序列号:
INCR sequence_number
  • 主节点在 每次写入时,更新这个序列号:
INCR sequence_number
SET my_key value
  • 从节点执行读操作时,向主节点查询当前最新的 sequence_number:
GET sequence_number

等待自身数据同步至该序列号,然后再返回数据。这里可能需要对redis内部进行定制开发

WAIT 命令确保写入传播

Redis 提供了 WAIT 命令,可以用于 确保主节点的写操作至少同步到指定数量的从节点,从而 提升数据一致性:

WAIT 1 500
  • 1 表示至少等 1 个从节点接收到最新写入的数据。
  • 500 表示最多等待 500ms。

哨兵模式

故障恢复过程:
1. Raft选举主sentinel(选举后则一直存在,除非下线):如果被PING的数据库或者节点超时未回复,哨兵认为其主观下线。如果下线的是master,哨兵会向其它哨兵发送命令询问它们是否也认为该master主观下线,如果达到一定数目(即配置文件中的quorum)投票,哨兵会认为该master已经客观下线
2. 主sentinel来选择优先级最高的slave升为master

哨兵的主要问题还是由于中心架构,仅存在一个master节点引起的,因为主从,只能主节点进行写。

脑裂:比如一个主节点和其他所有的sentiel极其从节点隔离,主节点继续接受请求,而另一片区域会出现新的主节点。。
1. 问题1:当网络解决后,原主节点会变成slave,但是在同步之前会清空自己的数据,导致数据丢失,
2. 问题2:两个分区的数据不一致
脑裂的解决:设置最少slave存活数和主从复制的超时时间,如果存活数量太少或者超时,主节点禁止写操作,比如可以设置过半存活就可以避免脑裂,但是不能完美解决,大概是原主成为的slave的时候会丢失数据

分片集群

特点

  • Cluster模式集群节点最小配置6个节点(3主3从,因为需要半数以上),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。
  • 槽位分散
  • 扩容和删除的槽位手动分配
  • pinpong的请求包括所有节点的健康状态(是否下线),槽位分配的状态
  • 节点下线的时候广播,主从切换,这里是raft,但是总的来看集群中没有中心节点,非raft算法

集群操作详细说明

  1. Redis集群的槽位迁移:实际上每个key依次用MIGRATE命令转移数据,是同步的,但是一般key的空间不大,主线程依然可以接受其他请求(但与迁移槽相关的请求可能需要额外处理逻辑,引发额外的重定向或转发),所以不会影响正常的运行

  2. Redis集群中出现节点下线:当A在指定时间内未收到B的pong,会将B认为疑似下线,当超过半数的持有 Slot(槽)的主节点都将某个主节点 X 报告为疑似下线,那么,主节点 X 将被标记为下线(Fail),并广播出去,所有收到这条 Fail 消息的节点都会立即将主节点 X 标记为 Fail,接下来就需要主节点X的从节点来选举成为新的主节点,若没有从节点,集群的部分数据会出现不可用的状态

  3. Redis集群中节点扩容和删除:删除时,需要释放槽位到其他节点再下线,扩容时,先开启节点,再手动进行槽位的分配,并通过槽位迁移实现扩容

Tendis的改进

https://cloud.tencent.com/developer/article/1831202

Tendis架构:存储层使用RocksDB(gossip最终一致性),缓存层redis分片集群,通过RDB和AOF实现两个层的同步,中间用多个Queue保证同一个slot的操作落在同一个Queue中,保持时序一致,即同步层,并且使用rcoksDB,天然支持aof这种增量写的日志处理

和mysql的优点:
1. 缓存一致性无需保证,Tendis是同步层用aof持续持久化到存储层,并定期检查aof的指针位置
2. 部分内存数据可以落盘,避免内存占用,传统的redis为了RDB的子进程fork,需要预留一半的内存用于copyonright
3. 冷热数据的处理,有智能淘汰(只淘汰内存)和加载策略(避免一次scan加载所有数据,而是一段时间内访问多的)

解决的Redis本身的问题:
1. 主从同步,传统的当缓冲区的指针越界时,会发送全量RDB,引入Version机制,Master 将大于等于 Version 的数据生成增量 RDB。并且version可以保证AOF的幂等性,避免网络抖动,拉取到同样的aof(特指的是同步层,redis的主从根据指针来的,应该不会有幂等的问题)
2. 扩容缩容不再用传统的migrating 和importing ,基于Key,一次穿一个或者多个key,多次IO,且大key会阻塞主线程。故Tendis使用RDB+Aof的机制扩缩容,类似于主从同步,但是是源节点生成指定 slot 数据的一致性快照全量数据(RDB)

相关文章

https://blog.csdn.net/qq_34556414/article/details/106105820 主从同步总结

https://zhuanlan.zhihu.com/p/151740247 复制,主从同步机制详细

https://blog.csdn.net/weixin_45433817/article/details/137209295 脑裂问题

https://cloud.tencent.com/developer/article/1831202 Tendis理解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

77-《欧耧斗菜》

欧耧斗菜 欧耧斗菜(学名:Aquilegia vulgaris L. )是毛茛科耧斗菜属植物,株高30-60厘米。基生叶有长柄,基生叶及茎下部叶为二回三出复叶,小叶2-3裂,裂片边缘具圆齿。最上部茎生叶近无柄。聚伞花序…

为AI聊天工具添加一个知识系统 之83 详细设计之24 度量空间之1 因果关系和过程:认知金字塔

本文要点 度量空间 在本项目(为AI聊天工具添加一个知识系统 )中 是出于对“用”的考量 来考虑的。这包括: 相对-位置 力用(“相”)。正如 法力,相关-速度 体用 (“体”)。例如 重…

Unity 2D实战小游戏开发跳跳鸟 - 跳跳鸟碰撞障碍物逻辑

在有了之前创建的可移动障碍物之后,就可以开始进行跳跳鸟碰撞到障碍物后死亡的逻辑,死亡后会产生一个对应的效果。 跳跳鸟碰撞逻辑 创建Obstacle Tag 首先跳跳鸟在碰撞到障碍物时,我们需要判定碰撞到的是障碍物,可以给障碍物的Prefab预制体添加一个Tag为Obstacle,添加步…

记录 | Docker的windows版安装

目录 前言一、1.1 打开“启用或关闭Windows功能”1.2 安装“WSL”方式1:命令行下载方式2:离线包下载 二、Docker Desktop更新时间 前言 参考文章:Windows Subsystem for Linux——解决WSL更新速度慢的方案 参考视频:一个视频解决D…

[SAP ABAP] 在ABAP Debugger调试器中设置断点

在命令框输入/H,点击回车以后,调试被激活,点击触发任意事件进入ABAP Debugger调试器界面 点击按钮,可以在Debugger调试器中新增临时断点 我们可以从ABAP命令、方法、功能、表单、异常、消息、源代码等多个维度在Debugger调试器中设…

深度学习之“线性代数”

线性代数在深度学习中是解决多维数学对象计算问题的核心工具。这些数学对象包括标量、向量、矩阵和张量,借助它们可以高效地对数据进行操作和建模。以下将详细介绍这些数学对象及其在深度学习中的典型用途。 数学对象概述 标量 标量是最简单的数学对象&#xff0…

【面经】字节南京一面部分题目记录

南京字节一面题,可能因为项目不太匹配,全程八股比较多,也有两道手撕代码题,强度还是有的。为了方便大家学习,大部分答案由GPT整理,有些题给出了我认为回答比较好的博客链接。 文章目录 一、python2 和 pyth…

17.3.4 颜色矩阵

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 17.3.4.1 矩阵基本概念 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,类似于数组。 由…

LabVIEW在电机自动化生产线中的实时数据采集与生产过程监控

在电机自动化生产线中,实时数据采集与生产过程监控是确保生产效率和产品质量的重要环节。LabVIEW作为一种强大的图形化编程平台,可以有效实现数据采集、实时监控和自动化控制。详细探讨如何利用LabVIEW实现这一目标,包括硬件选择、软件架构设…

mybatis(78/134)

前天学了很多&#xff0c;关于java的反射机制&#xff0c;其实跳过了new对象&#xff0c;然后底层生成了字节码&#xff0c;创建了对应的编码。手搓了一遍源码&#xff0c;还是比较复杂的。 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE …

【NLP251】Transformer精讲 残差链接与层归一化

精讲部分&#xff0c;主要是对Transformer的深度理解方便日后从底层逻辑进行创新&#xff0c;对于仅应用需求的小伙伴可以跳过这一部分&#xff0c;不影响正常学习。 1. 残差模块 何凯明在2015年提出的残差网络&#xff08;ResNet&#xff09;&#xff0c;Transformer在2016年…

全程Kali linux---CTFshow misc入门(25-37)

第二十五题&#xff1a; 提示&#xff1a;flag在图片下面。 直接检查CRC&#xff0c;检测到错误&#xff0c;就直接暴力破解。 暴力破解CRC的python代码。 import binascii import struct def brute_force_ihdr_crc(filename): # 读取文件二进制数据 with open(filen…

OpenAI深夜反击:o3-mini免费上线,能否撼动DeepSeek的地位?

还在为寻找合适的 AI 模型而烦恼吗&#xff1f;chatTools 平台为您精选 o1、GPT4o、Claude、Gemini 等顶尖 AI 模型&#xff0c;满足您不同的 AI 应用需求。立即体验强大的 AI 能力&#xff01; 深夜反击&#xff0c;OpenAI祭出o3-mini 在DeepSeek异军突起&#xff0c;搅动AI行…

蓝桥杯备考:模拟算法之字符串展开

P1098 [NOIP 2007 提高组] 字符串的展开 - 洛谷 | 计算机科学教育新生态 #include <iostream> #include <cctype> #include <algorithm> using namespace std; int p1,p2,p3; string s,ret; void add(char left,char right) {string tmp;for(char ch left1;…

NLP深度学习 DAY5:Sequence-to-sequence 模型详解

Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译&#xff0c;但后来广泛应用于其他任务&#xff0c;如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…

于动态规划的启幕之章,借 C++ 笔触绘就算法新篇

注意&#xff1a;代码由易到难 P1216 [IOI 1994] 数字三角形 Number Triangles 题目链接&#xff1a;[IOI 1994] 数字三角形 Number Triangles - 洛谷 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每…

Three.js 后期处理(Post-Processing)详解

目录 前言 一、什么是后期处理&#xff1f; 二、Three.js 后期处理的工作流程 2.1 创建 EffectComposer 2.2 添加渲染通道&#xff08;Render Pass&#xff09; 2.3 应用最终渲染 三、后期处理实现示例 3.1 基础代码 四、常见的后期处理效果 4.1 辉光效果&#xf…

低代码系统-产品架构案例介绍、炎黄盈动-易鲸云(十二)

易鲸云作为炎黄盈动新推出的产品&#xff0c;在定位上为低零代码产品。 开发层 表单引擎 表单设计器&#xff0c;包括设计和渲染 流程引擎 流程设计&#xff0c;包括设计和渲染&#xff0c;需要说明的是&#xff1a;采用国际标准BPMN2.0&#xff0c;可以全球通用 视图引擎 视图…

从 HTTP/1.1 到 HTTP/3:如何影响网页加载速度与性能

一、前言 在最近使用Apipost时&#xff0c;突然注意到了http/1.1和http/2&#xff0c;如下图&#xff1a; 在我根深蒂固的记忆中&#xff0c;对于http的理解还停留在TCP协议、三次握手。由于我的好奇心&#xff0c;于是触发了我被动“开卷”&#xff0c;所以有了这篇文章&…

项目练习:重写若依后端报错cannot be cast to com.xxx.model.LoginUser

文章目录 一、情景说明二、解决办法 一、情景说明 在重写若依后端服务的过程中 使用了Redis存放LoginUser对象数据 那么&#xff0c;有存就有取 在取值的时候&#xff0c;报错 二、解决办法 方法1、在TokenService中修改如下 getLoginUser 方法中&#xff1a;LoginUser u…