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理解

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

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

相关文章

沙皮狗为什么禁养?

各位铲屎官们,今天咱们来聊聊一个比较敏感的话题:沙皮狗为什么会被禁养?很多人对沙皮狗情有独钟,但有些地方却明确禁止饲养这种犬种,这背后到底是什么原因呢?别急,今天就来给大家好好揭秘&#…

物联网 STM32【源代码形式-ESP8266透传】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

一、MQTT介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通讯协议,构建于TCP/IP协议之上。它最初由IBM在1999年发布,主要用于在硬件性能受限和网络状况不佳的情…

w186格障碍诊断系统spring boot设计与实现

🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…

题解 洛谷 Luogu P1955 [NOI2015] 程序自动分析 并查集 离散化 哈希表 C++

题目 传送门 P1955 [NOI2015] 程序自动分析 - 洛谷 | 计算机科学教育新生态https://www.luogu.com.cn/problem/P1955 思路 主要用到的知识是并查集 (如何实现并查集,这里不赘述了) 若 xi xj,则合并它们所在的集合。若 xi ! xj,则 i 和 …

无用知识之:std::initializer_list的秘密

先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…

97,【5】buuctf web [极客大挑战 2020]Greatphp

进入靶场 审代码 <?php // 关闭所有 PHP 错误报告&#xff0c;防止错误信息泄露可能的安全隐患 error_reporting(0);// 定义一个名为 SYCLOVER 的类 class SYCLOVER {// 定义类的公共属性 $sycpublic $syc;// 定义类的公共属性 $loverpublic $lover;// 定义魔术方法 __wa…

蓝桥杯单片机第七届省赛

前言 这套题不难&#xff0c;相对于第六套题这一套比较简单了&#xff0c;但是还是有些小细节要抓 题目 OK&#xff0c;以上就是全部的题目了&#xff0c;这套题目相对来说逻辑比较简单&#xff0c;四个按键&#xff0c;S4控制pwm占空比&#xff0c;S5控制计时时间&#xff0…

【C语言】自定义类型讲解

文章目录 一、前言二、结构体2.1 概念2.2 定义2.2.1 通常情况下的定义2.2.2 匿名结构体 2.3 结构体的自引用和嵌套2.4 结构体变量的定义与初始化2.5 结构体的内存对齐2.6 结构体传参2.7 结构体实现位段 三、枚举3.1 概念3.2 定义3.3 枚举的优点3.3.1 提高代码的可读性3.3.2 防止…

我问了DeepSeek和ChatGPT关于vue中包含几种watch的问题,它们是这么回答的……

前言&#xff1a;听说最近DeepSeek很火&#xff0c;带着好奇来问了关于Vue的一个问题&#xff0c;看能从什么角度思考&#xff0c;如果回答的不对&#xff0c;能不能尝试纠正&#xff0c;并帮我整理出一篇不错的文章。 第一次回答的原文如下&#xff1a; 在 Vue 中&#xff0c;…

纯后训练做出benchmark超过DeepseekV3的模型?

论文地址 https://arxiv.org/pdf/2411.15124 模型是AI2的&#xff0c;他们家也是玩开源的 先看benchmark&#xff0c;几乎是纯用llama3 405B后训练去硬刚出一个gpt4o等级的LLamA405 我们先看之前的机遇Lllama3.1 405B进行全量微调的模型 Hermes 3&#xff0c;看着还没缘模型…

UbuntuWindows双系统安装

做系统盘&#xff1a; Ubuntu20.04双系统安装详解&#xff08;内容详细&#xff0c;一文通关&#xff01;&#xff09;_ubuntu 20.04-CSDN博客 ubuntu系统调整大小&#xff1a; 调整指南&#xff1a; 虚拟机中的Ubuntu扩容及重新分区方法_ubuntu重新分配磁盘空间-CSDN博客 …

在 Zemax 中使用布尔对象创建光学光圈

在 Zemax 中&#xff0c;布尔对象用于通过组合或减去较简单的几何形状来创建复杂形状。布尔运算涉及使用集合运算&#xff08;如并集、交集和减集&#xff09;来组合或修改对象的几何形状。这允许用户在其设计中为光学元件或机械部件创建更复杂和定制的形状。 本视频中&#xf…

AI作画提示词:Prompts工程技巧与最佳实践

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网智能项目之——智能家居项目…

LLMs之DeepSeek:Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略

LLMs之DeepSeek&#xff1a;Math-To-Manim的简介(包括DeepSeek R1-Zero的详解)、安装和使用方法、案例应用之详细攻略 目录 Math-To-Manim的简介 1、特点 2、一个空间推理测试—考察不同大型语言模型如何解释和可视化空间关系 3、DeepSeek R1-Zero的简介&#xff1a;处理更…

二叉树——429,515,116

今天继续做关于二叉树层序遍历的相关题目&#xff0c;一共有三道题&#xff0c;思路都借鉴于最基础的二叉树的层序遍历。 LeetCode429.N叉树的层序遍历 这道题不再是二叉树了&#xff0c;变成了N叉树&#xff0c;也就是该树每一个节点的子节点数量不确定&#xff0c;可能为2&a…

详解单片机学的是什么?(电子硬件)

大家好&#xff0c;我是山羊君Goat。 单片机&#xff0c;对于每一个硬件行业的从业者或者在校电子类专业的学生&#xff0c;相信对于这个名词都不陌生&#xff0c;但是掌没掌握就另说了。 那单片机到底学的是什么呢&#xff1f; 其实单片机在生活中就非常常见&#xff0c;目前…

数据密码解锁之DeepSeek 和其他 AI 大模型对比的神秘面纱

本篇将揭露DeepSeek 和其他 AI 大模型差异所在。 目录 ​编辑 一本篇背景&#xff1a; 二性能对比&#xff1a; 2.1训练效率&#xff1a; 2.2推理速度&#xff1a; 三语言理解与生成能力对比&#xff1a; 3.1语言理解&#xff1a; 3.2语言生成&#xff1a; 四本篇小结…

数据结构:优先级队列—堆

一、优先级队列 1、优先级队列概念 优先级队列&#xff0c;听名字我们就知道他是一种队列&#xff0c;队列在前面我们已经学习过了&#xff0c;它是一种先进先出的数据结构&#xff0c;但是在特殊的情况下&#xff0c;我们我们队列中元素是带有一定优先级的&#xff0c;它需要…

2025年2月2日(网络编程 tcp)

tcp 循环服务 import socketdef main():# 创建 socket# 绑定tcp_server socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server.bind(("", 8080))# socket 转变为被动tcp_server.listen(128)while True:# 产生专门为链接进来的客户端服务的 socketprint(&qu…

像接口契约文档 这种工件,在需求 分析 设计 工作流里面 属于哪一个工作流

οゞ浪漫心情ゞο(20***328) 2016/2/18 10:26:47 请教一下&#xff0c;像接口契约文档 这种工件&#xff0c;在需求 分析 设计 工作流里面 属于哪一个工作流&#xff1f; 潘加宇(35***47) 17:17:28 你这相当于问用例图、序列图属于哪个工作流&#xff0c;看内容。 如果你的&quo…