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

Redis: 集群高可用之MOVED转向和ASK转向解决方案

MOVED转向


1 ) 问题描述

  • 在客户端操作Redis集群的时候 MOVED转向 或 MOVED错误是经常遇到的一类问题
  • 我们先连入集群:$ /usr/local/redis/bin/redis-cli -a 123456 -h 192.168.10.101 -p 6371
  • 之前在Redis中存储过一些数据,比如下面的情况,当输入 $ get username, 会有
    (error) MOVED 14315 192.168.10.103:6375
    
    • 它提示 usrename 这个key的槽在 14315,槽在 103:6375节点
    • 这里它已经提示你key在哪里,但就是不给你
    • 这个涉及到 Redis 的一个官方规范

2 )Redis 规范

  • 这个规范是:
    • 一个 Redis 的客户端, 它向集群中的任意节点发送命令请求
    • 请求节点会对命令请求进行分析,如果该命令是集群可以执行的命令
    • 之后,对这个key做crc16的运算,对16384取余,最后得到一个值
    • 它会对这个key所在的槽进行查找,如果槽在当前节点,则可以顺利执行
    • 否则当前节点会给你返回一个 MOVED 错误
    • 这个 MOVED 错误会告诉你槽和对应的节点在哪里

3 )解决方案


3.1 解决方案 1

  • 让你的这个客户端使用集群的方式来连接就行了
  • $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.101 -p 6371
    • 看到这里多了一个 -c
    • 它会帮助我们做 MOVED 转向
  • 这里使用的是 redis-cli, 另外,你的第三方的客户端, 比如一些可视化的客户端
  • 包括项目里的代码,也要以集群 cluster 的方式接入

3.2 解决方案 2

  • 如果你的客户端不支持集群
  • 但是在你连接你每次获取请求的时候,实际上会拿到这个槽和这个节点的信息
  • 把记录下来之后,再次有这个命令的时候,就可以寻找到正确的那个节点去执行命令
  • 最终集群处于一个稳定状态了,所有的客户端都会保存一个完整的哈希槽对应一个节点的映射记录,集群呢就非常高效了
  • 然后有命令过来,客户端就可以直接向正确的这个节点发送命令请求就无需转向等等的这些操作了
  • MOVED 转向是 Redis 官方规范要求,就是客户端必须要处理MOVED的错误
    • 要么就是以集群的方式连接, 交给那种第三方的东西帮你去做
    • 要么就是你自己去处理
  • 因为我们要实现对用户的一种透明
  • 总结下来
    • 就是保持 server 端,尽量简洁
    • 能不在server端做的事情就不在server端做
    • 降低 server端 的压力

ASK转向


1 ) 问题描述

  • 除了上面 MOVED 转向 和 Redis 的规范,还要求客户端必须也要实现对 ASK 转向的处理
  • 在进行节点与插槽管理的时候,比如添加一个主节点
    • 需要把其他节点的槽重新分配给了这个新的主节点
    • 在这个过程中,移动了很多的槽,槽在做迁移
    • 包括在删除主节点的时候,也是先把那些槽转移到可用的节点上
    • 就是先迁移过去,然后再删它
  • 就在上面这个过程中,如果你发了一个命令,你这个命令要处理的那个键
  • 恰好就属于正在被迁移的这个槽,这时候就会产生 ASK 转向
  • 原节点会在自己的数据里面去找你指定的这个键
  • 如果找到了,那就直接执行客户端发送的命令就返回了
  • 没找到,这个键有可能已经被迁移到目标的节点了, 原节点就会向客户端返回一个ASK错误
  • 指引客户端向正在导入槽的目标节点,再次发送之前要执行的命令
  • 在环境稳定的情况下,是不可能产生ask错误的
    • 因为 ASK 错误,是你的集群中有槽在迁移
    • 而且你请求的那个key 正好就是在迁移的那些槽中才会发生这个错误

2 ) 解决方案


2.1 解决方案1

  • 让你的客户端都使用集群的方式连接,它内部会帮你去做

