Redis: 集群高可用之节点与插槽管理
概述
- Redis Cluster 集群模式,它使用的是分片来存储数据的,数据都存在多个节点上。
- 而且使用了哈希槽这样的机制,它内部维护了 16384 个插槽
- 那就是说每一个节点其实都具体的分布了一些槽,如果我们添加一个节点的话,槽总数就就要扩增吗?
- 当然不是,槽的总数还是 16384,如果我新加一个节点,这个节点如果说想要去处理客户端的命令
- 就是它如果要能存数据的话,就得有槽,那我们其他的节点已经把槽都分完了,它的槽就得重新分片
- 比如说我添加一个节点,我要从其他的节点上把一些槽取出来,分配给这个新节点
- 如果说我要删除一个节点,这个节点如果是从节点,非常简单,如果是个主节点
- 我们是不是要把这些槽先转移到其他可用的节点上,然后再把它删掉
- 这里边也会涉及到重新分片,插槽管理
添加主节点并重新分片
1 )集群添加主节点
- 基于之前集群的环境,就是3个节点,每个节点上面分别装了两个 Redis
- 我们随意找一台机器检查随意一个Redis实例
- $
/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.10.101:6371
- 从这里输出可以看到 主从槽点范围分配等各种信息
- $
- 现在比如集群实例有6个,按照配置文件来说是从 6371 ~ 6376
- 现在我们在一个节点上拷贝一份配置并进行修改,启动一个 6377 的 Redis 实例
- $
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6377.conf
- $
- 这个时候,这里的 Redis 实例,和之前集群中的 6个是无相关的
- 我们可以登录集群看下 $
/usr/local/redis/bin/redis-cli -a 123456 -h 192.168.10.103 -p 6376 cluster nodes
- 发现只有6个,和刚才的 6377 没有任何关系
- 我们可以登录集群看下 $
- 下面是添加主节点到集群中的命令语法
- $
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
existing_host:existing_port
指集群环境中最后主节点的ip和端口,就是check
命令返回的最后一个 M- 这里的最后,也是根据槽来判定的,假如我们最后一个ip和端口是: 103和6375
- $
- $
redis-cli --cluster add-node 192.168.103:6377 192.168.103:6375 --cluster-master-id node_id f3353d11eae2dae1e46cdee9134beea872d1c6e8
- 之后会正常输出
[OK] New node added correctly.
- 之后会正常输出
- 再次进行 check 发现多了一个 M 主节点,发现新增的 6377 没有从节点,也就是 副本
- 添加完节点后,就需要重新分片:把当前集群中其他节点里取出一些槽分配给新的节点
2 )重新分片
- 只有对新加入的主节点重新分配 hash 槽,该主节点才能存储数据
- 重新分片语法:$
redis-cli --cluster reshard host:post --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
- 这里
host:post
可以是集群中之前 6371 ~ 6376 随便一个节点,这个是连接集群用的 --cluster-from node_id
分配的槽是从哪里来的,这个 node_id 随便找一个 M 主节点的 node_id, 也可以用逗号分隔写多个node_id--cluster-to node_id
把新槽给谁,这里我们会分配给 6377--cluster-slots <args>
表示,要分配多少槽,如果是槽内有数据,数据也一起过去--cluster-yes
不会回显槽的分配情况,直接进行移动
- 这里
- 参考示例
- $
/usr/local/redis/bin/redis-cli -a 123456 --cluster reshard 192.168.10.101:6372 --cluster-from afe0b3936c837a46972055c7b9b691bdd8149b7d --cluster-to 3a083c35074c45d51.3af75e137b3aa9fc3d4b0e2 --cluster-slots 2000 --cluster-yes
- $
- 这样,主节点被添加进集群,并且给新的主节点重新分了片
添加从节点并构成主从关系
- 现在要添加从节点,从节点之后把它加入到这个环境里,并且让它和刚才的 6377 构建为一主一从的关系
- 现在,这个集群里边,相当于现在就是有四组分片,每一个分片都有一个副本,四主四从的环境
- 现在在一个节点上拷贝一份配置并进行修改,启动一个 6378 的 Redis 实例
- 目前,6378 没有在集群中,我们要先把 6378 添加到集群中,添加从节点和上面添加主节点稍微不一样
1 )集群添加从节点
- 添加从节点,要表示它的角色是Slave, 它要复制谁,这是它的一个命令
- 命令语法:$
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
new_host:new_port
表示要添加从节点的ip和端口existing_host:existing_port
要给的哪一个主节点去添加--cluster-slave
表明角色:从节点--cluster-master-id node_id
填入对应主节点的 node_id
- 示例参考:
/usr/local/redis/bin/redis-cli-a 123456 --cluster add-node 192.168.10.103:6378 192.168.10.103:6377 --cluster-slave --cluster-master-id 3a083c35074c45d513af75e137b3aa9fc3d4b0e2
- 添加完成后,会有绿色文案提示
[OK] New node added correctly.
- 重新执行 $
/usr/local/redis/bin/redis-cli -a 123456 -h 192.168.10.103 -p 6376 cluster nodes
- 可看到,新的从节点已经被加入集群了
- 这样,主从关系也被确立完成了
删除节点
1 ) 删除 从节点
- 把从节点从集群环境中移除,然后把这个从节点停掉,非常简单就完成了
- 因为从节点只是主节点的一个副本,所以说对环境的影响不是很大
- 语法 $
redis-cli --cluster del-node host:port node_id
- 删除 6378 示例参考
/usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.10.103:6378 c5bd04543b5d96595bdf61135451581ea0363c71
- 检查环境验证
- $
/usr/local/redis/bin/redis-cli -a 123456 -h 192.168.10.103 -p 6376 cluster nodes
- 可见,正常移除了,当然, check 命令也可以看
- $
- 进入 6378,之后停掉它 $
SHUTDOWN
2 ) 删除主节点
- 删除主节点时,注意,主节点是处理客户端请求的,而且它上面有插槽有数据
- 如果说你贸然的把一个主节点删掉,肯定会出问题,要把槽转移到其他可用的节点,然后再去删除它
- 不然,会丢失数据
- 当它已经没有槽了,变成一个空的节点的时候,你去删,它就跟删除从节点这个命令是一样的
2.1 先将要删除主节点的槽转移出去
- 可以使用之前上面的命令,现在我分开来做
- $
/usr/local/redis/bin/redis-cli -a 123456 --cluster reshard 192.168.10.102:6373
- $
- 之后会有提示
How many slots do you want to move (from 1 to 16384)?
这里可以写 2000What is the receiving node ID?
这里填写接收方id, 对应 --cluster-to 填写 afe0b3936c837a46972055c7b9b691bdd8149b7dSource node #1:
这里要填写槽的来源的id, 对应 --cluster-from 填写 3a083c35074c45d513af75e137b3aa9fc3d4b0e2Source node #2:
这里可以填写多个, 如果槽数凑够了,则可以填入 done- 接着输入
yes
开始转移槽
- 这样,槽就重新分配回去了,之后可以再通过
cluster nodes
或check
命令查看节点信息来验证
2.2 移除主节点
- 移除:$
/usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.10.103:6377 3a083c35074c45d513af75e137b3aa9fc3d4b0e2
- 连入并关停 6377 $
SHUTDOWN
相关文章:
Redis: 集群高可用之节点与插槽管理
概述 Redis Cluster 集群模式,它使用的是分片来存储数据的,数据都存在多个节点上。而且使用了哈希槽这样的机制,它内部维护了 16384 个插槽那就是说每一个节点其实都具体的分布了一些槽,如果我们添加一个节点的话,槽总…...

HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例
HUAWEI New4.9G 与 2.6G 无法正常切换问题处理案例 在某地市的 XX 音乐节保障准备期间,为确保活动期间的网络质量,现场新开了 4.9G HUAWEI 室外基站。在网络优化和测试中,发现UE无法实现从 2.6G 到 4.9G 的正常切换。虽然现场具备 4.9G信号覆…...
Qt C++设计模式->责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象有机会处理请求,而不需要明确指定哪个对象处理。通过将这些对象连成一条链,请求沿着链传递,直到有对象处理它为止。该模式…...
paypal支付v2.0(php)支付代码
第一步:获取access_token: <?php$clientId ; // 替换为你的 PayPal Client ID $clientSecret ; // 替换为你的 PayPal Client Secret// PayPal API 请求的 URL $url "https://api-m.sandbox.paypal.com/v1/oauth2/token";// 初始化 cURL $ch …...
基于Python的自然语言处理系列(23):DrQA
在本篇文章中,我们将实现 DrQA 模型,该模型最初由论文 Reading Wikipedia to Answer Open-Domain Questions 提出。DrQA 是一种用于开放域问答系统的端到端解决方案,最初包括信息检索模块和深度学习模型。本次实现中,我们主要探讨 DrQA 的深度学习模型部分。 1. 数据加载 …...

誉天Linux云计算课程学什么?为什么保障就业?
一个IT工程师相当于干了哪些职业? 其中置顶回答生动而形象地描绘道: 一个IT工程师宛如一个超级多面手,相当于——加班狂程序员测试工程师实施工程师网络工程师电工装卸工搬运工超人。 此中酸甜苦辣咸,相信很多小伙伴们都深有体会。除了典…...

无人机控制和飞行、路径规划技术分析
无人机控制和飞行、路径规划技术是现代无人机技术的核心组成部分,它们共同决定了无人机的性能和应用范围。以下是对这些技术的详细分析: 一、无人机控制技术 无人机控制技术主要涉及飞行控制系统的设计、传感器数据的处理以及指令的发送与执行。飞行控…...

