从redis-trib.rb到集群加减节点实战

news2024/12/25 0:05:35

redis-trib.rb工具介绍

redis-trib.rb是redis集群管理工具,可以检查集群、创建删除节点、挪key、批量下发实例命令等等。
不是没有redis-trib.rb就没有集群管理了,没有redis-trib.rb照样可以管理集群。redis本身就有集群相关管理命令,redis-trib.rb只是封装了这些命令,它极大的简化了集群管理工作。
redis-trib.rb以前是开源工具,现在已经合并到redis软件中了,跟redis-cli在一个bin目录下,所以这个命令一般都能直接用。如果没有的话检查下环境变量,或者去官网下一个
redis-trib.rb本身支持交互窗口,但是生产都得提前准备好方案,设置提前写好运行脚本,交互模式不太实用,所以本篇的介绍都是针对非交互式的。

常用命令

redis-trib.rb查看help
redis-trib.rb可做如下操作

command行为
create创建集群,需要提前建好实例
check检查集群,其实也是输出集群信息,check比info更实用一点
info输出集群信息
fix修复集群,自检并自动修复集群异常,某些场景无法自动修复
reshard挪slot命令,加减节点的核心命令
rebalance因为slot不均匀导致数据倾斜,rebalance可以自动转移slot平衡集群
add-node添加节点
del-node删除节点
set-timeout设置集群心跳连接超时参数
call在所有节点上执行命令
import从外部redis导入集群
help打印此帮助

查看集群状态

redis-trib.rb check  --password  mypass  127.30.30.10:6486 
>>> Performing Cluster Check (using node 127.30.30.10:6486)
M: 62e4f253ce48af6699713c11dcc8baae062a736d 127.30.30.10:6486
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: e2f650538610505be567cf4bf87c599e1afd354d 127.30.30.47:6486
   slots: (0 slots) slave
   replicates 62e4f253ce48af6699713c11dcc8baae062a736d
S: 081dad4fadf8cf29a018ef12b703eb9a3363a86a 127.30.30.51:6485
   slots: (0 slots) slave
   replicates 387a5764c93f4d52c9f46996df4af0d74abacf0f
M: 2e0335e3fc413568c3f2900a66c837d34db6565a 127.30.30.51:6484
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 78c01003a13979221d9ef42660f4715c5ccd48aa 127.30.30.45:6484
   slots: (0 slots) slave
   replicates 2e0335e3fc413568c3f2900a66c837d34db6565a
M: 387a5764c93f4d52c9f46996df4af0d74abacf0f 127.30.30.47:6485
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

至少确认两个信息

  • check输出[ok],无异常输出,集群状态正常
  • 节点ID,在reshard和加减节点时会用到

这个经典的3主3从redis集群架构如下
在这里插入图片描述

reshard参数说明

host:port:这个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口。
–from :需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递–from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入。
–to :slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入。
–slots :需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。
–yes:设置该参数,可以在打印执行reshard计划的时候,提示用户输入yes确认后再执行reshard。
–timeout :设置migrate命令的超时时间。
–pipeline :定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10。
非交互的执行命令,如下

redis-trib.rb reshard --password mypass --from f2ce18189001d64fd55d3500f48338aa6d92bf7e 	--to da0b390d8fd35b303f857dd15a3a4ac0ca317c7b --slots 100  --pipeline 1000 --timeout 100000000  --yes 127.10.0.79:6416 

表示非交互模式从节点da0b390d8fd35b303f857dd15a3a4ac0ca317c7b转移100个slot到f2ce18189001d64fd55d3500f48338aa6d92bf7e节点
连接节点为127.10.0.79:6416(redis-trib.rb连接到集群的登陆节点),注意这个节点最好是缩容节点后仍保留的节点

总是报命令错误?

redis-trib.rb的help(直接敲redis-trib.rb就出来help了)有点问题。help看上去把–password放在了命令最后,如果按照help来敲命令,那么你可能总是会得到命令错误的提示:

[ERR] Wrong number of arguments for specified sub command

应该把 --password 放到“中间”,command动作后面,像这样

redis-trib.rb call  --password  mypass  127.30.30.130:7367 config get maxmemory 

操作注意事项

