J4、哨兵集群、redis切片还是加实例

news2024/9/22 13:27:45

哨兵集群

单节点的哨兵还是可能会发生故障,需要部署集群。

部署哨兵时,只需要下面的命令,那哨兵是如果互相发现的?
sentinel monitor <master-name> <ip> <redis-port> <quorum>

基于 pub/sub 机制的哨兵集群组成

  • 哨兵和主库建立连接,可以在主库发布信息,也可以在主库订阅信息,这样可以互相知道信息
  • redis只有订阅了同一频道的信息才能进行信息交换。
  • 哨兵就是通过__sentinel__:hello 频道进行消息交换的。
  • 哨兵通过对频道发布订阅消息就与主库建立了连接
    在这里插入图片描述
  • 哨兵与从库建立连接是 哨兵向主库发送INFO命令来完成的,哨兵向主库发送命令,主库就会把从库列表发给哨兵,这样哨兵就可以与从库建立连接。
    在这里插入图片描述

通过pub/sub,实现哨兵和客户端信息同步

客户端通过哨兵了解到切换的过程。 客户端从哨兵订阅消息。
在这里插入图片描述

  • 客户端获取哨兵的配置文件后,可以获得哨兵的地址和端口,和哨兵建立连接,通过执行命令,获取不同事件。
  • SUBSCRIBE +odown 订阅所有实例客观下线事件。
  • PSUBSCRIBE * 订阅所有事件
  • 当哨兵选完主库之后,客户端会看见 switch-master事件: switch-master <master name> <oldip> <oldport> <newip> <newport>

选择什么哨兵执行主从切换

哨兵集群判断主库下线的过程

  • 任何一个实例只要自身判断主库“主观下线”后,就会给其他实例发送 is-master-down-byaddr 命令。接着,其他实例会根据自己和主库的连接情况,做出 Y 或 N 的响应,Y 相当于赞成票,N 相当于反对票。
    在这里插入图片描述
  • 哨兵获得了仲裁需要的赞成票数后(配置的 quorum设定),可以标记主库 “客观下线”
  • 这个哨兵向其他哨兵发送命令,表明想要自己来执行主从切换,(Leader选举)
  • 想要成为哨兵需要满足2个条件(第一,拿到半数以上的赞成票;第二,拿到的票数同时还需要大于等于哨兵配置文件中的 quorum 值。)
    在这里插入图片描述
  • 如果没有成功选举,会在哨兵故障转移超时时间的 2 倍,重新进行选举。
  • 哨兵如果没有给自己投票,就会把票投给第一个给它发送投票请求的哨兵。后续再有投
    票请求来,哨兵就拒接投票了。

需要注意的是,如果哨兵集群只有 2 个实例,此时,一个哨兵要想成为 Leader,必须获得 2票,而不是 1 票。所以,如果有个哨兵挂掉了,那么,此时的集群是无法进行主从库切换的。因此,通常我们至少会配置 3 个哨兵实例。

要保证所有哨兵实例的配置是一致的,尤其是主观下线的判断值 down-after-milliseconds。不然哨兵集群一直没有对有故障的主库形成共识,也就没有及时切换主库,最终的结果就是集群服务不稳定。

  • 假设有一个 Redis 集群,是“一主四从”,同时配置了包含 5 个哨兵实例的集群,quorum
    值设为 2。在运行过程中,如果有 3 个哨兵实例都发生故障了,此时,Redis 主库如果有故
    障,还能正确地判断主库“客观下线”吗?如果可以的话,还能进行主从库自动切换吗?
  1. 大于等于quorum的值 2, 所以可以判断 主观下线。
  2. 不能完成主从切换,哨兵需要达到(5/2+1)的票,但是2个哨兵,没有达到要求
  • 此外,哨兵实例是不是越多越好呢,如果同时调大 down-after-milliseconds 值,对减少误判
    是不是也有好处呢?
  1. 不是越多越好,哨兵越多,通讯越多,选举时间可能边长,切换主从时间变久
  2. 适当调大down-after-milliseconds值,可以减低误判,但是也可能对业务的影响会增加,各有利弊

redis切片

