当前位置: 首页 > news >正文

Redis7(四)哨兵、集群

哨兵

吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为主库,继续对外服务

哨兵的作用:

  1. 监控redis运行状态,包括master和slave
  2. 当master宕机了,能自动将slave转换为master

哨兵的功能:

  1. 主从监控:监控主从redis库运行是否正常
  2. 消息通知:哨兵可以将故障转移的结果发送给客户端
  3. 故障转移:如果master异常,则会进行主从切换,将其中一个slave作为新的master
  4. 配置中心:客户端通过连接哨兵来获得当前redis服务的主节点地址

哨兵的配置

在sentinel配置文件中,除了bind、daemonize、protected-mode、port、logfile、pidfile、dir的配置之外(以上配置同普通的redis.conf来就行),还有这些配置项要配置:

主要:

  • sentinel monitor <master-name> <ip> <redis-port> <quorum>:除了指定master的名字、IP地址、端口号,还有一个quorum标识最少有几个哨兵认可认可客观下线,同意故障迁移的法定票数。

补充:网络有时候不可靠,有时候sentinel会因为网络阻塞误以为一个master redis已经宕机了,在sentinel集群环境下需要多个sentinel互相沟通来确认某个master时候真的宕机了,quorum这个参数是进行客观下线的一个依据,意思是至少有quorum个sentinel认为这个master有故障,才会对这个master进行下线以及故障转移。增加了容错率、高可用性。

  • sentinel auth-pass <master-name> <password>:master设置了密码,指定连接master服务的密码

其他:

  • sentinel down-after-milliseconds <master-name> <milliseconds>:指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线
  • sentinel parallel-syncs <master-name> <nums>:表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据
  • sentinel failover-timeout <master-name> <milliseconds>:故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败
  • sentinel notification-script <master-name> <script-path> :配置当某一事件发生时所需要执行的脚本
  • sentinel client-reconfig-script <master-name> <script-path>:客户端重新配置主节点参数脚本

注:

启动哨兵的命令是:redis-sentinel sentinel.conf --sentinel

如果主机1挂了,从机2上位成为主机,那么原来的1重新启动后,不会重新变成主机,而是会变成2的从机。哨兵会动态修改哨兵、主机、从机的相关配置文件的内容。

所以主机也要设置masterauth,这样当这台主机挂了之后重新启动成为从机时候能连接上新的主机

哨兵运行流程

当一个主从配置中的master失效之后,sentinel可以选举出一个新的master用于自动接替原master的工作,主从配置中的其他redis服务器自动指向新的master同步数据。一般建议sentinel采取

主观下线

主观下线(SDOWN)(Subject Down)是单个sentinel自己主观检测到的关于master,从sentinel的角度来看,如果发送了ping后,在一段时间没有收到合法的回复,就达到了SDOWN的条件。

sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度啊(单位是毫秒)。默认是30秒。

客观下线

客观下线(ODOWN)(Object Down)是需要一定的sentinel,多个哨兵达成一致的意见才能认为一个master客观上已经宕机了

选举领导者哨兵

当主节点被判断客观下线后,各个节点会进行协商,先选举出一个领导者哨兵节点并由该领导者节点进行failover(故障迁移)(使用raft算法)

raft算法的了解:监视该主节点的所有哨兵都有可能被选为领导者,基本思路是先到先得:即在一轮选举中,哨兵A向B发送成为新的领导者的申请,如果B没有同意过其他哨兵,则同意A成为领导者

选出新的master

由哨兵领导者开始推动故障切换流程并选出一个新的master。

关于master选举算法

  1. 选举出新的master,先根据优先级(配置文件中的slave-priority或者replica-priority,越小,优先级越高),选优先级大的,如果优先级一样的话,看哪个slave复制的更完整就选哪个,如果完整性也一样,就根据run ID最小的选(直接根据ascii码值)。
  2. 领导者哨兵会发送给执行slaveof no one命令让选出来的从节点变成主节点,并通过slaveof命令让其他节点变成主节点。
  3. 领导者哨兵会将之前已经下线的老master设置为新选出的master的从节点,当老master重新上线后,会成为新的master的从节点。老master降级为slave并恢复正常工作。

