Redis-Cluster集群架构

news2024/11/28 1:36:54

Redis-Cluster

1.哨兵模式和redis-cluster模式的区别

哨兵模式的问题:1.只有一个master节点可以提供写的操作,qps 最多10w,对于高并发特别高的大型互联网系统

​ 2.单节点不会内存太大,内存很大会给主节点造成压力,所以一般不建议超过10G,但是显然对于一些,商城等大型的 互联网系统10G显然不够用

​ 3.瞬短,主从选举切换需要10-50s时间,对于访问量特别高的系统也是不能忍受的

2.redis 集群架构

数据分片存放,每一个小的分区都是一个主从(可以选举),数据不重复(由hash解决),master挂掉之后可以从slave中选举出一个主节点

相对于哨兵解决了哨兵了问题么:

1.对于瞬断问题,没有完全解决:当master1出现问题的时候,需要从master1节点存取的key回出现问题,但是如果经过hash后是master1以外的机器,就不会受到影响

2.针对单节点的存储问题,Cluster中的节点是可以横向扩容了,理论最大值是1w个,但是出于不同节点间相互访问的性能出发,推荐是1k个左右,

3.多个小集群的架构也直接扩充了qbs的值

Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、1、2、3……16382、16383。这个槽是一个虚拟的槽,并不是真正存在的。

正常工作的时候,Redis Cluster中的每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,这是可以由用户指定的,也可以在初始化的时候自动生成(redis-trib.rb脚本)。

集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。

4. 数据分配

Redis Cluster中对于不同的小集群存储什么样子的数据是通过一个虚拟的数据插槽来绑定的,有0-16383 共16384个值,集群中的每个节点负责处理一部分插槽。

eg:
节点 A 负责处理 0 - 5460 号插槽。
节点 B 负责处理 5461 - 10922 号插槽。
节点 C 负责处理 10923 - 16383 号插槽。

槽位只会分配给主节点

Redis-Cluster info 查看redis集群的信息

一个小集群的主节点从节点不会放到同一台机器上

集群构建和启动不是一套命令,之后启动只需要分别启动节点就行

选举使用的是goosip协议(最终一致),来感染所有节点,所以当前节点通知到最远的节点是需要一定的时间的,所以要控制集群的数量

cluster-node-timeout的值不能设置的太少不然遇到网络抖动,瞬断,就会立马选举出一个新的主节点,导致会有两个主节点,脑裂产生

Redis集群选举原理分析
当save发现自己的master变为FAL状态时,便尝试进行Falog,以期成为新的maste,由于挂增的masther可能会有多个saye,从而存在多个save竞争成为masler节点的过程
其过程如下:

5.redis集群选举原理分析

1.slave发现自己的master变为FAIL
2 将自己记录的集群currentEpoch(选举周期)加1,并广播FAILOVER AUTH REQUEST (只有master响应)信息
3其他节点收到该信息,只有masier响应,判听请求者的合法性,并发送FAILOVER_AUTH ACK,对每一个epoch只发送一次ack
4.尝试failover的slave收集master返回的FAILOVER AUTH ACK

5.slave收到超过半数mesle的ack后变成新Masler(这里解释了集联为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能进举成功的)

6.slave广播Ping消息通知其他集群节点。

从节点共不最在生节点一进入 FAL 状态就马上尝试发起讲举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave或许尚未意识到FAL状态,可能会拒绝投票
延迟计算公式:

A、B、C 三个主节点,每个节点下有2个从节点形成集群,当A节点出现问题(Ac1、Ac2为主节点A的两个从节点)

情况1: Ac1 (currentEpoch1)向 B、C 发送广播并且得到ack,这样得到了大于一半以上的节点的选选票(3/2=1.5)Ac1会取代A成为主节点,之后会通过goosip的ping同步信息

情况2: Ac1 、Ac2(currentEpoch1)向 B、C 发送广播,分别得到了1条ack,重新发起一轮选举,Ac1 (currentEpoch2)向 B、C 发送广播并且得到ack,这样得到了大于一半以上的节点的选选票(3/2=1.5)Ac1会取代A成为主节点,之后会通过goosip的ping同步信息

从节点共不最在生节点一进入 FAL 状态就马上尝试发起讲举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,slave或许尚未意识到FAL状态,可能会拒绝投票

DELAY = 500ms + random(0 - 500ms)+SLAVE RANK*1000ms
SLAVE_RANK表示此skave己经从master复制据的总量的rank。Rank越小代表已复制的改据越新,这种方式下,持有量新数据的slave将会首先发起选举(理论上)。