使用redis自带工具redis-trib.rb reshard做slot和key的迁移,步骤很简单。但是仍有一些注意点,有些可能导致reshard中断,需手工修复。
为了减少不必要的麻烦并提高变更的成功率,我们需要注意这些点

  • 只要把缩容后的slot计算均匀,手动分配slot到保留的节点,slot是均匀的,最后不太需要做rebalance操作
  • 确保缩容后,每个机器的节点数不超过总节点数的一半
  • 对于节点较多的集群,可以把命令做成脚本。但是需要注意,在每个reshard命令中间插入sleep 5。reshard命令太“紧凑”也可能导致reshard失败
  • timeout参数尽量设置的够大,设置过小会导致reshard命令中断
  • 对于内存较大、或者有大key的节点,转移这些keys的时间会更长,更应该调大timeout参数
  • 内存得是足够的。比如减少节点后,每个实例的内存是否足够,如果不够需要增加maxmemory或者不要减少那么多节点

变更风险点

reshard是否在线操作?

reshard操作会把slot设置为迁移状态,迁移key时业务还是会有短暂的感知。

加减节点是否需要重启redis实例?

不需要!整个加减节点的所有操作是不需要重启redis实例的

加减节点是否需要重启应用?

不确定!取决于中间件是否缓存了路由
实际案例中增删节点时遇到过有些应用一点感觉没有,有些必须要重启才正常的情况

slot计算

迁移前把迁移后的slot的分配算好,就可以不重复迁移slot,并减少rebalance这一步。再者,如果节点过多或者物理内存(或cg)有限,本身迁移过程中需要把slot分散地reshard到其他各个节点上。所以需要提前计算好slot的分配以及reshard过程中迁移多少slot。
以一个56节点的redis cluster为例,减少16个节点到40个节点
缩容前,每个节点的slots为:16384/56=292.5(292或293)
缩容后,每个节点的slots为:16384/40=409.6(409或410)
那么,reshard时转移的slot为:410-293=117
因为要把删除的节点上的slot全部转移完
所以每个节点上还剩一点slots需要转移完 292.5-117-117=58.5(58或59)
具体数值看节点到底有多少slot,目的是slot均匀且删除节点的slot全部转移,差1、2个slot问题不大

在这里插入图片描述

实施方案案例

从多个集群节点中减少一部分节点,并完成回退方案(回退就是增加节点)

删除集群的一部分节点

  1. 选择要踢出的节点,并计算分配到其他节点的slot个数
    (一般来说,会选择整个机器上部署的所有节点)
RLZLCLUSTER	 RLZLCLUSTER_40	 主库	hostlzl111 	76a301a4f1bd18d19df29aff6dc9c42e141f7225		127.10.11.50:6475  
RLZLCLUSTER	 RLZLCLUSTER_41	 从库	hostlzl111 	1df5c7a055f3e776d856a43f83f0b8414ddb33a5	127.10.11.50:6476  
  1. reshard迁移slot(会转移key)
    把需要剔除的节点上的slot迁移走,迁到不会剔除的节点上
#redis-trib.rb  check 127.10.11.35:6612 |grep -A 2 -B 2  3aca6bf3cc102d65d5dbed9e461773c32d3864c2

#76a301a4f1bd18d19df29aff6dc9c42e141f7225 节点上所有slot迁移,迁移到其他2个节点上

redis-trib.rb reshard --password mypass --from 76a301a4f1bd18d19df29aff6dc9c42e141f7225 	--to 726823529b76f2048711f07aea11615fa4ea5720 --slots 30  --pipeline 1000 --timeout 100000000  --yes 127.10.11.79:6416 
redis-trib.rb reshard --password mypass --from 76a301a4f1bd18d19df29aff6dc9c42e141f7225 	--to da6ced81cbaa2ca65514a5819469ae6f72e99737 --slots 117  --pipeline 1000 --timeout 100000000  --yes 127.10.11.79:6416 
  1. 检查删除的节点没有slot
redis-trib.rb  check --password mypass 127.10.11.79:6416|grep -E -A 1 "127.10.11.50"
  1. 剔除节点 (ip:port为登陆节点,不是删除节点)