使用建议:

  1. 哨兵节点的数量应该为多个,哨兵本身应该集群,保证高可用性
  2. 哨兵节点的数量应该是奇数,才好选举领导者哨兵
  3. 各个哨兵节点的配置应该一致
  4. 如果哨兵节点部署在Docker等容器中,尤其要注意端口的正确映射
  5. 哨兵集群加主从复制并不能保证数据零丢失

集群

由于数据量过大,单个master难以承担,因此需要对多个复制集进行集群,形成水平拓展每个复制集只负责整个数据库的一部分,这就是redis的集群,其作用是提供在多个redis节点间共享数据的程序集。

redis集群是一个提供在多个redis节点间共享数据的程序集,redis集群可以支持多个master。

集群的功能

  1. redis集群支持多个master,又支持多个slave。可以实现读写分离、支持数据的高可用、支持海量数据的读写存储操作。
  2. 由于cluster自带的sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能
  3. 客户端与redis的节点连接,不再需要连接集群中的所有节点,只需要任意连接集群中的一个可用节点即可
  4. 槽位slot负责分配到各个物理服务节点,又对应的集群来负责维护节点,插槽和数据之间的关系

槽位slot

集群的密钥空间被分为16384个槽位,有效地设置了16384个主节点的集群大小上限(但是建议的最大节点的大小约为1000个)

集群中的每个主节点处理16384个哈希槽中的一个子集。当没有集群重新配置正在进行时(即哈希槽从一个节点移动到另一个节点),集群是稳定的。当集群稳定时,单个哈希槽将又单个节点提供服务。

集群没有使用一致性hash,而是引入了哈希槽的概念。redis集群有16384个哈希槽,每个key通过CRC16校验之后对16384取模来决定放置哪个位置的槽。集群的每个节点负责一部分的hash槽。

分片

使用redis集群时我们会将存储的数据分散到多态redis机器上,这成为分片。简言之,集群中的每个redis都被认为是整个数据的一个分片。

如何找到指定的key的分片:为了找到给定key的分片,我们对key进行CRC16(key)算法处理并通过对总分片数量取模。然后,使用确定性哈希函数,这意味着给定的key将多次始终映射到同一个分片。

分片加槽位的优势:方便扩容缩容和数据分派查找,无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态

槽位映射算法

哈希取余分区

用户每次读写操作都是根据公式:hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪个节点上。

优点:简单有效,只需要预估好数据规划好节点,例如三台、八台、十台,就能保证一段时间的数据支撑。使用hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡+分而治之的作用。

缺点:原来规划好的节点,进行扩容或缩容就更麻烦了。扩容缩容时,每次数据变动导致节点有变动,映射关系需要重新进行计算,再服务器个数固定不变时没有问题,如果需要弹性扩容或者故障停机的情况下,原来的取模公式就会发生变化。此时地址经过取余运算后的结果将会发生很大变化,根据公式获取服务器也会变得不可控。某个redis机器宕机了,由于机器数量改变会导致hash区域全部数据重新洗牌。

一致性哈希算法分区

一致性哈希算法设计目标是为了解决分布式缓存数据变动和映射问题(分母数量改变了 ,取余数不行了),当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系。

步骤:

  1. 算法构建一致性哈希环:最终哈希值变为 哈希函数求得的值变为对 2的32次方 取模,并将0和2的32次方等同,将整个全量看作一个环,环内的范围就是(0,2^31-1)。
  2. redis服务器ip节点映射:将集群中的各个ip节点映射到环上的某一个位置。
  3. key落到服务器的落键规则:当我们需要存储一个kv键值对时,首先计算key的hash值,确定数据在环上的位置。从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。

优点

  1. 容错性:如果一台服务器不可用,则受影响的数据仅仅是此服务器到其环空间中的上一台服务器(即沿着逆时针方向行走遇到的第一台服务器)之前的数据,且这些数据会转移到下一台服务器上(沿着顺时针方向遇到的第一台服务器)进行存储。
  2. 拓展性:数据量增加了,需要重新增加一台节点,受到影响的只是上一台服务器,会重新把上一台服务器上应该录到新服务器的数据重新到新的服务器。