2.2 解决方案2

  • 以正常的方式去登录,登录之后呢,它这个里边有一个 ASKING 的一个命令
  • 这个 ASKING 的命令是干嘛的呢?
    • 就是打开发送该命令客户端的一个Redis ASK 标识
    • 假设,现在有一些槽正在迁移,我请求的key就在迁移的那些槽中
    • 这个时候 Redis 会给我返回一个error,ask 告诉怎么做
    • 这时候,再敲一下 ASKING 看到这个OK之后
    • 再去获取,就能拿到了这个 key
  • 它的原理就是 ASKING 命令打开 Redis ASKING 的一个标识
  • 当你拿完以后,这个 ASKING 的标识也会被移除,它是一次性的
    • 也就是说你的这个槽在迁移的过程中,如果想要多次获取它
    • 每次获取都得通过 ASKING 获取

ASK 错误和 MOVED 错误的区别

1 ) 关于 MOVED 转向

  • MOVED 错误,它代表的这个槽的负责权已经从一个节点转到另一个节点了
  • 而且就是当节点需要让一个客户端长期的针对某个槽的命令请求发送至另一个节点
  • 节点就会向客户端返回 MOVED 转向
  • 使用了集群的方式登录客户端,这个问题就解决了

2 )关于 ASK 转向

  • ASK 转向只是两个节点在迁移过程中,就是槽迁移过程中使用的一种临时措施
  • 就是当节点需要让客户端仅仅只是在下一次命令请求转向另一个节点
  • 节点向客户户会返回 ASK 的一个转向, 要先发送一个 ASKING 的命令,才能够去请求
  • 否则的话会执行失败

3 )简单理解

  • MOVED 转向相当于告诉你这个槽在哪,你要自己去获取, 解决办法是以集群的方式连入,或者说自己去维护槽对应节点信息, 在每次命令之前自己去做处理判断,让他向正确的节点发送请求

  • ASK 转向是槽迁移的过程中产生的一种错误,它会给你返回 ASK error

  • 解决办法,也是你的客户端以集群的方式接入,它会自己帮你去处理

  • 否则的话,先发送一个 ASKING,然后再去获取,就能正常拿到

相关文章:

Redis: 集群高可用之MOVED转向和ASK转向解决方案

MOVED转向 1 ) 问题描述 在客户端操作Redis集群的时候 MOVED转向 或 MOVED错误是经常遇到的一类问题我们先连入集群:$ /usr/local/redis/bin/redis-cli -a 123456 -h 192.168.10.101 -p 6371之前在Redis中存储过一些数据,比如下面的情况,当输…...

idea插件市场安装没反应

https://plugins.jetbrains.com/idea重启后还是不行那就...

数据结构之排序(5)

摘要:本文主要讲各种排序算法,注意它们的时间复杂度 概念 将各元素按关键字递增或递减排序顺序重新排列 评价指标 稳定性: 关键字相同的元素经过排序后相对顺序是否会改变 时间复杂度、空间复杂度 分类 内部排序——数据都在内存中 外部排序——…...

R包的安装、加载以及如何查看帮助文档

0x01 如何安装R包 一、通过R 内置函数安装(常用) 1.安装CRAN的R包 install.packages()是一个用于安装 R 包的重要函数。 语法:install.packages(pkgs, repos getOption("repos"),...) 其中: pkgs:要安…...

【YOLO学习】YOLOv3详解

文章目录 1. 网络结构1.1 结构介绍1.2 改进 2. 训练与测试过程3. 总结 1. 网络结构 1.1 结构介绍 1. 与 YOLOv2 不同的是,YOLOv3 在 Darknet-19 里加入了 ResNet 残差连接,改进之后的模型叫 Darknet-53。在 ImageNet上 实验发现 Darknet-53 相对于 ResN…...

JDK1.0主要特性

JDK 1.0,也被称为Java 1,是Java编程语言的第一个正式版本,由Sun Microsystems公司在1996年发布。JDK 1.0的发布标志着Java作为一种编程语言和平台的正式诞生,它带来了许多创新的概念和特性,对后来的软件开发产生了深远…...

