Redis异构集群数据在线迁移工具Redis-Migrate-Tool【转】
摘要:Redis-Migrate-Tool(后面都简称RMT),是唯品会开源的redis数据迁移工具,主要用于异构redis集群间的数据在线迁移,即数据迁移过程中源集群仍可以正常接受业务读写请求,无业务中断服务时间。这篇blog主要内容包括工具特性简介、使用方法以及注意的要点。关于实现的原理,可以自行阅读源码理解或者联系我们交流。
目前该项目已经开源在GitHub上(https://github.com/vipshop/redis-migrate-tool 链接入口可点击原文阅读)。
一、RMT特性
1、异构集群相互之间的迁移
支持下面几种异构集群之间的数据迁移和同构集群扩容/缩容。
1)单个redis到twemproxy/cluster迁移;
2)twemproxy到twemproxy/cluster迁移;
3)cluster到twmeproxy/cluster迁移。
2、在线迁移
RMT启动后模拟成redis slave,请求master的全量数据和增量数据。RMT收到数据之后解析成redis协议格式的oplog(写操作),然后发送给目标集群。有两种请求方式,source_safe: true,对于同一ip上的redis,逐个的请求全量数据(RDB);source_safe: false,并行请求同步全量数据。source_safe: false时,需要注意多个源redis所在的同一主机是否有足够的内存 和 RDB 并发落盘时的 IOPS 性能。
3、从AOF 或 RDB恢复数据
如果在线集群数据全部丢失,不要方,RMT可以帮你从备份的 AOF 和 RDB 文件恢复到目标集群。
4、数据过滤
可以过滤算法上不属于源集群的脏数据,比如有人绕过twemproxy,非正常方式直接向后端redis写入数据。还可以在配置文件[common]中使用filter参数,过滤掉不需要的数据。
二、使用方法
下面手把手教你使用 RMT,包括安装、配置、监控还有业务在线切换方式。
1、RMT安装
github开源地址:https://github.com/vipshop/redis-migrate-tool
安装:
生成的执行文件在src目录下,使用"-h"选项查看使用方法。
2、RMT配置文件
RMT的配置主要由三部分组成,数据源[source],目标集群[target],通用配置部分[common]。
RMT对源集群的类型并不敏感,对每个redis节点伪装成一个slave。因而 twemproxy和cluster集群,可以使用 single 和 cluster 类型。建议配置成对应的 twemproxy 或者 cluster类型。有两方面作用:1)RMT在数据迁移时,可以根据 twemproxy(hash)或者cluster(slots)数据分布规则,过滤掉原本不属于该节点的数据;2)当源集群类型是cluster时,只用配置一个节点,简化配置。
目标集群,因为不同数据分布规则需要执行不同的写入逻辑,因而配置非常严谨。特别是tw集群,迁移到目标集群的server配置需要和twemproxy中保持一致,包括hash算法、数据分布算法、节点的ip和port、权重、节点的名字。
部分配置下面会详细讲解,完整配置请参考github(https://github.com/vipshop/redis-migrate-tool#configuration)。
2.1、redis/twemproxy到twemproxy
[source]和[taget] 由集群类型type和redis节点server组成。[source] type可以支持single/twemproxy/cluster/aof file/rdb file 五种类型。[target]中的type支持single/twemproxy/cluster/rdb file 四种类型。
对于twemproxy集群,必须设置 hash、distribution、servers等参数,而且和目标集群的twemproxy一模一样(敲黑板)。前几天,有某站公司的朋友问,RMT迁移之后,存在数据读取不到,0.0。了解之后,发现是 target部分和twemproxy配置不一致导致。这也是写这篇 使用文档初衷和动力,怕坑到更多使用这个开源软件的朋友。
在[common]中,一些参数主要作用如下,其他参数参考GitHub(https://github.com/vipshop/redis-migrate-tool#common)
2.2、cluster集群到cluster集群迁移
[source] 和 [target]只需配置集群的一个节点。当然[source]部分cluster也可以配置成如下形式。
2.3、cluster到twemproxy的迁移
twemproxy 到 cluster的迁移,作为练习题,你们自己测试吧
2.4、从AOF 和 RDB中恢复数据
3、RMT迁移
使用下面的命令就可以开始迁移数据
4、观察迁移状态
使用redis-cli可以连接 rmt.conf 中配置的端口,执行info命令,就可以观察迁移的状态。
total_msgs_outqueue可以判断是否有oplog在队列中等待处理,如果total_msgs_outqueue>0,请继续等待。
5 RMT检验源集群和目标集群的差异
在业务切换到目标服务器之前,可使用 RMT 抽样检查数据的一致性,默认抽样1000个key。
6 如何完成业务切换?
如果是异构集群的迁移,更改redis驱动/客户端和修改代码,重新发布是必然的事情。如果是同构集群,做配置发布就可以。如果没有做重启发布,等待源集群没有连接之后,可以关闭RMT进程(kill)。或者重启应用,强制断开长连接。
三、注意事项
1、重要的事说三遍,RMT迁移数据到twemproxy,需要保持rmt.conf 中 [target] hash、distribution、servers 三个参数和目标集群的twemproxy配置严格一致。
2、迁移中和业务切换之前,请反复观察“-o rmt.log”日志信息,确认是否有异常。
3、业务切换之前,请充分检查,特别是数据的一致性。
4、RMT 建议部署在单独空闲机器上,同目的集群在同一个网段(跨机房迁移数据,可以提高迁移速度)。千万不要部署在源集群所在的机器,防止资源不足,比如内存,带宽,IOPS。
5、注意RDB传输是否超时;
6、redis client buf中的slave项,设置足够大的buffer size和超时时间。
Redis异构集群数据在线迁移工具Redis-Migrate-Tool【转】的更多相关文章
- 【Redis】集群数据迁移
Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384. 在集群节点对应的结构体变量clusterNode中可以看到s ...
- spring boot:使用redis cluster集群作为分布式session(redis 6.0.5/spring boot 2.3.1)
一,为什么要使用分布式session? HpptSession默认使用内存来管理Session,如果将应用横向扩展将会出现Session共享问题, 所以我们在创建web集群时,把session保存到r ...
- Redis分布式集群几点说道
原文地址:http://www.cnblogs.com/verrion/p/redis_structure_type_selection.html Redis分布式集群几点说道 Redis数据量日益 ...
- Redis Cluster集群知识学习总结
Redis集群解决方案有两个: 1) Twemproxy: 这是Twitter推出的解决方案,简单的说就是上层加个代理负责分发,属于client端集群方案,目前很多应用者都在采用的解决方案.Twem ...
- centos6下redis cluster集群部署过程
一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...
- Redis之集群环境搭建
前面文章介绍了Redis的主从复制,虽然该模式能够在一定程度上提高系统的稳定性,但是在数据访问量比较大的情况下,单个master应付起来还是比较吃力的,这时我们可以考虑将redis集群部署,本文就来重 ...
- redis cluster 集群畅谈(二)
上一篇http://www.cnblogs.com/qinyujie/p/9029482.html, 主要讲解 redis cluster 集群 搭建,本篇主要讲解实验多master写入.读写分离.实 ...
- Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)
前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...
- K8S部署Redis Cluster集群
kubernetes部署单节点redis: https://www.cnblogs.com/zisefeizhu/p/14282299.html Redis 介绍 • Redis代表REmote DI ...
随机推荐
- 配置tomcat的session共享
可通过下面方法限制一个用户访问一个服务器之后就只在该服务器上操作. 请求负载过程中会话信息不能丢失.那么在多个tomcat中session需要共享. 配置tomcat的session共享可以有三种解决 ...
- Linux命令-文件搜索命令:locate
实际上是在分区表上搜索文件,比find命令速度更快 locate inittab 查找名称包含inittab的所有信息(快速搜索,实际上它是搜索linux资料库,区别于find在某一个磁盘分区或者某一 ...
- List多个字段标识过滤
class Program { public static void Main(string[] args) { List<T> list = new List<T>(); ...
- jQuery开发插件的两种方式
最近挺多人写jQuery的,都是关于jQuery扩展方面的,使用方面的讲的比较多,但是关于详细的一个基础的过程讲的比较少一点,做web开发的基本上都会用到jQuery,本人就根据jQuery的使用经验 ...
- C#:向SqlServer数据库中插入imange类型
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...
- BZOJ 1603 [Usaco2008 Oct]打谷机 dfs
题意:id=1603">链接 方法:暴力 解析: 搜1到n路径上的边权异或和-. 这几个水题刷的我有点-.. 代码: #include <cstdio> #include ...
- C++多态有哪几种方式?
C++多态方式: (1)静态多态(重载,模板) 是在编译的时候,就确定调用函数的类型. (2)动态多态(覆盖,虚函数实现) 在运行的时候,才确定调用的是哪个函数,动态绑定.运行基类指针指向派生类的对象 ...
- 解决CentOS7 无法启动mysql 的解决办法
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方 ...
- Object-C中的数字对象
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- 编写每天定时切割Nginx日志的脚本
自动每天定时切割Nginx日志的脚本,很方便很好用,推荐给大家使用.本脚本也是参考了张宴老师的文章,再次感谢张宴老师.1.创建脚本/usr/local/nginx/sbin/cut_nginx_log ...