缺点

一致性hash算法在服务节点太少时,容易因为节点分布不均匀而造成数据倾斜(被缓存的对象大部分集中缓存在某一台服务器上)问题。

哈希槽分区

哈希槽实质就是一个数组,大小是[0,2^14-1]形成的hash slot空间。

它能解决均匀分配的问题,在数据和节点之间又加入了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,就相当于节点上放的是槽,槽里面放的是数据。

槽解决的是粒度问题,相当于把粒度变大了,如此便于数据移动。哈希解决的是映射问题,使用key的哈希槽来计算所在的槽,便于数据分配

一个集群只能有16384个哈希槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。

集群会记录节点和槽的对应关系,解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取模,余数是几key就落入对应的槽里。HASH_SLOT = CRC16(key) mod 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

为何最大槽数是16384

  1. 如果槽位为65536,发送的心跳信息的消息头达到了8k,发送的心跳包过于庞大。
  2. redis的集群主节点数量基本不可能超过1000个。
  3. 槽位越小,节点少的情况下,压缩比高,容易传输。

  1. redis集群不保证强一致性,这意味着在特定的条件下,redis集群可能会丢掉一些被系统收到的写入请求命令。
  2. redis集群也存在类似于哨兵的机制,主机宕机后,从机会上位成为主机,主机再次归来的时候会变为从机。如果想要节点从属调整使用命令:CLUSTER FAILOVER
  3. 使用 redis-cli -a 密码 --cluster reshard IP地址:端口号 命令扩容后重新分配槽位后,新的主机对应的槽位是原来的各个主机各自匀一点凑出来的。缩容的时候可以将空出来的槽位给指定的主机全部接收。
  4. 不在同一个slot槽位下的键值无法使用mset、mget等多键操作。可以通过{}来定义同一个组的概念,使key中{}内相同内容的键值对放到一个slot槽位去。比如mset k1{aaa} 111 k2{aaa} 222,mget k1{aaa} k2{aaa}

相关文章:

Redis7(四)哨兵、集群

哨兵 吹哨人巡查监控后台master主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为主库&#xff0c;继续对外服务 哨兵的作用&#xff1a; 监控redis运行状态&#xff0c;包括master和slave当master宕机了&#xff0c;能自动将slave转换为master 哨兵的功能…...

校园课程助手【3】-使用枚举类封装异常优雅处理全局异常

接着2中登录模块补充一个点&#xff1a; //可以看到这里返回给前端控制器的是一个类而不是html页面public RespBean doLogin(Valid LoginVo loginVo, HttpServletRequest request,HttpServletResponse response){return userService.doLogin(loginVo, request, response);}首先…...

LeetCode面试150——58最后一个单词的长度

题目难度&#xff1a;简单 默认优化目标&#xff1a;最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及代码实现 3.1 反向遍历 参考文献 1 题目描述 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字…...

MySQL——数据库的操作,数据类型,表的操作

MySQL——数据库的操作&#xff0c;数据类型&#xff0c;表的操作 1. 数据库的操作1.1 显示当前数据库1.2 创建数据库舍弃当前所写的SQL语句查看当前数据库服务全局的默认字符集 1.3 使用数据库1.4 查看当前操作的数据库查看MySQL的帮助 1.5 删除数据库 2. 常见数据类型2.1 数值…...

Go 临界资源 安全问题

临界资源安全的问题&#xff1a; 临界资源&#xff1a; 指并发环境中多个 进程/线程/协程 可以共享&#xff08;都可以调用&#xff09;的资源/变量&#xff0c;如果在并发环境中处理不当&#xff0c;就会造成一些 严重、问题 func main() {//临界资源a : 10go func() {a 100f…...

安卓常用控件(上)

文章目录 TextViewButtonEditText TextView textview主要用于在界面上显示一段文本信息。 属性名描述id给当前控件定义一个唯一的标识符。layout_width给控件指定一个宽度。match_parent&#xff1a;控件大小与父布局一样&#xff1b;wrap_content&#xff1a;控件大小刚好够包…...