CSS基础-盒子模型(三)

9、CSS盒子模型 9.1 CSS常用长度单位 1、px:像素; 2、em:相对元素font-size的倍数; 3、rem:相对根字体的大小,html标签即是根; 4、%:相对于父元素进行计算。 注意:CSS样…...

深度学习中的损失函数详解

深度学习中的损失函数详解 文章目录 深度学习中的损失函数详解损失函数的基础概念常见的损失函数类型及应用场景回归问题的损失函数分类问题的损失函数自定义损失函数 如何选择合适的损失函数?损失函数在深度学习中的应用 在深度学习的世界中,损失函数&a…...

系统架构设计师-下午案例题(2022年下半年)

1.试题-(共25分):阅读以下关于软件架构设计与评估的叙述在答题纸上回答问题1和问题2。 【说明】某电子商务公司拟升级其会员与促销管理系统,向用户提供个性化服务,提高用户的粘性。在项目立项之初,公司领导层一致认为本次升级的主要目标是提…...

高级图片编辑器Photopea

什么是 Photopea ? Photopea 是一款免费的在线工具,用于编辑光栅和矢量图形,支持PSD、AI 和 Sketch文件。 功能上,Photopea 和 老苏之前介绍的 miniPaint 比较像 文章传送门:在线图片编辑器miniPaint 支持的格式 复杂…...

详解zookeeper四字命令

ZooKeeper 的四字命令(Four-Letter Words, 4LW)是一组简单的管理和监控命令,方便运维人员快速获取 ZooKeeper 集群和节点的运行状态。这些命令通常用于健康检查、性能监控、节点配置查看等操作。通过这些命令,可以轻松获取关于 Zo…...

docker 进入容器运行命令

要进入正在运行的Docker容器并在其中执行命令,你可以使用docker exec命令。以下是具体步骤和示例: 1. 查看正在运行的容器 首先,确认你的容器正在运行,可以使用以下命令查看所有运行中的容器: docker ps2. 进入容器…...

一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码

手头有 109 张头部 CT 的断层扫描图片,我打算用这些图片尝试头部的三维重建。基础工作之一,就是要把这些图片数据读出来,组织成一个三维的数据结构(实际上是四维的,因为每个像素有 RGBA 四个通道)。 这个…...

mit6824-01-MapReduce详解

文章目录 MapReduce简述编程模型执行流程执行流程排序保证Combiner函数Master数据结构 容错性Worker故障Master故障 性能提升定制分区函数局部性执行缓慢的worker(slow workers) 常见问题总结回顾参考链接 MapReduce简述 MapReduce是一个在多台机器上并行计算大规模数据的软件架…...

在Docker中运行微服务注册中心Eureka

1、Docker简介: 作为开发者,经常遇到一个头大的问题:“在我机器上能运行”。而将SpringCloud微服务运行在Docker容器中,避免了因环境差异带来的兼容性问题,能够有效的解决此类问题。 通过Docker,开发者可…...

白话进程>线程>协程

文章目录 概述进程线程协程区别与联系 举个栗子进程例子线程例子协程例子区别与联系的具体体现 代码示例进程例子线程例子协程(Goroutine)例子 概述 进程、线程和协程是计算机科学中的基本概念,它们在操作系统和并发编程中扮演着重要角色。以…...

论文阅读:Attention is All you Need

Abstract 贡献: 提出了Transformer,完全基于注意力机制,摒弃了循环和卷积网络。 结果: 本模型在质量上优于现有模型,同时具有更高的并行性,并且显著减少了训练时间。 1. Introduction long short-term …...

【Linux 】文件描述符fd、重定向、缓冲区(超详解)

目录 ​编辑 系统接口进行文件访问 open 接口介绍 文件描述符fd 重定向 缓冲区 1、缓冲区是什么? 2、为什么要有缓冲区? 3、怎么办? 我们先来复习一下,c语言对文件的操作: C默认会打开三个输入输出流&#xf…...

Unity WebGL使用nginx作反向代理处理跨域,一些跨域的错误处理(添加了反向代理的配置依旧不能跨域)