增加单机的物理内存,简单,但是内存大,主线程fork直接阻塞了。
redis切片,复杂,可以保存大量数据,对主线程阻塞小

  • Redis Cluster 方案采用哈希槽(Hash Slot,接下来我会直接称之为 Slot),来处理数据和实例之间的映射关系。一个切片集群有16384个哈希槽,键值对根据key,映射哈希槽

  • 映射过程:根据key的CRC16算法 计算16bit值, 16bit值对16384取模,一个模数代表一个哈希槽。

  • 在部署Redis Cluster时,使用cluter create创建集群,redis会自动把槽分布到实例上。

  • 也可以使用 cluster meet 命令手动建立实例间的连接,形成集群,再使用cluster addslots 命令,指定每个实例上的哈希槽个数。

  • 在手动分配哈希槽时,需要把 16384 个槽都分配完,否则Redis 集群无法正常工作。在这里插入图片描述

  • 集群刚建立的时候,实例只知道自己分配了哪些哈希槽,不知道其他实例的哈希槽信息。

  • redis实例会把自己的哈希槽信息发送给其他实例,完成哈希信息的扩散,当实例直接相互链接,每个实例就有哈希槽的映射信息了

  • 客户端收到哈希槽的信息后,会缓存到本地,客户端请求键值对时,会计算哈希槽,给对应实例发送请求

  • 但是集群中,实例可能会增删,实例间可以互相传递信息,客户端无法感知变化。redis cluster 提供了重定向机制(客户端给实例发送读写操作时,没有对应的数据会给新实例发送操作)

GET hello:key
(error)MOVED 13320 172.16.19.5:6379
(如果这个实例上并没有这个键值对映射的哈希槽,那么,这个实例就会给客户端返回下面的 MOVED 命令响应结果,这个结果中就包含了新实例的访问地址。)

在这里插入图片描述

  • 还可能出现一种情况,由于Slot2数据多,像slot2请求的时候,还有部分数据没有迁移完成,客户端会受到ASK报错

GET hello:key
(error)ASK 13320 172.16.19.5:6379

  • ASK 命令表示两层含义:第一,表明 Slot 数据还在迁移中;第二,ASK 命令把客户端所请求数据的最新实例地址返回给客户端,此时,客户端需要给实例 3 发送 ASKING 命令,然后再发送操作命令。
  • 和 MOVED 命令不同,ASK 命令并不会更新客户端缓存的哈希槽分配信息。

Redis Cluster不采用把key直接映射到实例的方式,而采用哈希槽的方式原因:

  1. key数量无法预估,key映射会很大。
  2. redis cluster 客户端与服务端直连,如果key不在这个节点上,节点需要纠正错误节点,需要交换路由表,如果保存对应关系,交换的信息会很大。
  3. 当集群扩容,缩容时,需要修改对应的映射关系。
  4. 通过哈希槽,key通过hash计算,只需要关系槽,通过让槽找到对应节点,让映射变的小

1.Redis 什么时候做 rehash?

装载因子 = entry数 / 哈希桶个数
出发rehash的条件

  1. 装载因子>=1 ,同时 哈希表被允许进行rehash(在RDB和AOF时,禁止rehash)
  2. 装载因子>= 5,立马进行rehash

如果装载因子<1 , 或者>1但是<5(同时实例在生成RDB和AOF)不会进行rehash

2. 采用渐进式 hash 时,如果实例暂时没有收到新请求,是不是就不做 rehash 了?

redis会进行定时任务,rehash被触发后,没有新请求,也会定时rehash,每次执行不会超过1ms

在这里插入图片描述

bgsave 子进程复制主线程的页表以后,假如主线程需要修改虚页 7 里的数据,那么,主线程就需要新分配一个物理页(假设是物理页 53),然后把修改后的虚页 7 里的数据写到物理页53 上,而虚页 7 里原来的数据仍然保存在物理页 33 上。这个时候,虚页 7 到物理页 33 的映射关系,仍然保留在 bgsave 子进程中。所以,bgsave 子进程可以无误地把虚页 7 的原始数据写入 RDB 文件。

在这里插入图片描述