基于 RabbitMQ 实现延迟消息的订单处理流程

文章目录 订单创建流程1. 商品查询与订单数据初始化2. 总价计算与订单保存3. 扣减库存与购物车清理4. 延迟消息与支付状态检测 订单延迟消息监听器支付成功与订单取消1. 订单支付成功2. 订单取消与库存恢复 总结 在现代电商系统中&#xff0c;订单处理是一个复杂且关键的环节。…...

使用Python将Word文档转换为PNG图片

在这篇博客中&#xff0c;我将介绍一个使用Python编写的小工具&#xff0c;它能够将指定文件夹中的所有Word文档&#xff08;.doc和.docx格式&#xff09;转换为PNG图片。这个工具基于wxPython库构建图形用户界面&#xff0c;并结合了win32com和PyMuPDF库实现文档格式的转换。接…...

Qt创建Json对象时浮点数的精度控制

我们在Qt中使用Json都是使用QJsonDocument、QJsonArray、QJsonObject、QJsonValue等类。 当我们在QJsonObject中插入浮点数字段时&#xff0c;会发现浮点数的小数位数很长&#xff0c;如下所示&#xff1a; #include <QJsonDocument> #include <QJsonArray> #incl…...

【海贼王航海日志:前端技术探索】CSS你了解多少?(二)

目录 1 -> 字体属性 1.1 -> 设置字体 1.2 -> 字体大小 1.3 -> 字体粗细 1.4 -> 文字样式 2 -> 文本属性 2.1 -> 文本颜色 2.1.1 -> 认识RGB 2.1.2 -> 设置文本颜色 2.2 -> 文本对齐 2.3 -> 文本装饰 2.4 -> 文本缩进 2.5 -&g…...

软件测试面试200问(全)

1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前 3 年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自己&a…...

【单片机毕业设计选题24106】-基于阿里云的心率呼吸监测系统

系统功能: 上电后OLED显示 “欢迎使用请稍后”&#xff0c;两秒后显示Connecting...表示 正在连接阿里云&#xff0c;正常连接阿里云后进入系统显示界面&#xff0c;如长时间显示Connecting...请 检查WiFi网络是否正确。 系统连接阿里云后可在阿里云界面查看到系统上报的温…...

leetcode28:找出字符串第一个匹配的下标

