讲到redis的迁移,一般会使用rdb或者aof在主库做自动重载到目标库方法。但该方法有个问题就是无法保证源节点数据和目标节点数据保持一致,一般线上环境也不允许源库停机,所以要在迁移过程后还要实现同步达到数据的一致性。公司线上环境使用的是redis自己的cluster,每个节点都拥有多个rdb和aof文件,使用原始方法无疑是难上加难。本文主要讨论两种方法来实现不停机源库前提下,实现源库(redis cluster)到目标库(cluster或者单实例)的迁移:
  • 采用redis replication实现
  • 使用开源同步开源工具
方法一:通过redis复制机制,将目标节点作为源节点的从节点,然后关闭源节点,进行主从自动fail over,最后再关闭并删除源节点实例
1.运行环境:
源节点实例:127.0.0.1:12000/127.0.0.1:12001/127.0.0.1:12002
[root@10_86_30_37_10.86.30.37 mycluster_export1]# redis-cli -p 12000 cluster nodes
e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea 127.0.0.1:12000 myself,master - 0 0 1 connected 0-5000
f63f0d52372ad8b5c414c47e9318717b6aa113cc 127.0.0.1:12001 master - 0 1463025774035 2 connected 5001-10000
fdeb68f696290a91f08a5da3b8a3c585aaa35856 127.0.0.1:12002 master - 0 1463025775037 0 connected 10001-16383
迁移目标节点实例:
127.0.0.1:13000/127.0.0.1:13001/127.0.0.1:13002
2.迁移过程
  • 启动三个目标节点,配置了redis集群模式的实例
redis-server redis13000.conf
redis-server redis13001.conf
redis-server redis13002.conf
  • 将这三个节点做已有集群实例的slave
redis-cli -p  cluster meet 127.0.0.1
redis-cli -p cluster replicate e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea
redis-cli -p cluster meet 127.0.0.1
redis-cli -p cluster replicate f63f0d52372ad8b5c414c47e9318717b6aa113cc
redis-cli -p cluster meet 127.0.0.1
redis-cli -p cluster replicate fdeb68f696290a91f08a5da3b8a3c585aaa35856
  • 查看集群情况:
redis-cli -p  cluster slots
) ) (integer)
) (integer)
) ) "127.0.0.1"
) (integer)
) ) "127.0.0.1"
) (integer)
) ) (integer)
) (integer)
) ) "127.0.0.1"
) (integer)
) ) "127.0.0.1"
) (integer)
) ) (integer)
) (integer)
) ) "127.0.0.1"
) (integer)
) ) "127.0.0.1"
) (integer)
  • 将其中一个主节点下线,10s后观察情况:
redis-cli -p  shutdown
redis-cli -p cluster nodes
fdeb68f696290a91f08a5da3b8a3c585aaa35856 127.0.0.1: master - connected -
f63f0d52372ad8b5c414c47e9318717b6aa113cc 127.0.0.1: master - connected -
e39a73c30dfff3139242e66f8e0a41178b39e280 127.0.0.1: myself,master - connected -
1f552bdea453caeaa64b4b33a05e4eedeb3f3dd2 127.0.0.1: slave f63f0d52372ad8b5c414c47e9318717b6aa113cc connected
6a70a82c6f07dc4e61a97b6aee7a2994365642cc 127.0.0.1: slave fdeb68f696290a91f08a5da3b8a3c585aaa35856 connected
e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea 127.0.0.1: master,fail - disconnected
  • 删除已经下线的主节点,一个一个操作,操作中间检查操作是否成功,因为留言协议和failover需要一段时间
redis-cli -p  cluster forget e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea
redis-cli -p cluster forget e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea
redis-cli -p cluster forget e5ce695f7c5745ca81b4239fb5666b6a71fbb4ea
redis-cli -p cluster nodes
fdeb68f696290a91f08a5da3b8a3c585aaa35856 127.0.0.1: master - connected -
f63f0d52372ad8b5c414c47e9318717b6aa113cc 127.0.0.1: master - connected -
e39a73c30dfff3139242e66f8e0a41178b39e280 127.0.0.1: myself,master - connected -
1f552bdea453caeaa64b4b33a05e4eedeb3f3dd2 127.0.0.1: slave f63f0d52372ad8b5c414c47e9318717b6aa113cc connected
6a70a82c6f07dc4e61a97b6aee7a2994365642cc 127.0.0.1: slave fdeb68f696290a91f08a5da3b8a3c585aaa35856 connected redis-cli -p cluster nodes
e39a73c30dfff3139242e66f8e0a41178b39e280 127.0.0.1: myself,master - connected -
1f552bdea453caeaa64b4b33a05e4eedeb3f3dd2 127.0.0.1: slave - connected
6a70a82c6f07dc4e61a97b6aee7a2994365642cc 127.0.0.1: slave - connected
3.重点细节:
  • 删除的主节点,如果重新启动,他自身会重新加载集群配置文件,造成集群混乱,建议如果想重启该实例,删掉集群配置文件,进行重新配置。
  • 必须先关闭master节点后,再删除。一次不能将所有实例都关闭,逐个操作,否则会造成整个集群down掉
  • 删除forget节点时,要在所有其他节点上执行cluster forget 命令,貌似这个命令不会通过留言协议传播到所有节点

