Redis 7.x 系列【26】集群模式动态扩容、动态缩容

news2024/9/20 6:07:37

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 动态扩容
      • 1.1 安装、启动
      • 1.2 加入新节点
      • 1.3 分配哈希槽
      • 1.4 加入从节点
    • 2. 缩容
      • 2.1 删除从节点
      • 2.2 迁移哈希槽
      • 3.3 删除主节点

1. 动态扩容

Redis 集群支持动态增加节点实现扩容,提高集群容量和数据处理能力,接下来演示将之前三主三从扩容为四主四从。

1.1 安装、启动

新加节点网络访问地址如下 (一台服务器):

  • 主节点四:192.168.56.101:7000
  • 从节点四:192.168.56.101:7001

安装、修改配置、启动,这几个步骤和集群部署一样,这里就不赘述了。

1.2 加入新节点

查看节点信息(一台服务器):

[root@localhost bin]# redis-cli -a cluster123456 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
b5bde236f14f21f530a7095aaef3a98109009324 192.168.56.101:6383@16383 slave e909dc338f4c2fc7687cf4426d3b95956a90a8a8 0 1721384436435 2 connected
724c7b874dc0c37a462cd5ab59325203344f8008 192.168.56.101:6379@16379 myself,slave ce27fa445e987f75bddeeb68fc6fe440678ad1bb 0 1721384432000 7 connected
ce27fa445e987f75bddeeb68fc6fe440678ad1bb 192.168.56.101:6382@16382 master - 0 1721384434000 7 connected 0-5460
e909dc338f4c2fc7687cf4426d3b95956a90a8a8 192.168.56.101:6380@16380 master - 0 1721384435431 2 connected 5461-10922
0f1d8d6459ac4252636cb4b8e1764de9e277411c 192.168.56.101:6390@16390 slave 9f9c30c3f73106e256fdec27264fc8129e1287fd 0 1721384435000 3 connected
9f9c30c3f73106e256fdec27264fc8129e1287fd 192.168.56.101:6381@16381 master - 0 1721384435000 3 connected 10923-16383

此时,集群节点并不包含新节点信息,需要使用 add-node 将新的主节点加入:

[root@localhost bin]# redis-cli -a cluster123456 --cluster add-node 192.168.56.101:7000 192.168.56.101:6380

命令说明:

  • cluster123456 :集群节点认证密码
  • 192.168.56.101:7000:新加入的主节点
  • 192.168.56.101:6380:负责扩容处理的节点(原先集群中的任意主节点)

打印日志日下:

在这里插入图片描述
重新查看集群信息,可以看到新节点:
在这里插入图片描述

1.3 分配哈希槽

新节点此时没有分配哈希槽,需要使用 reshard 命令重新分配集群中的哈希槽:

[root@localhost bin]# redis-cli -a cluster123456  --cluster reshard 192.168.56.101:6380

首先会提示分配多少哈希槽,这里有四个主节点 16384/4=4096 ,所有输入 4096