#删除从节点:
redis-trib.rb del-node --password mypass 127.10.11.79:6416 1df5c7a055f3e776d856a43f83f0b8414ddb33a5

#删除主节点:
redis-trib.rb del-node --password mypass 127.10.11.79:6416 76a301a4f1bd18d19df29aff6dc9c42e141f7225

回退方案(将节点加回集群)

  1. 将新的单实例加入为主节点
/paic/redis/3.2.12/bin/redis-trib.rb  add-node --password mypass 172.30.32.9:6476  $ip:port  
  1. 将新的单实例加入为从节点
#指定给某个集群的主节点添加从节点
redis-trib.rb add-node --slave --master-id <one_master_id>  
/paic/redis/3.2.12/bin/redis-trib.rb check  --password mypass 127.10.11.50:6495

3.进行rebalance(整个集群只需要执行一次),或者手动reshard

/paic/redis/3.2.12/bin/redis-trib.rb  rebalance  --password mypass --threshold <arg>  127.10.11.50:6495

(附)迁移中断问题处理

迁移命令中断,集群check报错

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
[WARNING] Node 127.10.11.2:6410 has slots in importing state (1312).
[WARNING] Node 127.10.11.50:6475 has slots in migrating state (1312).
[WARNING] The following slots are open: 1312
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** Please fix your cluster problems before resharding

解决方案一:用fix自动修复

redis-trib.rb fix --password mypass 127.10.11.50:6495

解决方案二: 如果fix失败,手动stable,检查key的位置

r -c
CLUSTER SETSLOT 1312 stable
cluster GETKEYSINSLOT 1312 1000  

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

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

相关文章

2021年系统架构设计师考试下午案例分析真题

试题一 阅读以下关于软件架构设计与评估的叙述&#xff0c;在答题纸上回答问题1和问题2。 [说明] 某公司拟开发-套机器学习应用开发平台,支持用户使用浏览器在线进行基于机器学习的智能应用开发活动。 该评台的核心应用场景是用户通过拖拽算法组件灵活定义机器学习流程&#…

“6511”成果显著,联诚发上半年表现企稳高升!

六场巡回演唱会&#xff0c;五大知名展会&#xff0c;一部爆款大电影&#xff0c;一项省级品牌荣誉。 这些关键词&#xff0c;是联诚发&#xff08;LCF&#xff09;在短短六个月内取得的各项成果的总览。 ▲联诚发LCF 公司简介 绿树阴浓夏日长&#xff0c;6月的到来也预示着阶…

让小脚本成为自己高效测试的工具(详细版)

目录 测试中会遇到的工具 测试常用的开源工具 Python 移动/UI自动化测试平台 平台需要做什么 自建需要的技术 接口测试平台 运维 Django运维部署框架 单元测试概述 什么是单元测试 单元测试什么进行&#xff1f; 单元测试由谁负责&#xff1f; 单元测试需要注意 …

opencv祛除高光

代码是直接借鉴的Opencv去除高光_SkyrimDragonBorn的博客-CSDN博客 原博客是c&#xff0c;我这边只是使用python进行翻译了一下 import cv2 import numpy as npimg cv2.imread(xxx.jpg)def highlight_remove(img):img cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.floa…

java0615

01java语言背景介绍 02java语言跨平台原理 03JRE和JDK

View UI Plus (iview)表格单选实现教程

View UI Plus 是 View Design 设计体系中基于 Vue.js 3 的一套 UI 组件库&#xff0c;主要用于企业级中后台系统 View UI&#xff0c;即原先的 iView&#xff0c;从 2019 年 10 月起正式更名为 View UI&#xff0c;并使用全新的 Logo View UI Plus 实现表格单选&#xff0c;这…

八股文总结

文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…

Java Logback日志框架概述及logback.xml详解

日志技术具备的优势 可以将系统执行的信息选择性的记录到指定的位置&#xff08;控制台、文件中、数据库中)。 可以随时以开关的形式控制是否记录日志&#xff0c;无需修改源代码。 日志体系结构 Logback日志框架 Logback是由log4j创始人设计的另一个开源日志组件&#xff0…

Android classLoader 双亲委托 反射