找出字符串第一个匹配的下标 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 public int strStr(Str…...

Java二十三种设计模式-桥接模式(10/23)

桥接模式&#xff1a;解耦抽象与实现的灵活设计 引言 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将抽象部分与其实现部分分离&#xff0c;使它们可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体(Handle and Body)模…...

Java 面试指南

Java 面试指南 目录 引言Java 基础知识 数据类型运算符控制结构面向对象编程 Java 高级特性 异常处理集合框架泛型多线程与并发 Java 标准类库 java.lang 包java.util 包java.io 包 Java Web 开发 ServletJSPSpring 框架 数据库连接与JDBC JDBC 基础数据库连接池 设计模式 单…...

计算机毕业设计选题推荐-自习室座位预约系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

android13 删除兼容性警告窗口 deprecation warning 去除弃用警告

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况 3.问题分析 4.代码更改 5.编译测试 6.彩蛋 1.前言 在 Android 13 中,为了提高用户体验和应用的兼容性,系统引入了一些新的隐私和安全特性。这些特性可能会影响旧版应用的行为,因此当用户运行可能不完全兼容 An…...

JESD204B/C协议学习笔记

JESD204B基础概念 204B包含传输层&#xff0c;链路层&#xff0c;物理层。 应用层是对 JESD204B 进行配置的接口&#xff0c;在标准协议中是不含此层&#xff0c;只是为了便于理解&#xff0c;添加的一个层。 协议层指工程中生成的IP核JESD204B&#xff0c;负责处理输入的用户…...

网络安全-渗透测试工具及插件介绍和使用方法

1、Burp Suite Burp Suite 是用于攻击web 应用程序的集成平台。 是一款广泛使用的网络安全工具套件&#xff0c;主要用于测试Web应用程序的安全性。它可以帮助安全研究人员、渗透测试人员和开发人员发现和利用Web应用程序中的安全漏洞。 &#xff08;1&#xff09;下载和安装&a…...

JAVA WEB初步实验

Spring应用开发环境准备 安装配置Spring应用开发环境 熟悉IntelliJ IDEA开发工具 打开idea工具&#xff0c;创建普通Java工程 配置普通Java工程运行环境 得到基本的Java运行环境配置正常 修改pom.xml文件&#xff0c;搭建Spring IOC运行环境 更新pom文件 新建User、TestSpr…...

2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题

2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题 &#xff08;二&#xff09;模块 A&#xff1a;安全事件响应、网络安全数据取证、应用安全、系统安全任务一&#xff1a;漏洞扫描与利用:任务二&#xff1a;Windows 操作系统渗透测试 :任务三&…...

SpringCloudAlibaba和SpringBoot版本问题

SpringCloudAlibaba和SpringBoot版本问题 直接参考官方给出的版本说明&#xff0c;具体地址&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E Spring Cloud Alibaba VersionSentinel VersionNacos VersionRocketMQ Ver…...

408第一季 - 数据结构 - 栈与队列

栈 闲聊 栈是一个线性表 栈的特点是后进先出 然后是一个公式 比如123要入栈&#xff0c;一共有5种排列组合的出栈 栈的数组实现 这里有两种情况&#xff0c;&#xff0c;一个是有下标为-1的&#xff0c;一个没有 代码不用看&#xff0c;真题不会考 栈的链式存储结构 L ->…...

【CSS-7】深入解析CSS伪类:从基础到高级应用

CSS伪类是前端开发中不可或缺的强大工具&#xff0c;它们允许我们根据文档树之外的信息或简单选择器无法表达的状态来样式化元素。本文将全面探讨CSS伪类的各种类型、使用场景和最佳实践。 1. 伪类基础概念 1.1 什么是伪类&#xff1f; 伪类&#xff08;Pseudo-class&#x…...

serv00 ssh登录保活脚本-邮件通知版

适用于自己有服务器情况&#xff0c;ssh定时登录到serv00&#xff0c;并在登录成功后发送邮件通知 msmtp 和 mutt安装 需要安装msmtp 和 mutt这两个邮件客户端并配置&#xff0c;参考如下文章前几步是讲配置这俩客户端的&#xff0c;很简单&#xff0c;不再赘述 用Shell脚本实…...

西门子 S7-1200 PLC 海外远程运维技术方案

西门子 S7-1200 PLC 海外远程运维技术方案 一、面向海外场景的核心优势 针对跨国企业、海外项目及远程技术支持需求&#xff0c;本方案基于巨控GRM552Y-CHE模块提供无缝的全球化远程PLC运维能力&#xff0c;突破地域及时差限制&#xff0c;显著提升国际项目响应效率。 二、海…...

Android第十三次面试总结基础

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Linux 的 find 命令使用指南

精通 Linux 的 find 命令:终极使用指南 在 Linux 系统中,find 命令是文件搜索的瑞士军刀,它能基于多种条件在目录树中精准定位文件。无论你是系统管理员还是开发者,掌握 find 都能极大提升工作效率。本文将深入解析 find 的核心用法,并附赠实用示例! 一、基础语法结构 …...

Qt Qml模块功能及功能解析

QtQml 是 Qt 6.0 中用于声明式 UI 开发和应用程序逻辑的核心模块&#xff0c;它提供了 QML 语言的支持和运行时环境。 一、主要功能 1. QML 语言支持 QML 语法解析&#xff1a;支持 QML (Qt Meta-Object Language 或 Qt Modeling Language) 的完整语法 JavaScript 集成&…...

【p2p、分布式,区块链笔记 MESH】 论文阅读 Thread/OpenThread Low-Power Wireless Multihop Net

paperauthorThread/OpenThread: A Compromise in Low-Power Wireless Multihop Network Architecture for the Internet of ThingsHyung-Sin Kim, Sam Kumar, and David E. Culler 目录 引言RPL 标准设计目标与架构设计选择与特性shortcomIngs of RPL设计选择的反面影响sImulta…...