当前位置: 首页 > news >正文

Redis: 集群高可用之故障转移和集群迁移

故障转移

故障转移,包括自动故障转移和手动故障转移

1 )自动故障转移

  • Redis 集群,主节点挂了,从节点可以顶上来继续提供服务
  • 常用制造故障的两种方式
    • 第一,对其中一个节点进行 SHUTDOWN 操作
    • 第二,kill 掉主节点的Redis进程
  • 当主节点挂掉之后,基于配置的时间,针对这个配置项 cluster-node-timeout,比如15000
  • 当 15 s 过去后,从节点接收到主节点下线的通知,就会开始顶替主节点
  • 顶替的过程是
    • 在从节点内部进行选举
    • 之后,开启 failover 故障迁移,每个 failover 都会记录当前纪元的时期
    • 选举成功,就会把纪元相关信息记录至配置文件中
    • 丢弃之前主节点的缓存状态信息
    • 更改 master_replid 和 master_replid2 的信息
    • 集群状态标记为成功
  • 这时候,从节点就会变为主节点,当之前下线故障的主节点再次上线时
  • 之前的主节点就会成为新的主节点的从节点
    • 同样,这个节点的日志信息会记录相关的工作流程
  • 在这个过程中,数据也不会丢失

2 ) 手动故障转移

  • 有的时候,在主节点没有任何问题的情况下,我们可能需要对这个主节点做出一个处理
  • 比如,现在希望把当前的这个服务器停了,但这个服务器上跑着一个Redis集群里的主节点
  • 如果按照之前的办法
    • 先把这个槽都转移出去,再把这个主节点删了
    • 最后,在别的地方找一个新的主节点,再把这个槽重新分配
    • 这个过程,想想都很麻烦
  • 找一个更安全/更便捷的把这个服务器上的节点做一个降级的处理
    • 降级了之后,删除从节点 del-node 即可
  • 可以通过手动故障转移来满足我们的需求
  • 手动故障转移会比自动故障转移要更加的安全
    • 因为前提条件就是现在环境是稳定的
    • 已经确保了主从之间的数据是一致的,都已经完全复制了
    • 在这种情况下,去做故障转移的话,肯定是避免了数据的丢失
  • 然后它是怎么来完成的呢?
    • 只需要在这个从节点里边去执行 CLUSTER FAILOVER
    • 然后这个从节点就会升级为主节点
    • 而它原来对应的那个主节点就会降级变成从节点
    • 整个过程是非常简单的
  • 比如: 之前,101:6371 是从节点,102:6374 是主节点,直接执行下面命令
    • $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.101 -p 6371 cluster failover
  • 执行完上述命令后,可看集群状态
    • $ /usr/local/redis/bin/redis-cli -c -a 123456 -h 192.168.10.101 -p 6372 cluster nodes
    • 这时候可以发现,101:6371 变成了主节点,102:6374变成了从节点
  • 之后可以分析下 101:6371 和 102:6374 的日志,里面隐藏了所有的变更流程

集群迁移

  • 集群迁移,就是把集群的数据备份迁移到另外的一个完整的集群环境中
  • 这里面涉及很多的概念
    • 比如说把一个单个的节点迁移到一个集群环境中
    • 或者说把集群的环境里边的数据迁移到某个单个的节点
    • 或者说把主从哨兵迁移到另外的一个主从哨兵或者迁移到另外一个集群等等
  • 我们主要关注
    • 把一个正在运行的集群迁移到另外一个完整的集群结构中去
    • 就是集群到集群这样的一个过程
  • 迁移的两种方式
    • 一个是手动迁移
      • 注意,如果哪一步做错了,肯定会带来很严重的后果
    • 一个是使用工具来迁移
      • 为了降低出错率可以使用成熟稳定的第三方工具,如:Redis-Shark

1 )手动迁移

  • 这里有两种情况
    • 原集群与目标集群结构一致
    • 原集群与目标集群结构不一致

