Redis: 集群高可用之节点与插槽管理

news2024/10/4 13:19:35

概述

  • 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)? 这里可以写 2000
    • What is the receiving node ID? 这里填写接收方id, 对应 --cluster-to 填写 afe0b3936c837a46972055c7b9b691bdd8149b7d
    • Source node #1: 这里要填写槽的来源的id, 对应 --cluster-from 填写 3a083c35074c45d513af75e137b3aa9fc3d4b0e2
    • Source node #2: 这里可以填写多个, 如果槽数凑够了,则可以填入 done
    • 接着输入 yes 开始转移槽
  • 这样,槽就重新分配回去了,之后可以再通过 cluster nodescheck 命令查看节点信息来验证

2.2 移除主节点

  • 移除:$ /usr/local/redis/bin/redis-cli -a 123456 --cluster del-node 192.168.10.103:6377 3a083c35074c45d513af75e137b3aa9fc3d4b0e2
  • 连入并关停 6377 $ SHUTDOWN

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

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

相关文章

使用NumPy进行线性代数的快速指南

介绍 NumPy 是 Python 中用于数值计算的基础包。它提供了处理数组和矩阵的高效操作&#xff0c;这对于数据分析和科学计算至关重要。在本指南中&#xff0c;我们将探讨 NumPy 中可用的一些基本线性代数操作&#xff0c;展示如何通过运算符重载和内置函数执行这些操作。 元素级…

ubuntu图形界面右上角网络图标找回解决办法

问题现象&#xff1a; ubuntu图形界面右上角网络图标消失了&#xff0c;不方便联网&#xff1a; 正常应该是下图&#xff1a; 网络寻找解决方案&#xff0c;问题未解决&#xff0c;对于某些场景可能有用&#xff0c;引用过来&#xff1a; 参考方案 Ubuntu虚拟机没有网络图标或…

【云原生安全篇】Cosign助力Harbor验证镜像实践

【云原生安全篇】Cosign助力Harbor验证镜像实践 目录 1 引言2 概念 2.1 什么是 Cosign&#xff1f;2.2 为什么选择 Cosign 和 Harbor&#xff1f; 3 实践&#xff1a; Cosign对Harbor中的镜像签名 3.1 环境准备3.2 安装 Cosign3.3 使用 Cosign 对镜像进行签名 3.3.1 生成密钥对…

用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项

用Sklearn和Statsmodels来做linear_regression和Logistic_regression注意事项&#xff0c;区别。主要在于 intercept 项&#xff0c;和 regularization。 X np.array([-1, 0, 1]) # 自变量 Y np.array([-2, 0, 5]) # 因变量一、Linear regression 的截距项 又叫 intercep…

Web安全 - 构建全面的业务安全保护防御体系

文章目录 业务安全概述业务安全 vs. 基础安全业务安全的防护业务安全的防护策略1. 用户资源对抗的技术实现与优化2. IP资源对抗的技术实现与优化3. 设备资源对抗的技术实现与优化4. 操作资源对抗的技术实现与优化实际应用场景中的策略 典型场景业务场景 1&#xff1a;新用户注册…

Vue中使用ECharts实现热力图的详细教程

在数据可视化领域&#xff0c;热力图是一种非常直观的表现形式&#xff0c;它通过颜色深浅来展示数据分布情况。在Vue项目中&#xff0c;我们可以使用ECharts这一强大的图表库来实现热力图。下面我将详细介绍如何在Vue中使用ECharts实现热力图。效果如下图&#xff1a; 一、准备…

关于abaqus里一些问题的记录

在进行布种时&#xff0c;会遇到最大偏离因子和最小尺寸因子&#xff0c;在帮助文档里&#xff0c;是这么解释 要控制曲率对种子设定的影响&#xff0c;请为 Maximum deviation factor &#xff08;最大偏差因子&#xff09; 输入一个值。偏差因子是衡量单元边缘与原始几何图形…

爬虫prc技术----小红书爬取解决xs

知识星球&#xff1a;知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具知识星球是创作者连接铁杆粉丝&#xff0c;实现知识变现的工具。任何从事创作或艺术的人&#xff0c;例如艺术家、工匠、教师、学术研究、科普等&#xff0c;只要能获得一…

