今天看啥  ›  专栏  ›  陶老师运维笔记

Redis迁移方法介绍

陶老师运维笔记  · 掘金  ·  · 2020-04-14 16:40
阅读 11

Redis迁移方法介绍

Redis迁移方法介绍

1. Redis迁移介绍

工作中有时会遇到需要把原Redis集群下线,迁移到另一个新的Redis集群的需求(如机房迁移,Redis上云等原因)。此时原Redis中的数据需要如何操作才可顺利迁移到一个新的Redis集群呢? 本节简单介绍相关方法及一些工具。

redis有主从架构及redis-cluster架构,架构不同,两者的迁移方法也是不相同的。

2. Redis主从迁移

若原来的redis集群为主从结构,则迁移工作是相当简单方便的。可使用slaveof迁移或aof/rdb迁移数据。

  • slaveof : 利用slaveof制作新的从库,从而达到数据迁移的目的。
  • aof迁移: 暂停写服务,把aof文件导出到新的redis机群中完成数据迁移。

2.1 slaveof同步数据

如下示例:将把原来redis_master 192.124.64.212:6379迁移到新redis_master 192.124.64.214:6380

#旧 redis_master 192.124.64.212:6379 --> 新redis_master 192.124.64.214:6380
1.数据同步
$redis-cli -h redis_master_new 6380 slaveof redis_master_old 6379
$redis-cli -h 192.124.64.214 6380 slaveof 192.124.64.212 6379

2.修改新read-only配置为no.

修改新redis的read-only配置为no,新的redis可以写数据。否则会出错.
$redis-cli -h 192.124.64.214 -p 6380 -a pwd123 set foo bar
(error) READONLY You can't write against a read only slave

查看当前slave-read-only配置
$redis-cli -h 192.124.64.214 -p 6380 -a pwd123 config  get slave-read-only
1) "slave-read-only"
2) "yes"

$redis-cli -h 192.124.64.214 6380 config set slave-read-only no
$redis-cli -h 192.124.64.214 6380 config get slave-read-only

3. 业务停止对原redis停写.

4. 业务变更redis配置,重启web服务
   业务修改redis配置为新的redis地址,并重启web服务。

5. 检查新/旧redis链接情况
旧redis:
redis-cli -h 192.124.64.212 -p 6379 -a pwd123 info clients
connected_clients:1
redis-cli -h 192.124.64.212 -p 6379 -a pwd123  client list
redis-cli -h 192.124.64.212 -p 6379 -a pwd123  client list  |awk -F'addr=' '{print $2}' | awk '{print $1}'|awk -F':' '{print $1}'|sort |uniq -c|sort -nr 
      1 192.124.64.214
新redis: 
redis-cli -h 192.124.64.214 -p 6380 -a pwd123 info clients
redis-cli -h 192.124.64.214 -p 6380 -a pwd123 dbsize

6.断开同步
redis-cli -h 192.124.64.214 -p 6380 info |grep role
redis-cli -h 192.124.64.214 -p 6380 slaveof NO ONE
OK
redis-cli -h 192.124.64.214 -p 6380 info |grep role
role:master

7. 测试业务情况(略)

复制代码

2.2 aof同步数据

若是原来的redis可以暂停写操作,则咱们用aof来同步数据也很方便。

#旧redis导出aof文件
$redis-cli -h old_instance_ip -p old_instance_port config set appendonly yes
$redis-cli -h old_instance_ip -p old_instance_port configconfig get appendonly
1) "appendonly"
2) "yes"
#aof文件导入到新的redis
$redis-cli -h new_redis_instance_ip -p 6379 -a password --pipe < appendonly.aof
#导入完成后,关闭原redis AOF
$redis-cli -h old_instance_ip -p old_instance_port config set appendonly no
复制代码

slaveof及aof迁移对比:

  • slaveof 会把目标redis库上当前的key全部清除,这点要注意。
  • 当redis数据量较大时使用slaveof xxx,会给master带来较大的压力。最好业务低峰时间处理。
  • aof迁移数据可以保留新redis上已存在的数据,这点不同于slaveof。
  • aof不能实时同步,所以迁移期间的redis增量数据不能同步,故常需要把原来的redis停写操作。

3. Redis集群迁移

3.1 Redis-cluster介绍

Redis-cluster是 redis 的一个分布式实现,cluster将数据存储到多个不同Redis实例中,解决了单机Redis容量有限的问题。并且Redis-cluster某个节点故障时,若此节点有可用的从库,则redis-cluster将可以继续处理请求,从而实现了redis的高可用。

redis-cluster

3.2 Redis-cluster迁移

方法1: 集群节点增删实现 把Redis新节点逐台加入当前集群,变成一个大集群。 然后进行手动failover,最后下线原主库节点。

说明: 要注意的是在需要故障转移的slave节点上执行,否则报错:(error) ERR You should send CLUSTER FAILOVER to a slave

#redis-cli -h 192.124.64.212 -p 6301 -a pwd123 -c cluster nodes |grep master  |sort -k 9n   
#redis-cli -h 192.124.64.212 -p 6301 -a pwd123 -c cluster nodes |grep slave  |sort -k 9n
#/usr/local/redis-5.0.6/bin/redis-cli --cluster info 192.124.64.212:6301 -a pwd123 
#/usr/local/redis-5.0.6/bin/redis-cli --cluster check 192.124.64.212:6301 -a pwd123

redis-cli -h 新加的从库节点 -p 6301 -a pwd123 cluster failover

复制代码

方法2:迁移工具实现 若场景是希望原机群暂时保留如下图,即同时有两个独立的集群,则就无论使用方法1。

Redis迁移
Redis-Cluster是由多个redis实例组成的集群,无法直接使用slave of 命令把redis-cluster-B变成redis-cluster-A的从库。

redis-cluster迁移:

  • 若是业务可以中断,可停止Cluster-A 写操作,把Redis rdb/aof文件传输到新的Cluster-B机群再重启服务。
  • 使用某些redis数据迁移工具来迁移redis-cluster数据。

4. Redis迁移工具

常见redis迁移工具网址:

  • redis-dump: redis-dump 是一个将redis数据导入/导出为json格式数据的小工具。
  • redis-port : 最初是 codis 项目相关工具,支持实时同步 redis 数据到 codis/redis等中。
  • redis-migrate-tool: 是唯品会开源的redis数据迁移工具,可用于异构redis集群间的数据在线迁移。
  • redis-shake : 是阿里云的redis数据同步的工具。支持redis主从->redis-cluster,cluster-cluster等多种redis架构的数据同步。

redis-dump:

redis-dump可以方便的把一个redis实例的数据导出来(不是redis-cluster的数据)。redis-dump命令需要用到keys命令,若是rename此命令,则redis-dump将会出错。

#把192.124.64.212:6379 数据导到192.124.64.214:6380。 
$redis-dump -u :pwd123@192.124.64.212:6379 |  redis-load -u :pwd123@192.124.64.214:6380 
#
$redis-dump -u :pwd123@192.124.64.212:6379
{"db":0,"key":"foo","ttl":-1,"type":"string","value":"bar","size":3}
#keys不可用将出错
$redis-dump -u :pwd123@192.124.64.212:6379>redis_6379.json
ERR unknown command 'keys'
复制代码

redis-port/redis-migrate-tool/ redis-shake : 这几个工具功能相近,可支持redis的实时数据同步。本文以redis-shake来重点介绍。




原文地址:访问原文地址
快照地址: 访问文章快照