1.1 原集群与目标集群结构一致

  • 可通过 check 命令检查集群状态
    • $ /usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.10.101:6371
    • 可以看到集群内主节点和相关槽的数量
  • 如果两个集群的上述主节点和相关槽数量一致,则为结构一致
  • 这种情况下怎么做迁移呢
    • 1 )有密码的话,取消密码
    • 2 )创建新的集群(与原集群目标一致),或集群已经存在
    • 3 )停掉目标集群的服务
    • 4 )删除目标集群所有节点的 AOF 和 RDB 文件
    • 5 )原集群数据持久化
      • 如果用RDB恢复就 BGSAVE
      • 如果用AOF恢复就 BGREWRITEAOF
    • 6 )复制源集群所有节点 RDB或AOF 文件到目标集群对应的节点
    • 7 )启动新集群并设置密码
    • 8 )检查状态,迁移完毕

1.2 原集群与目标集群结构不一致

  • 比如说原集群现在是3个节点,目标集群是5个节点或者7个节点,假如是5个节点
  • 无非就是现在的5个主节点共同有 16384 个槽,原集群只有3个主节点和 16384 个槽
  • 可以把原集群这些槽全部都转移到一个节点上,目标集群也同样的操作
  • 将原集群这个节点的数据持久化之后复制给目标集群的对应的那一个节点
  • 让目标集群重新分片,这样就可以分散到 5 个节点上了
  • 最后检查下状态,迁移完毕

2 )使用迁移工具

  • 唯品会开源一个 redis-migrate-tool 的工具对Redis4版本以上支持不太友好
  • 阿里开源的一个 Redis-Shark 工具
  • 我们选择 Redis-Shark 工具来做集群的迁移

2.1 相关文档

  • Redis-Shark开源项目:https://github.com/alibaba/RedisShake
  • Redis-Shark中文文档:https://github.com/alibaba/RedisShake/wiki/
  • Redis-Shark官方编译包:https://github.com/alibaba/RedisShake/releases/
  • 从上面的地址中,把客户端下载下来安装
  • 还有一个 redis-full-check 的工具,在迁移完成后,要比较两个集群的数据

2.2 环境准备

源集群

IP端口
192.168.10.1016371、6372
192.168.10.1026373、6374
192.168.10.1036375、6376

Key 分布情况

192.168.10.101:6371 (afe0b393...) -> 210683 keys | 5461 slots | 1 slaves.
192.168.10.102:6373 (339e0d0b...) -> 9 keys | 5462 slots | 1 slaves.
192.168.10.103:6375 (f3353d11...) -> 3 keys | 5461 slots | 1 slaves.

目标集群

IP端口
192.168.10.1046371、6372
192.168.10.1056373、6374
192.168.10.1066375、6376

Key 分布情况

192,168.10.104:6371 (15d444c6...) -> 0 keys | 5461 slots | 1 slaves.
192.168.10.106:6375 (77772ed7...) -> 0 keys | 5461 slots | 1 slaves.
192.168.10.105:6373 (32069c23...)  -> 0 keys | 5462 slots | 1 slaves.

3.3 进行迁移

  • 将上述下载下来的Redis-Shark解压,并将 redis-shake.conf 配置文件重命名备份
  • 自己写一个 redis-shake.conf 的配置
    conf.version = 1
    id = redis-shake
    source.type = cluster
    source.address = 192.168.10.101:6371; 192.168.10.102:6373; 192.168.10.103:6375
    source.auth_type = auth
    source.password_raw =123456
    target.type = cluster
    target.address =192.168.10.104:6371; 192.168.10.105:6373; 192.168.10.106:6375
    target.auth_type = auth
    target.password_raw = 123456
    
  • 在上述文档中,有对应具体的意思
  • 开始迁移
    • $ ./redis-shake.linux -conf=redis-shake.conf -type=sync
    • 输出的日志为官方文档上的三个阶段
      • 1 )当代源端 save rdb
      • 2 ) 全量同步阶段,显示百分比
      • 3 )增量同步,出现字样 sync rdb done 后,当前 dbSyncer 进入增量同步
  • 迁移完成之后,可以在新集群check看下
  • 注意,redis-shake.linux 命令不终止还能起到监听作用,只要源集群数据有改动,就会同步