lambda表达式底层实现:反编译LambdaMetafactory + 转储dump + 运行过程 + 反汇编 + 动态指令invokedynamic

一、结论先行 lambda 底层实现机制 1.lambda 表达式的本质&#xff1a;函数式接口的匿名子类的匿名对象 2.lambda表达式是语法糖 语法糖&#xff1a;编码时是lambda简洁的表达式&#xff0c;在字节码期&#xff0c;语法糖会被转换为实际复杂的实现方式&#xff0c;含义不变&am…

低空无人机飞手四类超视距无人机技术详解

低空无人机飞手中的四类超视距无人机技术详解&#xff0c;主要涉及无人机的性能特点、技术要求、培训内容以及应用场景等方面。以下是对这些方面的详细阐述&#xff1a; 一、四类无人机&#xff08;中型无人机&#xff09;性能特点 四类无人机&#xff0c;现已更名为中型无人…

OpenCAEPoro优化(2)

前言&#xff1a; 首先有一点要注意&#xff1a; 修改代码时&#xff0c;要注意命名空间的冲突问题&#xff08;主要是头文件中&#xff09; 作者了解了相关这个项目的一些背景介绍&#xff1b;得到的主要信息是&#xff1a;这种大型程序一般都是优化的比较完善了&#xff0…

【Vue3实战】:用导航守卫拦截未保存的编辑,提升用户体验

前言 在Vue3应用中&#xff0c;用户可能会在一个页面上进行数据编辑&#xff0c;如填写表单或修改表格中的数据。当用户在未保存更改的情况下尝试离开当前页面时&#xff0c;我们希望能够弹出提示框&#xff0c;告知用户有未保存的更改&#xff0c;并询问是否确定离开。 一、使…

【案例】平面云

教程案例视频&#xff1a;Unity Shader Graph - 云教程 开发平台&#xff1a;Unity 2022 开发工具&#xff1a;Unity ShaderGraph   一、效果展示 二、ShaderGraph 路线图 三、案例分析 核心思路&#xff1a;使用 Noise&#xff08;噪声&#xff09;模拟云层状态   3.1 说明…

打造高效灵活的数字企业——The Open Group 2024生态系统架构·可持续发展年度大会重磅来袭

随着数字经济的高速发展&#xff0c;企业数字化转型已成为时代的必然趋势。如何在这场变革中抢占先机&#xff0c;实现业务增长与降本增效&#xff0c;成为众多企业关注的焦点。为此&#xff0c;The Open Group 2024生态系统架构可持续发展年度大会将于明年盛大开启&#xff0c…

Studying-多线程学习Part1-线程库的基本使用、线程函数中的数据未定义错误、互斥量解决多线程数据共享问题

来源&#xff1a;多线程编程 线程库的基本使用 两个概念&#xff1a; 进程是运行中的程序线程是进程中的进程 串行运行&#xff1a;一次只能取得一个任务并执行这一个任务 并行运行&#xff1a;可以同时通过多进程/多线程的方式取得多个任务&#xff0c;并以多进程或多线程…

Leetcode: 0011-0020题速览

Leetcode: 0011-0020题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

Java在用增强for循环遍历集合时删除元素,抛出java.util.ConcurrentModificationException异常

文章目录 0. 前言1. 问题产生的背景2. Java中增强for循环的底层原理3. 为什么增强for循环不支持在遍历集合时删除元素3.1 问题排查3.2 modCount 变量的来源3.3 expectedModCount 变量的来源3.4 导致modCount变量和expectedModCount不相等的原因3.5 为什么用迭代器遍历元素时删除…

学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)

在线学籍管理平台系统 目录 基于SpringbootVUE的在线学籍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

Leetcode: 0021-0030题速览

Leetcode: 0021-0030题速览 本文材料来自于LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 遵从开源协议为知识共享 版权归属-相同方式…

如此的“宠物医保”靠谱吗?

今天是世界动物日&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《带着笑意的眼睛&#xff0c;能看见最美的风景》。 截图&#xff1a;来源“人民体验官”推广平台 人民微博说&#xff0c;带着笑意的眼睛&#xff0c;能看见最美的风景。生活中多一点微笑&#xff…