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)? 这里可以写 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.mzph.cn/web/54445.shtml

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

相关文章

Redis --- 第二讲 --- 特性和安装

一、背景知识 Redis特性&#xff1a; Redis是一个在内存中存储数据的中间件&#xff0c;用于作为数据库&#xff0c;作为缓存&#xff0c;在分布式系统中能够大展拳脚。Redis的一些特性造就了现在的Redis。 在内存中存储数据&#xff0c;通过一系列的数据结构。MySQL主要是通…

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索&#xff1a;docker search 比如&#xff1a;docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像&#xff0c;如果有就是官方镜像&#xff0c;如果没有就是第三方的。 下载&#xff1a;docker pull 比如&#xff1a…

Redis篇(Redis原理 - 数据结构)(持续更新迭代)

目录 一、动态字符串 二、intset 三、Dict 1. 简介 2. Dict的扩容 3. Dict的rehash 4. 知识小结 四、ZipList 1. 简介 2. ZipListEntry 3. Encoding编码 五、ZipList的连锁更新问题 六、QuickList 七、SkipList 八、RedisObject 1. 什么是 redisObject 2. Redi…

go+redis基于tcp实现聊天室

goredis实现聊天室 基于tcp连接通过redis实现了消息的广播&#xff0c;命令改名&#xff0c;查询在线人数&#xff0c;查询用户活跃度 serverclinet server 聊天室服务端的流程可以分为几个主要部分&#xff1a;初始化、监听连接、处理每个连接以及消息的处理和转发 1. 初…

【优选算法】(第八篇)

目录 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#…

Redis:list类型

Redis&#xff1a;list类型 list命令非阻塞LPUSHLRANGELPUSHXRPUSHRPUSHXLPOPRPOPLINDEXLINSERTLLENLREMLTRIMLSET 阻塞BLPOPBRPOP 内部编码ziplistlinkedlistquicklist 几乎每种语言都有顺序表、数组、链表这样的顺序结构&#xff0c;Redis也做出了相应的支持。 如图&#xff…

C++基础:enum class作用域枚举 (C++11)

C基础&#xff1a;enum class作用域枚举 介绍特点作用域强类型默认底层类型 介绍 enum class 是C11引入的一种改进的枚举机制&#xff0c;主要改进了传统的enum类型的作用域控制问题&#xff0c; 故也被称为作用域枚举&#xff08;scoped enumerations&#xff09;。那么&…

Stable Diffusion绘画 | AI 图片智能扩充,超越PS扩图的AI扩图功能(附安装包)

来到「文生图」页面&#xff0c;输入固定的起手式提示词。 第1步&#xff0c;开启 ControlNet&#xff0c;将需要扩充的图片加载进来&#xff1a; 控制类型选择「Inpaint」&#xff0c;预处理器选择「inpaint_onlylama」&#xff0c;缩放模式选择「缩放后填充空白」&#xff1…

基于SpringBoot+Vue的网约车管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

SQL语句 (MySQL)

登录操作 参数 -u&#xff1a;user 用户参数 -p&#xff1a;password 密码 mysql -u Jack -p退出登录 exit;控制与管理 展示用户列表 select user, host from mysql.user;创建用户 UserName &#xff1a;填新用户的名称HostName &#xff1a;允许该用户用什么主机登录数据…

单链表基本操作(2)

一、 取值——取单链表中第i个元素的内容 算法步骤&#xff1a; 从第1个结点&#xff08;L->next&#xff09;顺链扫描&#xff0c;用指针p指向当前扫描到的结点&#xff0c;p初值pL->next。j做计数器&#xff0c;累计当前扫描过的结点数&#xff0c;j初值为1。当p指向…

(Django)初步使用

前言 Django 是一个功能强大、架构良好、安全可靠的 Python Web 框架&#xff0c;适用于各种规模的项目开发。它的高效开发、数据库支持、安全性、良好的架构设计以及活跃的社区和丰富的文档&#xff0c;使得它成为众多开发者的首选框架。 目录 安装 应用场景 良好的架构设计…

Leetcode—763. 划分字母区间【中等】

2024每日刷题&#xff08;175&#xff09; Leetcode—763. 划分字母区间 C实现代码 class Solution { public:vector<int> partitionLabels(string s) {int rightmost[26];int l 0;int r 0;for(int i 0; i < s.length(); i) {rightmost[s[i] - a] i;}vector<…

[C语言]第十一节 函数递归一基础知识到高级技巧的全景探索

目录 11.1. 递归是什么&#xff1f; 11.1.1 递归的思想&#xff1a; 11.2 递归的限制条件 举例1&#xff1a;求n的阶乘 画图推演 举例2&#xff1a;顺序打印⼀个整数的每⼀位 画图推演 11.3. 递归与迭代 举例3&#xff1a;求第n个斐波那契数 11.1. 递归是什么&#xff…

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…

【Java数据结构】栈 (Stack)

【本节目标】 1. 栈的概念及使用 2. 相关 OJ 题 一、概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last…

【历年CSP-S复赛第一题】暴力解法与正解合集(2019-2022)

P5657 [CSP-S2019] 格雷码P7076 [CSP-S2020] 动物园P7913 [CSP-S 2021] 廊桥分配P8817 [CSP-S 2022] 假期计划 P5657 [CSP-S2019] 格雷码 暴力50分 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) #define int long long #d…

【Android 源码分析】Activity生命周期之onStop-1

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

【2024】前端学习笔记11-网页布局-弹性布局flex

学习笔记 网页布局弹性布局&#xff1a;flex案例&#xff1a;flex布局案例 网页布局 在页面布局中&#xff0c;display属性用于设置一个元素的显示方式。它可以指定元素是作为块级元素、内联元素还是充当表格元素显示。 display的常见属性值&#xff1a; block&#xff1a;将…

解决方案:机器学习中,出现欠拟合和过拟合,这两种情况分别如何解决

文章目录 一、现象二、解决方案欠拟合&#xff08;Underfitting&#xff09;过拟合&#xff08;Overfitting&#xff09; 一、现象 在工作中&#xff0c;在机器学习中&#xff0c;出现欠拟合和过拟合的时候&#xff0c;需要有对应的解决方法&#xff0c;所以整理一下 二、解决…