为了避免票数不能过半频繁发生的情况,redis设置了延迟时间,目的是让从节点不同时发出消息,并且+SLAVE RANK*1000ms 可以保证当前同步数据最多的节点,成为新的master,也就意味着拥有最新、最多数据的节点更可能成为新的节点,redis的主从不是同步复制的,客户端向master发送成功,但是master没有来得及向从节点同步就挂掉,就会丢失数据,理论上选举出来的应该是数据最全的,

脑裂问题

由于网络问题导致原来的主节点被集群隔离出来了,此时内部选举出了新的主节点,一部分客户端向原来的主节点发送消息,一部分向现在的主节点发送消息,当网好了原来的主节点加入集群后,回变为集群的叶子几点,数据回同步,则脑裂这段时间的原来主节点的数据就会丢失

解决脑裂问题、和主从切换数据丢失问题(对于redis意义不大损失AP)

min-slaves-to-write 配置 1 则写入后至少需要向1个从节点写入数据才会返回ture 半数+1

但是会牺牲集群的可用性

集群是否完整才能对外提供服务

cluster-require-full-coverage: 默认值 yes , 即需要集群完整性,方可对外提供服务,

一个小集群挂了,其他的小集群依旧可以对外提供服务

批量操作

redis会保证命令的原子性,批量存储如果不能命中一个slot,redis会直接报错,如果想进行批量操作,就要保证hash结果的命中的槽位是一个就要用到hashtag

HashTag机制可以影响key被分配到的slot,从而可以使用那些被限制在slot中操作。

HashTag即是用{}包裹key的一个子串,如{user:}1, {user:}2。

在设置了HashTag的情况下,集群会根据HashTag决定key分配到的slot, 两个key拥有相同的HashTag:{user:}, 它们会被分配到同一个slot,允许我们使用MGET命令。

通常情况下,HashTag不支持嵌套,即将第一个{和第一个}中间的内容作为HashTag。若花括号中不包含任何内容则会对整个key进行散列,如{}user:。

HashTag可能会使过多的key分配到同一个slot中,造成数据倾斜影响系统的吞吐量,务必谨慎使用。

集群扩容

add-node + 当前要新加的节点 + 当前的集群中人一个存活的节点

新加的节点的信息会通过高goosip的meet命令同步集群的信息

还需要切换到原来集群的一个主节点做槽位移动,才可以写入信息

回询问你需要迁移多少个槽位给新的节点,给出计划,执行,会将槽位和槽位对应的数据都会迁移过来

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

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

相关文章

如何用数据资产管理,解锁数据新价值

数字经济和数字化转型的发展有什么共通点吗?这个问题的答案也很明显,数据就是数字经济数字化转型的基础,也是推动两者快速发展的核心要素。数字化时代,数据已经成为了个人、机构、企业乃至国家的重要战略资产,所以如何…

CnOpenData数字经济专利及引用被引用数据

一、数据简介 自人类社会进入信息时代以来,数字技术的快速发展和广泛应用衍生出数字经济。与农耕时代的农业经济、工业时代的工业经济大有不同,数字经济是一种新的经济、新的动能、新的业态,并引发了社会和经济的整体性深刻变革。现阶段&…

Nginx网络服务——页面优化与安全

Nginx网络服务——优化与防盗链 一、Nginx的网页优化1.Nginx的网页压缩2.Nginx的图片缓存3.Nginx的连接超时设置4.Nginx的并发设置 二、Nginx的页面安全1.查看Nginx版本的方式2.隐藏版本号 三、Nginx的日志分割1.编写日志分割脚本2. 执行脚本进行测试3. 将日志脚本添加至计划性…

InnoDB - 行格式

文章目录 InnoDB - 行格式1. 什么是行格式2. 四种行格式3. Compact行格式 InnoDB - 行格式 1. 什么是行格式 我们平时是以行记录为单位向表中插入数据的,这些数据在磁盘上的存放方式被称为行格式或者记录格式。 InnoDB引擎中支持四种行格式:Compact、…

Java8 Stream详解及中间操作方法使用示例(一)

Java 8 引入了 Stream API,提供了一种新的处理集合和数组的方式。Stream API 可以让我们更加便捷、灵活地处理数据,尤其是大规模数据。在这里,我将详细介绍 Java 8 中的 Stream API。 什么是 Stream Stream 是 Java 8 中引入的一个新的概念&…

vs2022配置pcl1.13.1

下载 下载PCL预编译安装程序PCL-1.13.1-AllInOne-msvc2022-win64.exe 和要安装的PCL组件(例如pcl-1.13.1-pdb-msvc2022-win64.zip) 安装 双击 PCL-1.13.1-AllInOne-msvc2022-win64.exe进行安装。到图1的步骤时,选择第二项。 图1 下一步&am…

串口助手(布局,图标,串口号,隐藏界面,显示实时时间)