【C++】模拟实现红黑树
🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 📌实现RBTreeNode类模板 🎏构造RBTreeNode类成员变量 🎏实现RBTreeNode类构…...

离线安装docker
背景描述 项目需要在研发环境虚拟机上安装docker部署应用。 所在的服务器是一个内网,无法访问到外网环境。 服务器OS版本是 麒麟V10 linux 安装docker 安装包下载 获取所需版本的docker binary包,官方链接https://download.docker.com/linux/stati…...

MySQL高阶2066-账户余额
目录 题目 准备数据 分析数据 总结 题目 请写出能够返回用户每次交易完成后的账户余额. 我们约定所有用户在进行交易前的账户余额都为0, 并且保证所有交易行为后的余额不为负数。 返回的结果请依次按照 账户(account_id), 日期( day ) 进行升序排序…...

《RabbitMQ篇》Centos7安装RabbitMQ
安装RabbitMQ 安装包网盘下载地址 链接:https://pan.baidu.com/s/1bG_nP0iCdAejkctFp1QztQ?pwd4mlw 先上传安装包到服务器(erlang-23.3.4.11-1.el7.x86_64.rpm和rabbitmq-server-3.9.16-1.el7.noarch.rpm)然后使用指令安装 # 安装 erlang r…...

昇思学习打卡营第31天|深度解密 CycleGAN 图像风格迁移:从草图到线稿的无缝转化
1. 简介 图像风格迁移是计算机视觉领域中的一个热门研究方向,其中 CycleGAN (循环对抗生成网络) 在无监督领域取得了显著的突破。与传统需要成对训练数据的模型如 Pix2Pix 不同,CycleGAN 不需要严格的成对数据,只需两类图片域数据,…...
跟我学C++中级篇——空值的定义
一、空值 在提到c/c的空值时,先扯远一些。谈一谈数学中的0,0的出现要晚于其它的数,而0的出现却引发了数学的极大的发展和进步。而在计算机科学中,在使用一个变量时,它的值的可能性有很多,其中,…...
(三)Mysql 数据库系统全解析
一、Mysql 数据库 数据库的作用和优势 作用:集中化存储结构性的数据。优势: 减小数据冗余,避免数据的重复存储。保证数据的真实有效和唯一性,提高数据的质量。方便数据共享访问,使得不同的用户和应用可以方便地获取所需…...

SAP HCM 0001信息类型一个月内有多个成本中心
一般跨部门调动时候,成本中心都会变化,SAP默认都是读取wpbp的最后一一条数据,但是今天过账会读取两个单位的成本中心,一直都觉得很奇怪,SAP如何都拆分出这样的情况, 没办法只有debug,初始化系统…...
字节输入流
1.是什么 字节输入流(Byte Input Stream)在Java中是用来读取原始字节流的数据。Java的java.io包提供了多种字节输入流类,其中InputStream是所有字节输入流类的超类。以下是关于字节输入流的详细解释和举例: 字节输入流的概念&…...

深度学习-----------------机器翻译与数据集
目录 机器翻译与数据集下载和预处理数据集预处理步骤词元化词汇表该部分总代码 固定长度阶段或填充该部分总代码 转换成小批量数据集用于训练训练模型总代码 机器翻译与数据集 import os import torch from d2l import torch as d2l下载和预处理数据集 #save d2l.DATA_HUB[fr…...

SOMEIP_ETS_151: SD_Send_triggerEventUINT8Reliable_Eventgroup_2
测试目的: 验证DUT在Tester订阅事件组后,能够响应Tester触发的triggerEventUINT8Reliable方法,并将TestEventUINT8Reliable事件发送到订阅请求中端点选项指定的IP地址和端口。 描述 本测试用例旨在确保DUT能够正确处理事件组的订阅请求&am…...

32 C 语言指针的长度与运算(指针加减整数、指针自增自减、同类型指针相减、指针的比较运算)
目录 1 指针的长度 2 指针与整数的加减运算 3 指针自增与自减 4 同类型指针相减 5 指针的比较运算 6 测试题 1 指针的长度 在 C 语言中,sizeof 运算符可以用来计算指针的长度。指针的长度实际上与指针所指向的数据类型无关,而是与系统的位数&…...
【系统架构设计师】经典论文:轮软件三层架构设计
更多内容请见: 备考系统架构设计师-核心总结目录 文章目录 摘要正文总结摘要 本人于 2022 年 1 月参与了中石化 XX 油田 XX 采油厂“用电管理系统”的项目建设,该系统建设目标是实现分单位、分线路、分系统评价、优化、考核,全面提升采油厂用 电管理水平。在该项目组中我担…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)
零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…...