反向代理与跨域描述 什么是跨域? 跨域(Cross-Origin Resource Sharing, CORS)是指在浏览器中,当一个网页的脚本试图从一个域名(协议、域名、端口)请求另一个域名的资源时,浏览器会阻止这种请求…...

视频转文字免费的软件有哪些?6款工具一键把视频转成文字!又快又方便!

视频转文字免费的软件有哪些?在视频制作剪辑过程中,我们经常进行视频语音识别成字幕,帮助我们更好地呈现视频内容的观看和宣传,市场上有许多免费的视频转文字软件,可以快速导入视频,进行视频内音频的文字转…...

千问3.5-2B在VSCode中的集成应用:基于CodeX的智能编程助手搭建

千问3.5-2B在VSCode中的集成应用:基于CodeX的智能编程助手搭建 1. 引言 作为一名开发者,你是否经常在编码过程中遇到这些问题:记不清某个API的具体用法?需要快速生成重复性代码片段?遇到报错信息却找不到清晰的解释&…...

Super IO:Blender文件操作效率革命,实现300%工作流提速

Super IO:Blender文件操作效率革命,实现300%工作流提速 【免费下载链接】super_io blender addon for copy paste import / export 项目地址: https://gitcode.com/gh_mirrors/su/super_io 在3D设计领域,文件导入导出的繁琐操作常常成…...

DLSS状态指示器配置完全指南:实用监控工具深度解析

DLSS状态指示器配置完全指南:实用监控工具深度解析 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在追求极致游戏体验的路上,你是否曾疑惑DLSS是否真正生效?DLSS Swapper作为一款专…...

基于Pixel Epic · Wisdom Terminal的MySQL智能运维:安装配置与性能调优

基于Pixel Epic Wisdom Terminal的MySQL智能运维:安装配置与性能调优 1. 引言 MySQL作为最流行的开源关系型数据库,在各类业务系统中扮演着核心角色。但传统的数据库运维往往面临几个痛点:配置参数复杂难懂、SQL优化依赖经验、性能问题排查…...

当openclaw遇见ai:借助快马平台打造能理解内容的智能抓取命令

最近在开发一个叫openclaw的网页抓取工具时,发现单纯抓取网页内容已经不能满足需求了。很多时候我们需要对抓取的内容进行二次处理,比如自动摘要、分类、去噪等。这时候就想到了借助AI来增强工具的能力,正好发现了InsCode(快马)平台这个好帮手…...

Pixel Couplet Gen入门必看:Streamlit Components封装像素春联React组件

Pixel Couplet Gen入门必看:Streamlit Components封装像素春联React组件 1. 项目介绍 Pixel Couplet Gen是一款基于ModelScope大模型驱动的创意春联生成器。与传统春联设计不同,它采用了独特的8-bit像素游戏风格,将中国传统春节元素与复古电…...

每日算法题 21---54.螺旋矩阵

题目54.螺旋矩阵要求给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例思路核心思路是用边界圈定遍历范围,按照固定方向循环遍历,每遍历完一条边就收缩对应边界,直到边界交叉终止&…...

激发创意:利用快马平台ai模型辅助设计与优化cmhhc算法

激发创意:利用快马平台AI模型辅助设计与优化CMHHC算法 最近在做一个字符串压缩相关的项目,需要实现一个自定义的压缩算法CMHHC。这个算法的核心思想其实很简单:对于连续出现的相同字符,用该字符加上出现次数来表示。比如"aa…...

Win11Debloat:让你的Windows系统重获新生的终极优化指南

Win11Debloat:让你的Windows系统重获新生的终极优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …...

AI辅助开发:让快马AI智能生成自适应Win10镜像下载管理工具

AI辅助开发:让快马AI智能生成自适应Win10镜像下载管理工具 最近在折腾一个Windows系统镜像下载管理工具,发现传统下载方式存在不少痛点:下载源选择困难、网络波动导致中断、版本特性不透明。正好接触到InsCode(快马)平台的AI辅助开发功能&am…...