文章目录 前言一、串口助手布局二、设置软件的标题,图标三、显示可用串口号四、隐藏,显示面板五、显示实时时间总结 前言 从这篇文章开始 教大家自己制作一个串口助手软件,并实现基本的功能。学做一个 串口助手可以一边回顾复习 QT 的相关知…

《面试1v1》G1垃圾回收器

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 《面试1v1》 连载中… 面试官: G1垃圾收集器?听说很牛逼的样子! 候选人: 是的,G1是JDK9默认的垃圾收集器,代替了CMS收集器。它的目标是达到…

4.运算符|Java学习笔记

文章目录 运算符介绍算术运算符关系运算符(比较运算符)逻辑运算符赋值运算符三元运算符位运算符 运算符优先级Java命名规范关键字保留字 进制十进制转(二/八/十六进制)原码、反码、补码 运算符介绍 运算符是一种特殊的符号&#…

【Linux】认识Linux下的编译器gcc/g++ | 认识动静态库

本文思维导图: 文章目录 前言tips: 关于前两篇文章所提到的sudo指令 一、gcc/g编译器的认识和使用tips 1.预处理2. 编译3.汇编4.链接关于预编译,编译,汇编阶段的指令记忆方法 二、gcc/g指令汇总三、认识动静态库1.库的认知库的命名规则静态库…

C++ ---- 继承

目录 继承概念及定义 继承概念 继承定义 语法 继承关系和访问限定符 继承基类成员访问方式的变化 规律总结 以公有继承为例测试 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 构造函数 析构函数 拷贝构造 赋值重载 继承与友元 继承与静态成员…

ESP8266调用NTP服务器进行时间校准

一、背景知识 【1】什么是NTP服务器? NTP是网络时间协议(Network Time Protocol,简称NTP),是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备…

Linux下信号量使用总结

目录 1.Linux下信号量简介 2.POSIX信号量 2.1 无名信号量 2.2 有名信号量 3.System V信号量 1.Linux下信号量简介 信号量是解决进程之间的同步与互斥的IPC机制,互斥与同步关系存在的症结在于临界资源。 临界资源是在同一个时刻只容许有限个(一般只有…

ble系统知识介绍(较为完整,持续更新中)

BLE学习 现在网上关于BLE系统的学习资料实在是太少了,因此本文希望能够聚集一些资料能够系统的入门BLE,本文翻译自Bluetooth_LE_Primer_Paper,还有一些网上的一些资料,如果侵害到了某些作者的权益请及时联系我 参考资料和链接 Bluetooth_LE_Primer_Paper_3MtXws-zP…

GitOps 实践之渐进式发布

本文作者:陈钧桐 腾讯云 CODING DevOps 高级解决方案架构师,从事多年技术布道工作,对于云原生时代下企业数字化转型、IT 与 DevOps 建设、价值流体系搭建等有丰富的经验,曾为多家大型企业提供咨询、解决方案以及内训服务。既关注工…

【Python小技巧】加密又提速,把.py文件编译为.pyd文件(类似dll函数库),你值得拥有!

文章目录 前言一、常见的Python文件格式有哪些?二、准备编译环境1. 安装cython2. 安装Microsoft C 生成工具 三、编译.py文件为.pyd文件1. 编辑原始.py文件2. 准备setup.py文件3. 进行编译 四、测试总结 前言 Python的脚本文件是开源的,若直接发布&#…

i.MX RT1010跨界MCU上手体验(上)

由于项目需要性价比高一些的高性能MCU,了解到NXP的RT1010主频高达500MHZ的MCU,半个月以前已经拿到官方Demo板了,今天抽空上电体验下,在此记录。这颗芯片的优势是主频高,功能全,价格合理,但是需要…

第六章 方法区

文章目录 前言一、🛺 栈、堆、方法区的交互关系二、🚎 方法区的理解1、方法区在哪里2、方法区的演变过程 三、🚗 设置方法区的大小与 OOM1、设置方法区内存的大小2、使用CGLib 让方法区OOM3、如何解决 OOM4、方法区的内部结构5、non-final 的…

利用提示工程优化软件架构:ChatGPT的应用

ChatGPT时代的软件架构全生命周期 简介 在如今日新月异的技术环境中,软件架构师必须不断地寻找和采纳新的工具和方法,以优化开发过程,提高效率,并保证最终产出的质量。其中,人工智能(AI)已经成…

《淘宝技术这十年》读书笔记

一. 分布式时代 在系统发展的过程中,架构师的眼光至关重要,作为程序员,只要把功能实现即可,但作为架构师,要考虑系统的扩展性、重用性,对于这种敏锐的感觉,有人说是一种“代码洁癖”。淘宝早期…