3.4 使用 RedisFullCheck 工具检查

  • 若要检查源和目标是否数据统一,还可选择阿里配套工具RedisFullCheck

  • 文档

    • RedisFullCheck开源项目:https://github.com/alibaba/RedisFullCheck
    • RedisFullCheck中文文档:https://github.com/alibaba/RedisFullCheck/wiki/
    • RedisFullCheck官方编译包:https://github.com/alibaba/RedisFullCheck/releases
  • 下载官方编译好的工具包,直接解压后就能使用。

  • $ tar -zxvf redis-full-check-1.4.8.tar.gz

  • 运行

    ./redis-full-check -s "192.168.10.101:6371; 192.168.10.102:6373; 192.168.10.103:6375" --sourcepassword=123456 -t "192.168.10.104:6371;192.168.10.105:6373;192.168.10.106:6375" --targetpassword=123456 --comparemode=1 --comparetimes=1 --qps=10 --batchcount=100 --sourcedbtype=1 --targetdbtype=1
    
    • -s 是 source 源
    • -t 是 target 目标
    • --comparemode 数据比较模式 1 是全量比较,文档上都有说明
    • --comparetimes 比较轮数
    • --qps 是限速阈值
    • --batchcount 批量聚合处理的数量
    • --sourceddbtype 源库的类型 0 是单机 1 是集群 2 是阿里云
    • --targetdbtype 目标库的类别
  • 运行之后,就给一个反馈结果,如果是 all finish successfully ... 则没有任何异常

相关文章:

Redis: 集群高可用之故障转移和集群迁移

故障转移 故障转移,包括自动故障转移和手动故障转移 1 )自动故障转移 Redis 集群,主节点挂了,从节点可以顶上来继续提供服务常用制造故障的两种方式 第一,对其中一个节点进行 SHUTDOWN 操作第二,kill 掉…...

记账软件在线、会计记账网站、财务记账官网、记账云、云记账、在线免费做账以及易舟云财务软件

记账软件在线、会计记账网站、财务记账官网、记账云、云记账、在线免费做账以及易舟云财务软件,以下是一些详细的介绍和推荐: 一、记账软件在线与会计记账网站 记账软件和会计记账网站是现代财务管理中不可或缺的工具,它们能够帮助企业或个人…...

Elasticsearch基础_3.基础操作