replication buffer 和 repl_backlog_buffer 的区别

  • replication buffer 是主从库在进行全量复制时,主库上用于和从库连接的客户端的 buffer,而 repl_backlog_buffer 是为了支持从库增量复制,主库上用于持续保存写操作的一块专用 buffer。
  • Redis 主从库在进行复制时,当主库要把全量复制期间的写操作命令发给从库时,主库会先创建一个客户端,用来连接从库,然后通过这个客户端,把写操作命令发给从库。在内存中,主库上的客户端就会对应一个 buffer,这个 buffer 就被称为 replication buffer。Redis 通过client_buffer 配置项来控制这个 buffer 的大小。主库会给每个从库建立一个客户端,所以replication buffer 不是共享的,而是每个从库都有一个对应的客户端。
  • repl_backlog_buffer 是一块专用 buffer,在 Redis 服务器启动后,开始一直接收写操作命令,这是所有从库共享的。主库和从库会各自记录自己的复制进度,所以,不同的从库在进行恢复时,会把自己的复制进度(slave_repl_offset)发给主库,主库就可以和它独立同步。
  • 在这里插入图片描述

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

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

相关文章

Premiere基础操作

一&#xff1a;设置缓存二&#xff1a;ctrI导入素材三&#xff1a;导入图像序列四&#xff1a;打开吸附。打开吸附后素材会对齐。五&#xff1a;按~键可以全屏窗口。六&#xff1a;向前选择轨道工具。在时间线上点击&#xff0c;向前选中时间线上素材。向后选择轨道工具&#x…

19_微信小程序之优雅实现侧滑菜单

19_微信小程序之优雅实现侧滑菜单一.先上效果图 要实现这样一个效果&#xff0c;布局其实很简单&#xff0c;整体布局是一个横向滚动的scroll-view&#xff0c;难点在于怎么控制侧滑菜单的回弹&#xff0c;以及寻找回弹的边界条件? 此篇文章主要是基于uni-app来实现的&#xf…

MySQL 记录锁+间隙锁可以防止删除操作而导致的幻读吗?

文章目录什么是幻读&#xff1f;实验验证加锁分析总结什么是幻读&#xff1f; 首先来看看 MySQL 文档是怎么定义幻读&#xff08;Phantom Read&#xff09;的: The so-called phantom problem occurs within a transaction when the same query produces different sets of r…

使用Fairseq进行Bart预训练

文章目录前言环境流程介绍数据部分分词部分预处理部分训练部分遇到的问题问题1可能遇到的问题问题1问题2前言 本文是使用 fairseq 做 Bart 预训练任务的踩坑记录huggingface没有提供 Bart 预训练的代码 facebookresearch/fairseq: Facebook AI Research Sequence-to-Sequence…

字符串匹配 - 文本预处理:后缀树(Suffix Tree)

上述字符串匹配算法(朴素的字符串匹配算法, KMP 算法, Boyer-Moore算法)均是通过对模式&#xff08;Pattern&#xff09;字符串进行预处理的方式来加快搜索速度。对 Pattern 进行预处理的最优复杂度为 O(m)&#xff0c;其中 m 为 Pattern 字符串的长度。那么&#xff0c;有没有…

windows环境下,vue启动项目后打开chrome浏览器

前言&#xff1a;关于vue启动后打开chrome浏览器&#xff0c;我查了很多资料&#xff0c;方案如下&#xff1a; 1、增加环境变量BROWSER为chrome&#xff08;试了没效果&#xff09; 2、设置系统的默认浏览器为chrome&#xff08;应该可以&#xff0c;但没试&#xff1b;因为…

有序表的应用:[Leetcode 327] 区间和的个数

一、题目 1、题目描述 给你一个整数数组 nums 以及两个整数 lower 和 upper 。求数组中&#xff0c;值位于范围 [lower, upper] &#xff08;包含 lower 和 upper&#xff09;之内的 区间和的个数 。 区间和 S(i, j)表示在 nums 中&#xff0c;位置从 i 到 j 的元素之和&…

基于jsplumb构建的流程设计器

项目背景 最近在准备开发工作流引擎相关模块&#xff0c;完成表结构设计后开始着手流程设计器的技术选型&#xff0c;调研了众多开源项目后决定基于jsplumb.js开源库进行自研开发&#xff0c;保证定制化的便捷性&#xff0c;相关效果图及项目地址如下 项目地址&#xff1a;ht…

进程切换-

实验课之前有一些问题 中断机制 第一个问题&#xff1a; interrupt的两个状态源头&#xff1a; 外中断多由随机中断&#xff08;异步中断&#xff09;造成&#xff0c;如鼠标点击&#xff0c;键盘输入&#xff1b; 内终端多由故障终端&#xff1a;程序运行异常&#xff0c;硬件…

使用PyQtGraph 自定义绘图

