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 ... 则没有任何异常

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

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

相关文章

Java之方法

方法&#xff08;函数&#xff09; Java中的方法必须定义在类或接口中。 package day2;import java.util.Scanner;public class way {public static void main(String[] args) {int arr[] new int[5];Scanner sc new Scanner(System.in);for (int i 0; i < arr.length;…

五、创建型(建造者模式)

建造者模式 概念 建造者模式是一种创建型设计模式&#xff0c;通过使用多个简单的对象一步步构建一个复杂的对象。它将一个复杂对象的构建过程与其表示分离&#xff0c;从而使同样的构建过程可以创建不同的表示。 应用场景 复杂对象构建&#xff1a;当一个对象有多个属性&…

vue2项目的路由使用history模式,刷新会导致页面404的问题

在vue2项目中&#xff0c;如果我们使用的路由是history模式&#xff0c;刷新会导致页面404&#xff0c;解决方法很简单&#xff0c;在vue.config.js文件中的devServer下增加historyApiFallback: true; 代码如下: module.exports {devServer: {historyApiFallback: true,} }

【js逆向学习】极志愿 javascript+python+rpc

JSRPC使用方式 逆向目标逆向过程逆向分析1、什么是 websocket2、websocket的原理3、总体过程3.1 环境说明3.2 python服务端代码3.3 python客户端代码 4、Sekiro-RPC4.1 执行方式4.2 客户端环境4.3 参数说明4.4 SK API4.5 python代码调试4.6 代码注入流程 逆向总结 逆向目标 网…

AI资深导师指导-ChatGPT深度科研工作应用、论文撰写、数据分析及机器学习与AI绘图

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

太速科技-607-基于FMC的12收和12发的光纤子卡

基于FMC的12收和12发的光纤子卡 一、板卡概述 本卡是一个FPGA夹层卡&#xff08;FMC&#xff09;模块&#xff0c;可提供高达2个CXP模块接口&#xff0c;提供12路收&#xff0c;12路发的光纤通道。每个通道支持10Gbps,通过Aurora协议&#xff0c;可以组成X4&#xff0…

LivePortrait:创新的肖像动画技术与深度伪造的预防措施

文章链接&#xff1a;https://arxiv.org/pdf/2407.03168 代码仓库&#xff1a;https://liveportrait.github.io 在数字媒体和娱乐领域&#xff0c;将静态肖像照片转换成动态视频是一个引人入胜的话题。最近&#xff0c;由快手科技的研究团队发表在arXiv上的一篇论文介绍了一种…

MySQL 中的 GROUP BY 使用

MySQL 中的 GROUP BY 使用指南 GROUP BY 是 SQL 中一个非常强大的语句&#xff0c;用于将查询结果按指定的列进行分组&#xff0c;并对每个分组执行聚合函数。它常常与聚合函数&#xff08;如 COUNT、SUM、AVG、MIN 和 MAX&#xff09;结合使用&#xff0c;以生成汇总信息。 …

有千元以内的高性价比自动猫砂盆吗?双十一必看选购攻略!

对于经常外出的铲屎官来说&#xff0c;自动猫砂盆真的是一个必需品&#xff0c;不仅仅是上班出差&#xff0c;节假日旅游出行&#xff0c;小到外出逛街&#xff0c;大到五六天&#xff0c;自动猫砂盆都能完美解决猫屎残留在猫砂盆里无人照料的问题&#xff0c;毕竟猫屎放久了&a…

SpringBoot框架下旅游管理系统的创新设计与实现

第二章 相关技术简介 2.1 JAVA技术 本次系统开发采用的是面向对象的Java作为软件编程语言&#xff0c;Java表面上很像C&#xff0c;但是Java仅仅是继承了C的某些优点&#xff0c;程序员很少使用的C语言的特征在Java设计中去掉了。Java编程语言并没有什么结构&#xff0c;它把数…

【C语言系统编程】【第一部分:操作系统知识】1.3.实践与案例分析