[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096

接着输入新节点的 ID ,将分配的哈希槽给新节点(cluster nodes命令查看):

What is the receiving node ID? a95a0a529f62ff1793bf2c2cfc92ec51c96e1268

接着提示从哪些节点移出这 4096 个哈希槽,这些输入 all 表示从所有节点平摊移出:

Please enter all the source node IDs.
to use all the nodes as source nodes for the hash slots.
Type'done'
entered allthe source nodes IDs.
Source node #1:all

最后会打印一些迁移日志:

在这里插入图片描述
重新查看节点信息,可以看到新节点被分配了哈希槽:
在这里插入图片描述新节点的哈希槽,并不是连续的,分为了三个区间,直接截取了其他节点的部分哈希槽,如果是全部重新分配,需要全部迁移,这样成本高且效率很低。

1.4 加入从节点

接着使用 add-node 命令将新的从节点,加入到集群中:

[root@localhost bin]# redis-cli -a cluster123456 --cluster add-node 192.168.56.101:7001 192.168.56.101:7000 --cluster-slave --cluster-master-id a95a0a529f62ff1793bf2c2cfc92ec51c96e1268

命令说明:

  • cluster123456 :集群节点认证密码
  • 192.168.56.101:7001:新加入的从节点
  • 192.168.56.101:7000:新从节点对应的主节点
  • a95a0a529f62ff1793bf2c2cfc92ec51c96e1268:主节点 ID

打印日志如下:
在这里插入图片描述

重新查询节点信息,可以看到新的主从节点都加入成功:

在这里插入图片描述

2. 缩容

Redis 集群支持动态删除节点实现缩容,从集群中移除节点,将分配给该节点的哈希槽移动到其他现有节点上。接下来演示将上面的四主四从恢复为三主三从。

2.1 删除从节点

查看将被移除节点的信息:

[root@localhost bin]# redis-cli -a cluster123456 cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
a95a0a529f62ff1793bf2c2cfc92ec51c96e1268 192.168.56.101:7000@17000 master - 0 1721394340000 8 connected 0-1364 5461-6826 10923-12287
78d33242164ad02901903b195f54aaa1b0e14420 192.168.56.101:7001@17001 slave a95a0a529f62ff1793bf2c2cfc92ec51c96e1268 0 1721394340538 8 connected

首先需要删除从节点,使用 del-node 命令,输入从节点的地址、ID

[root@localhost bin]# redis-cli -a cluster123456 --cluster del-node 192.168.56.101:7001 78d33242164ad02901903b195f54aaa1b0e14420

打印日志如下:
在这里插入图片描述

查看节点信息,可以看到从节点已经被移除:

在这里插入图片描述

2.2 迁移哈希槽

删除主节点之前,需要将当前节点中的哈希槽迁移出去,这里直接将被删除节点中的 4096 个哈希槽,全部移入到 6380 节点中,使用 reshard 命令重新分配集群中的哈希槽:

[root@localhost bin]# redis-cli -a cluster123456  --cluster reshard 192.168.56.101:6380

输入4096

[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096

接着输入 6380 节点的 ID 接收哈希槽 (cluster nodes命令查看):

What is the receiving node ID? e909dc338f4c2fc7687cf4426d3b95956a90a8a8

接着提示,从哪些节点移出这 4096 个哈希槽,这里输入删除节点的 ID,输入 done ,表示该节点将被删除:

Please enter all the source node IDs.
to use all the nodes as source nodes for the hash slots.
Type'done'
entered allthe source nodes IDs.
Source node #1: e909dc338f4c2fc7687cf4426d3b95956a90a8a8
Source node #2: done

在这里插入图片描述

3.3 删除主节点

使用 del-node 命令删除主节点:

redis-cli -a cluster123456 --cluster del-node 192.168.56.101:7000 a95a0a529f62ff1793bf2c2cfc92ec51c96e1268

查看节点信息,可以看到主节点也被移除了:
在这里插入图片描述

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

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

相关文章

PHP场地预约共享茶室棋牌室小程序系统源码

🍵🎲【聚会新宠】场地预约神器,共享茶室棋牌室小程序大揭秘!🎉 🏡【开篇:告别繁琐,聚会新选择】🏡 还在为找不到合适的聚会场地而烦恼吗?想要一个既私密又舒…

python+onlyoffice+vue3项目实战20240722笔记,环境搭建和前后端基础代码

开发后端 先创建data目录,然后在data目录下创建一个test.docx测试文档。 后端代码: import json import req import api from api import middleware, PlainTextResponseasync def doc_callback(request):data = await api.req.get_json(request)print("callback ==…

微信小程序-CANVAS写入图片素材、文字等数据生成图片

微信小程序中,CANVAS写入图片素材、文字等数据生成图片,最终可将生成的 base64 格式图片保存至相册操作 Tips: 1、canvas 标签默认宽度 300px、高度 150px canvas 生成图片时,写入图片素材、文字等数据前,需要根据实…

git的一些使用技巧(git fetch 和 git pull的区别,git merge 和 git rebase的区别)

最近闲来无聊,虽然会使用git操作,但是 git fetch 和 git pull 的区别,git merge 和 git rebase的区别只是一知半解,稍微研究一下; git fetch 和 git pull 的区别 git fetch git fetch 是将远程仓库中的改动拉到本地…

鸿蒙仓颉语言【扩展Redis仓颉语言客户端】

2. 扩展Redis仓颉语言客户端 2.1 Redis命令处理模块的架构 Redis命令处理的架构图如下: RedisCommand类 Redis命令的实现类 包含以下成员: commandType: Redis命令的名称 commandArgs: Redis命令的参数列表 response: Redis命令的响应消息&#xff…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(十)-无人机A2X服务

引言 3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别、跟踪及A2X(Aircraft-to-Everything)服务的支持。 3GPP TS 23.256 技术规范: 【免费】3GPPTS23.256技术报告-无人机系…

当当网数据采集:Scrapy框架的异步处理能力

在互联网数据采集领域,Scrapy框架以其强大的异步处理能力而著称。Scrapy利用了Python的异步网络请求库,如twisted,来实现高效的并发数据采集。本文将深入探讨Scrapy框架的异步处理能力,并展示如何在当当网数据采集项目中应用这一能…

npm 安装报错(已解决)+ 运行 “wue-cli-service”不是内部或外部命令,也不是可运行的程序(已解决)

首先先说一下我这个项目是3年前的一个项目了,中间也是经过了多个人的修改惨咋了布置多少个人的思想,这这道我手里直接npm都安装不上,在网上也查询了多种方法,终于是找到问题所在了 问题1: 先是npm i 报错在下面图片&…

下拉菜单过渡

下拉过渡&#xff0c;利用Y轴的transform&#xff1a;scaleY(0) —》transform&#xff1a;scaleY(1) 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" cont…

实战:MyBatis适配多种数据库:MySQL、Oracle、PostGresql等

概叙 很多时候&#xff0c;一套代码要适配多种数据库&#xff0c;主流的三种库&#xff1a;MySQL、Oracle、PostGresql&#xff0c;刚好mybatis支持这种扩展&#xff0c;如下图所示&#xff0c;在一个“namespace”&#xff0c;判断唯一的标志是iddatabaseId&#xff0c;刚好写…

学习vue3的搭建

Vue3 Vite项目构建 环境准备 1. NodeJs安装 安装NodeJs&#xff0c;安装成功后&#xff0c;以管理员身份打开命令行&#xff0c;输入命令 node -v查看NodeJs版本&#xff1b;输入命令 npm -v查看npm版本。 2. 安装cnpm 因为npm是国外的&#xff0c;下载资源的时候会翻墙&…

mysql面试(一)

前言 从今天开始&#xff0c;更新一些mysql的基础知识&#xff0c;面试会遇到的知识点之类的内容。比如四个隔离级别&#xff0c;mvcc机制&#xff0c;三大日志&#xff0c;索引&#xff0c;B树的形成等等&#xff0c;从数据库的底层来剖析索引和树是怎么形成的&#xff0c;以…

LeetCode //C - 257. Binary Tree Paths

257. Binary Tree Paths Given the root of a binary tree, return all root-to-leaf paths in any order. A leaf is a node with no children. Example 1: Input: root [1,2,3,null,5] Output: [“1->2->5”,“1->3”] Example 2: Input: root [1] Output: […

服务器利用宝塔面板部署Django项目

目录 1. 使用命令启动Django项目1.1 使用 Xshell 连接服务器1.2 安装Anaconda1.3 启动Django项目1.4 使用tmux实现项目的后台运行 2. 使用Python项目管理器部署项目2.1 安装宝塔面板和软件2.2 添加站点2.3 上传项目文件2.3.1 收集静态文件2.3.2 生成依赖文件 2.4 安装安装Pytho…

如何查看Kafka的偏移量offset

本文介绍三种方法查看Kafka的偏移量offset。 1. API&#xff1a;ConsumerRecord的offset()方法查看offset。 2. API&#xff1a;KafkaConsumer的position(TopicPartition partition)方法查看offset。 3. 命令行&#xff1a;kafka-consumer-groups.sh命令查看offset。 前提条…

OpenHarmony 入门——ArkUI 自定义组件之间的状态装饰器小结(一)

文章大纲 引言一、状态管理概述二、基本术语三、状态装饰器总览 引言 前面说了ArkTS 是在TypeScript基础上结合ArkUI框架扩展定制的&#xff0c;状态管理中的各种装饰器就是扩展的功能之一&#xff0c;可以让开发者通过声明式UI快速高效实现组件之间的数据同步&#xff0c;至于…

从PyTorch官方的一篇教程说开去(4 - Q-table来源及解决问题实例)

偷个懒&#xff0c;代码来自比很久之前看的书&#xff0c;当时还在用gym&#xff0c;我做了微调以升级到gymnasium当前版本&#xff0c;确保可以正常演示。如果小伙伴或者原作者看到了麻烦提一下&#xff0c;我好备注一下出处。 您的进步和反馈是我最大的动力&#xff0c;小伙…

Dav_笔记10:Using SQL Plan Management之1

SQL计划基准概述 SQL计划管理是一种预防机制&#xff0c;可以记录和评估SQL语句的执行计划。此机制可以构建SQL计划基准&#xff0c;这是一组SQL语句的已接受计划。已接受的计划已被证明表现良好。 SQL计划基准的目的 SQL计划基准的目标是保持相应SQL语句的性能&#xff0c;…

1-如何挑选Android编译服务器

前几天&#xff0c;我在我的星球发了一条动态&#xff1a;入手洋垃圾、重操老本行。没错&#xff0c;利用业余时间&#xff0c;我又重新捣鼓捣鼓代码了。在接下来一段时间&#xff0c;我会分享我从服务器的搭建到完成Android产品开发的整个过程。这些东西之前都是折腾过的&…

【JAVA】堆、栈的理解

JAVA中的堆和栈 堆和栈的简单描述栈堆 示例1示例2如何判断操作的是原始对象本身还是引用地址的变量&#xff08;个人理解&#xff0c;仅作为记录&#xff09; 引言 在Java中&#xff0c;内存管理是一个重要的概念&#xff0c;它涉及到堆&#xff08;Heap&#xff09;和栈&#…