文章目录 一、索引操作1.1、创建索引1.2、删除索引 二、映射操作2.1、查看映射2.2、扩展映射 三、文档操作3.1、单条写入文档3.2、更新单条文档3.3、查看单条文档3.4、删除单条文档3.5、根据条件删除文档 一、索引操作 1.1、创建索引 PUT /${index_name} {"settings&quo…...

PHP永久性Cookie的含义

PHP中的永久性Cookie(也称为持久性Cookie)是指在用户的计算机上存储的一种持久性的HTTP Cookie。与常规的临时Cookie不同,永久性Cookie在浏览器关闭后依然保留,并且可以在用户下次访问该网站时被读取和使用。 主要特点 持久存储…...

瑜伽培训行业为何要搭建自己的专属知识付费小程序平台?集师知识付费系统 集师知识付费小程序 集师知识服务系统 集师线上培训系统

在当今快节奏的生活中,瑜伽作为一种舒缓压力、增强体质的生活方式,受到了越来越多人的青睐。瑜伽培训行业也随之蓬勃发展,但如何在激烈的市场竞争中脱颖而出,成为众多瑜伽培训机构面临的一大挑战。搭建自己的专属知识付费小程序平…...

FFT 分析进阶-笔记

FFT 分析进阶 边界不连续与泄漏效应解决方法增加窗函数海宁窗与哈布什窗混叠效应频率高到什么程度会出现混叠现象呢?那我们有办法去应对这个混叠吗?经典平均指数平均关于结果的显示模式FFT计算的三个常见的范例计算FFT图谱中某一段的总值,图中…...

毕业设计_基于springboot+layui+mybatisPlus的中小型仓库物流管理系统源码+SQL+教程+可运行】41004

毕业设计_基于springbootlayuimybatisPlus的中小型仓库物流管理系统源码SQL教程可运行】41004 下载地址: https://download.csdn.net/download/qq_24428851/89843203 技术栈 后端:springboot、mybatis-plus、shiro 前端:layUI 存储&…...

ROS基础入门——实操教程

ROS基础入门——实操教程 前言 本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记。 Ruby Rose,放在这里相当合理 本文初编辑于2024年10月4日 C…...

etcd 快速入门

简介 随着go与kubernetes的大热,etcd作为一个基于go编写的分布式键值存储,逐渐为开发者所熟知,尤其是其还作为kubernetes的数据存储仓库,更是引起广泛专注。 本文我们就来聊一聊etcd到底是什么及其工作机制。 首先,…...

Spring MVC__HttpMessageConverter、拦截器、异常处理器、注解配置SpringMVC、SpringMVC执行流程

目录 一、HttpMessageConverter1、RequestBody2、RequestEntity3、ResponseBody4、SpringMVC处理json5、SpringMVC处理ajax6、RestController注解7、ResponseEntity7.1、文件下载7.2、文件上传 二、拦截器1、拦截器的配置2、拦截器的三个抽象方法3、多个拦截器的执行顺序 三、异…...

GAMES101(19节,相机)

相机 synthesis合成成像:比如光栅化,光线追踪,相机是capture捕捉成像, 但是在合成渲染时,有时也会模拟捕捉成像方式(包括一些技术 动态模糊 / 景深等),这时会有涉及很多专有名词&a…...

Django Nginx+uwsgi 安装配置

Django Nginx+uwsgi 安装配置 本文将详细介绍如何在Linux环境下安装和配置Django应用程序,使用Nginx作为Web服务器和uwsgi作为应用程序服务器。我们将覆盖以下主题: 安装Python和相关库安装和配置Django安装Nginx安装和配置uwsgi配置Nginx以使用uwsgi测试和调试1. 安装Pytho…...

oracle数据备份和导入

一、数据导出 创建目录对象: CREATE DIRECTORY dpump_dir AS /path/to/your/directory;授予权限: GRANT READ, WRITE ON DIRECTORY dpump_dir TO test_user; #导出的用户导出全库数据 expdp your_user/your_password DIRECTORYdpump_dir DUMPFILEfu…...

C++ | Leetcode C++题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMinArrowShots(vector<vector<int>>& points) {if (points.empty()) {return 0;}sort(points.begin(), points.end(), [](const vector<int>& u, const vector<int>&…...

react-问卷星项目(3)

项目实战 React Hooks 缓存&#xff0c;性能优化&#xff0c;提升时间效率&#xff0c;但是不要为了技术而优化&#xff0c;应该是为了业务而进行优化 内置Hooks保证基础功能&#xff0c;灵活配合实现业务功能&#xff0c;抽离公共部分&#xff0c;自定义Hooks或者第三方&am…...

69 BERT预训练_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录NLP里的迁移学习Bert的动机Bert架构对输入的修改五、预训练任务1、2、3、 六、1、2、3、 七、1、2、3、 八、1、2、3、 NLP里的迁移学习 之前是使用预训练好的模型来抽取词、句子的特征&#xff0c;例如 word2vec 或语言模型这种非深度学习…...

Java报错输出的信息究竟是什么?

Java报错输出的信息究竟是什么&#xff1f; 本篇会带大家了解一下java运行时报错输出的信息内容&#xff0c;简单学习一下虚拟机内存中Java虚拟机栈的工作方式以及栈帧中所存储的信息内容 异常信息 当你的程序运行报错时&#xff0c;你是否会好奇打印出来的那一大坨红色的究竟…...

解表之紫苏

** 声明&#xff1a;本文介绍的中药仅供学习使用&#xff0c;请勿擅自使用&#xff0c;否则后果自负&#xff01;&#xff01;&#xff01;因水平有限&#xff0c;如有不当之处&#xff0c;请批评指正&#xff01;&#xff01;&#xff01;&#xff01;图片来源网络&#xff0…...

JavaScript数据类型

目录 JavaScripit数据类型 原始类型&#xff08;Primitive Types&#xff09; 1 Undefined 特点 实例 2 Null 实例 3 Boolean 重点&#xff1a; 常用falsy情况&#xff1a; 思考 4 Number,BigInt 实例 特点 NaN 5 String 在JavaScript中表示字符串有三种表示方…...

市场中的新兴力量与未来发展

在当前瞬息万变的全球金融市场中&#xff0c;期货交易以其高杠杆与灵活性&#xff0c;吸引了越来越多的投资者参与其中。大粤期货作为中国期货行业的新兴力量&#xff0c;凭借其创新的交易平台、广泛的产品线及专业的风险管理服务&#xff0c;迅速在市场中崭露头角。本文将介绍…...

Golang | Leetcode Golang题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; func numberOfArithmeticSlices(nums []int) (ans int) {f : make([]map[int]int, len(nums))for i, x : range nums {f[i] map[int]int{}for j, y : range nums[:i] {d : x - ycnt : f[j][d]ans cntf[i][d] cnt 1}}return }...

Java 常用序列化对比

Java 中常用的序列化方式主要包括以下几种: 1. Java 原生序列化 使用方式: 使用 java.io.Serializable 接口。对象需要实现该接口,然后通过 ObjectOutputStream 和 ObjectInputStream 进行序列化和反序列化。 示例代码: import java.io.*;public class Person impleme…...

【redis学习篇1】redis基本常用命令

目录 redis存储数据的模式 常用基本命令 一、set 二、keys pattern keys 字符串当中携带问号 keys 字符串当中携带*号 keys 【^字母】 keys * 三、exists 四、del 五、expire 5.1 ttl命令 5.2key删除策略 5.2.1惰性删除 5.2.2定期删除 六、type key的数据类型…...

量子计算:颠覆未来计算的革命性技术

量子计算&#xff1a;颠覆未来计算的革命性技术 量子计算作为下一代颠覆性技术&#xff0c;正在引领计算领域的重大变革。与传统计算机基于比特的二进制运算不同&#xff0c;量子计算通过量子比特&#xff08;qubits&#xff09;在叠加态和纠缠态下实现并行计算&#xff0c;能…...

ctfshow-web入门(信息收集,持续更新中。。)

写在之前:近期打了个比赛,备受打击,入手了vip账号进修,加油! 文章目录 ctfshow-web1查看源代码ctfshow-web2burp抓包ctfshow-web3burp抓包ctfshow-web4访问robots.txtctfshow-web5dirscarch扫描PHPS文件泄露ctfshow-web6dirscarch扫描ctfshow-web7dirscarch扫描ctfshow-w…...

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC

蓝桥杯【物联网】零基础到国奖之路:十五. 扩展模块之双路ADC 第一节 硬件解读第二节 CubeMX配置第三节 代码编写 第一节 硬件解读 STM32的ADC是12位&#xff0c;通过硬件过采样扩展到16位&#xff0c;模数转换器嵌入到STM32L071xx器件中。有16个外部通道和2个内部通道&#xf…...

李飞飞谈AI+3D发展:3D/4D AI将成为下一个重要前沿

人工智能(AI)的发展已经深刻改变了我们的世界,从简单的图像识别到复杂的自然语言处理,再到如今正在兴起的生成式模型。在这个过程中,李飞飞教授认为,3D/4D AI技术将是推动下一波变革的关键力量。以下根据她的观点整理了AI发展历程中的关键里程碑以及对3D/4D AI未来发展的…...

centos72009源码编译R语言

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Dhadoop.version3.4.0 -Pkubernetes spark3.5.3 源码版本 ./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -P…...

初识算法 · 双指针(4)

目录 前言&#xff1a; 复写零 题目解析 算法原理 算法编写 四数之和 题目解析 算法原理 算法编写 前言&#xff1a; 本文是双指针算法的最后一文&#xff0c;以复写零和四数之和作为结束&#xff0c;介绍方式同样是题目解析&#xff0c;算法原理&#xff0c;算法编写…...

java版鸿鹄电子招投标系统功能架构设计 核心功能设计 鸿鹄电子招投标采购系统源码

java版鸿鹄电子招投标系统功能架构设计 核心功能设计 鸿鹄电子招投标采购系统源码...