双亲委托 双亲委托机制&#xff0c;就是导入类的时候判断parent是否已经导入过该类。 作用 1、避免重复加载&#xff0c;当父加载器已经加载了该类的时候&#xff0c;没有必要子ClassLoader再加载一次。 2、安全性考虑&#xff0c;防止核心API库被随意篡改。 核心代码 pri…

CSS查缺补漏之常用长度单位(px、em、rem、%、vw/vh、vmin/vmax)

此文内容较少&#xff0c;轻轻松松掌握&#xff0c;莫要有压力~ 正如现实生活中长度具有mm、dm、cm、m等&#xff0c;在css中&#xff0c;也具备多种长度单位&#xff0c;本文对常用的几种单位进行详细举例介绍~ px&#xff1a;像素单位 初学css时&#xff0c;px单位经常被使用…

2023-06-16 Android Studio 使用CMakeList编译JNI ,源码

一、代码结构图&#xff0c;代码路径https://download.csdn.net/download/qq_37858386/87913001 二、cmakedemo\app\build.gradle 加下面的代码 externalNativeBuild {cmake {cppFlags "-frtti -fexceptions"}}externalNativeBuild {cmake {path src/main/jni/CMakeL…

邮件触发无需代码连接维格表的方法

1.邮件触发用户使用场景&#xff1a; 公司时常会收到来自各地的合作邮件&#xff0c;为了筛选合适的合作伙伴&#xff0c;公司需要查询对方企业的基础工商信息&#xff0c;例如企业的存续状态、法人代表、注册资金等等&#xff0c;然后将查询后的信息发送至高管群里&#xff0c…

使用docker部署ELK实战

目录 什么是ELKELK简介ElasticsearchLogstashKibana docker安装ELK安装es安装 Kibana安装logstash 什么是ELK ELK是一个开源的数据分析平台&#xff0c;由三个开源项目Elasticsearch、Logstash和Kibana组成&#xff0c;因此被称为ELK Stack。ELK Stack主要用于处理和分析大量的…

数字安全免疫力:“关基”企业构建安全体系的通关攻略

2023年5月1日起&#xff0c;《信息安全技术 关键信息基础设施安全保护要求》&#xff08;以下简称《关基保护要求》&#xff09;正式实施&#xff0c;这是关键信息基础设施安全保护相关的首个国家标准。相对于2021年9月1日起实施的《关键信息基础设施安全保护条例》&#xff0c…

复习css样式的第1章

什么是 CSS&#xff1f; CSS 指的是层叠样式表* (Cascading Style Sheets)CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素CSS 节省了大量工作。它可以同时控制多张网页的布局外部样式表存储在 CSS 文件中 三种使用 CSS 的方法 有三种插入样式表的方法&#xff1a; 外…

RISC-V体系结构的U-Boot引导过程 第一阶段

RISC-V体系结构的U-Boot引导过程 第一阶段 flyfish .globl _start _start:.globl使符号对链接器可见相当于C语言中的Extern&#xff0c;声明此变量&#xff0c;并且告诉链接器此变量是全局变量&#xff0c;外部可以访问.u-boot.lds里的ENTRY(_start)也是这里的_start。 即指定…

SUNet: Swin Transformer UNet for ImageDenoising

Abstract 图像恢复是一个具有挑战性的不适定问题&#xff0c;也是一个长期存在的问题。在过去的几年中&#xff0c;卷积神经网络(cnn)几乎主导了计算机视觉&#xff0c;并在不同层次的视觉任务中取得了相当大的成功&#xff0c;包括图像恢复。然而&#xff0c;最近基于Swin tr…

权限验证框架之Shiro

文章目录 前言shiro 核心项目构建默认Session模式配置测试接口Realm编写权限测试无权限测试登录测试权限测试 前后端分离tokenJWTFilter重写认证修改配置 总结 前言 交替换个脑子&#xff0c;一直搞考研的东西&#xff0c;实在是无聊。所以顺便把工程上的东西&#xff0c;拿来…

软件测试面试大全(全800+题)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c…

C++ [STL之list模拟实现]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL之list模拟实现 前言正文基本框架节点类迭代器类list类 迭代器类功能实现list迭代器迭代器设计思想迭代器操作设计 list类功能实现默认成员函数容量查询数据访问节点插删相关头尾插删任意位置…