Python 的主要优势之一是探索性数据科学和可视化生态体系。一般的工具链为Pandas、numpy、sklearn 进行数据分析和使用matplotlib进行绘图。 但是如果需要自己自定义一个个性化的图形界面工具&#xff0c;则可能不是很合适。为了实现这种需求&#xff0c;可以使用PyQt构建GUI应…

【进阶篇】线程的硬件基础

文章目录高速缓存缓存一致性协议写缓冲区和无效化队列高速缓存 简介 高速缓存是主内存与处理器之间的硬件&#xff0c;其容量小于主存&#xff0c;但存取速率远高于主存。因此处理器在执行读写操作时&#xff0c;可直接和高速缓存交互&#xff0c;提高响应速度。 我们常见的变…

2049. 统计最高分的节点数目

2049. 统计最高分的节点数目题目算法设计&#xff1a;深度优先搜索题目 传送门&#xff1a;https://leetcode.cn/problems/count-nodes-with-the-highest-score/ 算法设计&#xff1a;深度优先搜索 这题的核心是计算分数。 一个节点的分数 左子树节点数 右子树节点数 除自…

【Opencv 系列】 第4章 直方图

文章目录[TOC](文章目录)前言1、直方图的定义、意义、特征2、直方图&#xff1a;2.1 灰度直方图2.2 彩色直方图前言 1、直方图的定义、意义、特征 在统计学中&#xff0c;直方图是一种对数据分布情况的图形表示&#xff0c;是一种二维统计图表&#xff0c;他的两个坐标分别是统…

docker安装配置镜像加速器-拉取创建Mysql容器示例

List item docker 常见命令大全docker安装docker拉取创建Mysql容器docker 安装 1、安装链接&#xff1a;https://blog.csdn.net/BThinker/article/details/123358697 &#xff1b; 2、安装完成需要配置docker镜像加速器 3、docker 镜像加速器推荐使用阿里云的&#xff1a; 编…

硬件学习 软件Cadence day04 PCB 封装绘制

1.文章内容&#xff1a; 1. 贴片式电容 PCB 封装绘制 &#xff08;型号 c0603 &#xff09; 2. 贴片式电阻 PCB 封装绘制 &#xff08;型号 r0603 &#xff09; 3. 安规式电容 PCB 封装绘制 &#xff08;这个就是 有一个电容&#xff0c;插入一个搞好的孔里面 …

社区宠物诊所管理系统

目录第一章概述 PAGEREF _Toc4474 \h 21.1引言 PAGEREF _Toc29664 \h 31.2开发背景 PAGEREF _Toc3873 \h 3第二章系统总体结构及开发 PAGEREF _Toc19895 \h 32.1系统的总体设计 PAGEREF _Toc6615 \h 32.2开发运行环境 PAGEREF _Toc13054 \h 3第三章数据库设计 PAGEREF _Toc2852…

Prometheus 告警机制介绍及命令解读

本文您将了解到Prometheus 告警模块Alertmanager的架构介绍、核心概念、命令解析和AMTool的基本使用。 Prometheus的告警模块并不存在于Prometheus中,而是 以独立项目Alertmanager存在。Prometheus服务器定义告警规则,这些规则将触发警报,将警报发送到Alertmanager。Alertma…

DaVinci 偏好设置:系统 - 解码选项

偏好设置 - 系统/解码选项Preferences - System/Decode Options解码选项Decode Options使用 GPU 进行 Blackmagic RAW 解码Use GPU for Blackmagic RAW decode允许使用 GPU 来加速 Blackmagic RAW&#xff08;BRAW&#xff09;媒体的解码。使用硬件加速解码 H.264/H.265Decode …

谁再用Double定义存储计算金额,我劈了他

不是三婶儿偏执&#xff0c;非要吐槽。家人们&#xff0c;咱就是说&#xff0c;按照基操逻辑谁会把严格金额计算相关的数据使用double类型呢… “我以为吕布已经够勇猛了&#xff0c;这是谁的部下&#xff1f;” 前几天&#xff0c;一同事让帮忙写段代码。内容比较常规&#xf…

Unity之ASE实现边缘光效果

一.前言 今天来实现一个简单的边缘光效果&#xff0c;可以应用与物体表面的一种荧光外溢的效果&#xff0c;特别是用在人的身体表面&#xff0c;会让人的皮肤更细腻&#xff0c;更好看。 物体上效果如下: 人体表面效果如下&#xff1a; 我们可以看到&#xff0c;这种人体表面…