redis集群同步迁移方法(一):通过redis replication实现的更多相关文章

  1. redis集群同步迁移方法(二):通过redis-migrate-tool实现

    前篇介绍的redis replication方法,操作步骤多,而且容易出错.在git上看到一些开源工具也能实现同步迁移功能,而且步骤简单,比如redis-port,redis-migrate-tool ...

  2. Spring集成Redis集群(含spring集成redis代码)

    代码地址如下:http://www.demodashi.com/demo/11458.html 一.准备工作 安装 Redis 集群 安装参考: http://blog.csdn.net/zk6738 ...

  3. Redis集群迁移

    1:开发中断程序,登录各个主节点查看key信息 INFO # Keyspace db0:keys,expires,avg_ttl # Keyspace db0:keys,expires,avg_ttl ...

  4. Redis集群同步问题

    之前被面试官问到:Redis集群中主从数据同步是从库异步读取主库,那么Redis集群其他主与主之间的数据是怎么共享的呢?或者说是怎么同步的? emmmm……当时我就懵逼了,这不是考试范围啊卧槽~只能老 ...

  5. springBoot2.*使用redis集群/单机方法

    在springboot1.x系列中,其中使用的是jedis,但是到了springboot2.x其中使用的是Lettuce. 此处springboot2.x,所以使用的是Lettuce.关于jedis跟 ...

  6. Redis集群(二):Redis的安装

    官方网站:http://redis.io/ 本系列撒使用的版本是:3.0.0 一.安装必要包 yum -yinstall gcc 二.linux下安装及使用(wget下载到当前目录) redis-3. ...

  7. <正则吃饺子> :关于redis集群的搭建、集群测试、搭建中遇到的问题总结

    项目中使用了redis ,对于其基本的使用,相对简单些,根据项目中已经提供的工具就可以实现基本的功能,但是只是这样的话,对于redis还是太肤浅,甚至刚开始时候,集群.多节点.主从是什么,他们之间是什 ...

  8. Redis集群搭建的三种方式

    一.Redis主从 1.1 Redis主从原理 和MySQL需要主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生性能瓶颈,特别是在读压力上,为了分担压力,Redis支持主从复制. ...

  9. redis集群数据迁移

    redis集群数据备份迁移方案 n  迁移环境描述及分析 当前我们面临的数据迁移环境是:集群->集群. 源集群: 源集群为6节点,3主3备 主 备 192.168.112.33:8001 192 ...

随机推荐

  1. [原] wmic: Invalid XSL format (or) file name错误解决方法

    之前运行wmic命令正确,今天在服务器上出现Invalid XSL format (or) file name的提示,搜索了一下,在这里找到了答案: http://www.ctkn.net/2011/ ...

  2. 2016-12-15 java开发工作中,尚未做的工作

    目前未涉及的工作内容: 1.将静态页导入工程,建成jsp文件.配置css.js.img文件.跳转路径 2.未用工具生成pojo dao service等源码文件 3.未签入自己写的代码 4.未搭建子系 ...

  3. 怎样让SoapHttpClientProtocol不使用系统默认代理

    方法很简单,但找起来很难. 使用SoapHttpClientProtocol类的Proxy属性. 不能设空值,必须设一个新值. 赶脚底层在链接的时候会判断这个属性是不是null,如果null就会用默认 ...

  4. IOS开发之--NSPredicate

    我把常用的NSPredicate使用场景整理了一下   官方参考: https://developer.apple.com/library/mac/#documentation/Cocoa/Refer ...

  5. Android ShapeDrawable无法上色

    在Android中的View设置背景时,使用ShapeDrawable有可能出现无法上色的问题(最终背景为黑色),例如,使用如下的代码为控件设置颜色时,控件背景将会变成黑色 ShapeDrawable ...

  6. 黄聪:解决Web部署 svg/woff/woff2字体 404错误

    问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...

  7. 使用 Linq 对多个对象进行join操作 C#

    class A { public int id { get; set; } public string name { get; set; } } class B { public int id { g ...

  8. 代码管理 – SVN

    代码管理工具也用了不少年了,整理下. 管理工具比较 用过VSS,CVS,TFS,SVN还有一个微软内部使用的不记得什么名字了.这里进行一些简单比较,重点介绍SVN的用法. CVS历史悠久,1986年就 ...

  9. 【webpy开发实战】webpy的cookbook 个人版

    版本:webpy0.3 问题1.1 所需软件及环境配置? 解决办法 sqlite: jinja2:找不到jinja2模块时,将jinja模块文件夹加入 sys.path  -> sys.path ...

  10. oracle ||,

    || oracle数据库中的 ||称为 "字符串连接符" 用于连接查询结果,如下: select trade_id,accept_date from A; ------------ ...