1.3 实践与案例分析 1.3.1 案例分析&#xff1a;实现一个简单的Shell 本节将通过一个简单的Shell程序来展示如何使用C语言中的高级操作系统功能&#xff0c;包括命令行解析、进程管理&#xff08;fork和exec&#xff09;、管道和重定向。 1.3.1.1 解析命令行输入 在实现She…

Java | Leetcode Java题解之第461题汉明距离

题目&#xff1a; 题解&#xff1a; class Solution {public int hammingDistance(int x, int y) {int s x ^ y, ret 0;while (s ! 0) {s & s - 1;ret;}return ret;} }

图论day56|广度优先搜索理论基础 、bfs与dfs的对比(思维导图)、 99.岛屿数量(卡码网)、100.岛屿的最大面积(卡码网)

图论day56|广度优先搜索理论基础 、bfs与dfs的对比&#xff08;思维导图&#xff09;、 99.岛屿数量&#xff08;卡码网&#xff09;、100.岛屿的最大面积&#xff08;卡码网&#xff09;&#xff09; 广度优先搜索理论基础bfs与dfs的对比&#xff08;思维导图&#xff09;&…

音视频入门基础:FLV专题(12)——FFmpeg源码中,解析DOUBLE类型的ScriptDataValue的实现

一、引言 从《音视频入门基础&#xff1a;FLV专题&#xff08;9&#xff09;——Script Tag简介》中可以知道&#xff0c;根据《video_file_format_spec_v10_1.pdf》第80到81页&#xff0c;SCRIPTDATAVALUE类型由一个8位&#xff08;1字节&#xff09;的Type和一个ScriptDataV…

电影选票选座系统|影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)

电影院订票选座小程序 目录 基于微信小程序的电影院购票系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能实现 2、管理员功能实现 &#xff08;1&#xff09;影院信息管理 &#xff08;2&#xff09;电影信息管理 &#xff08;3&#xff09;已完成…

Linux 环境chrony设置服务器间时间同步一致

服务器&#xff1a; master01: slave02: slave03: 安装chrony安装&#xff1a; yum -y install chrony 设置以master01为时间服务器&#xff0c;其他服务器同步master01时间 master01的chrony.conf配置: server ntp1.aliyun.com iburst allow all local stratum 10重启ch…

VUE 开发——Vue学习(二)

一、watch侦听器 作用&#xff1a;监视数据变化&#xff0c;执行一些业务逻辑或异步操作 简单写法 <div id"app"><textarea v-model"words"></textarea></div><script>const app new Vue({el:#app,data: {words: },watch…

在北京能不能设计一款可以多屏展示的调度桌

在北京这座科技与创新并蓄的国际大都市&#xff0c;设计一款集高效、智能与多屏展示功能于一体的调度桌&#xff0c;不仅是一个技术挑战&#xff0c;更是对未来工作场景的一次深刻探索与重塑。那么&#xff0c;在北京能不能设计一款可以多屏展示的调度桌呢? 随着信息技术的飞速…

AI产品经理指南:我是谁,从哪来,到哪去|对谈字节AI产品负责人Vanessa,面试了100位AI产品经理后的心得总结

AI 正在改变各行各业&#xff0c;或许首当其冲受到影响的就包括离 AI 最近的一群人——产品经理。 Vanessa 在字节负责 AI 产品工作&#xff0c;我们从「面试了 100 位 AI 产品经理」的心得总结开始&#xff0c;聊了聊究竟什么是「AI 产品经理」&#xff1f;Vanessa资深的产品经…

docker-compose查看容器日志和实时查看日志

要查看 docker-compose up 过程中容器启动的错误日志&#xff0c;可以使用以下方法&#xff1a; ### 1. **使用 docker-compose logs 命令** 1. 在终端中进入包含 docker-compose.yml 文件的目录。 2. 运行以下命令来查看所有容器的日志&#xff1a; bash docker-compose…