Redis&Pika单机及主从数据迁移方案

Posted zhaochunxue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis&Pika单机及主从数据迁移方案相关的知识,希望对你有一定的参考价值。

前言:如果同步过程中发现数据量不一致,先不要断开主从,分析一下每日进redis的数据量是否很大,以及键的过期时间

redis会在后台,每秒10次的执行如下操作:
随机选取100个key校验是否过期,如果有25个以上的key过期了,立刻额外随机选取下100个key。也就是说,如果过期的key不多,redis最多每秒回收200条左右

一、redis到redis数据迁移方案

1.建立 “主从” 方式迁移(注:所有的操作都在新redis中执行,为了避免主从关系建立反,请尽量不要在原redis中进行操作)

前提条件:

    原 redis? ip1  port1   masterauth=old-pwd
    新 redis? ip2? port2? ?masterauth=new-pwd

主从关系建立时一般遇到的问题就是密码不同步的问题,在建立主从同步前需要将密码设置一致

1.可在新redis中执行: config set masterauth "old-pwd"
2.新redis中执行:slaveof ip1?port1(与原redis建立主从关系)
? ? ? ? ? ? ?    info replication?(查看?master_link_status 状态是否为 up ,确定主从关系已经建立?)
3.新redis?原redis中执行:dbsize(确定数据同步完成)
4.新redis中执行: slaveof no one(解除主从关系)??
? ? ? ? ? ? ?    info replication (确定新节点已经成为主节点)
? ? ? ? ? ? ? ?  config set masterauth?"pwd" (将密码设置回来)

2.redis-port方式迁移数据

第一步:工具准备

redis-port 此工具已经编译完成 链接:https://pan.baidu.com/s/1QragD66OA0VawEEiu85MEQ? ? 提取码:xeoj
若要自己编译请访问官网下载编译https://github.com/CodisLabs/redis-port

第二步:redis-port参数说明

Options:
        -n N, --ncpu=N                    Set runtime.GOMAXPROCS to N.
        -p M, --parallel=M                Set the number of parallel routines to M.
        -i INPUT, --input=INPUT           Set input file, default is stdin (‘/dev/stdin‘).
        -o OUTPUT, --output=OUTPUT        Set output file, default is stdout (‘/dev/stdout‘).
        -f MASTER, --from=MASTER          Set host:port of master redis.
        -t TARGET, --target=TARGET        Set host:port of slave redis.
        -P PASSWORD, --password=PASSWORD  Set redis auth password.
        -A AUTH, --auth=AUTH              Set auth password for target.
        --fromencodepassword=PASSWORD     Set encode password for from.
        --targetncodepassword=PASSWORD    Set encode password for target.
        --fromauthtype=FROMAUTHTYPE           Set auth type for from.
        --targetauthtype=TARGETAUTHTYPE   Set auth type for target.
        --fromversion=FROMVERSION         Set From-RDB version no, default to 6 (6 for Redis Version <= 3.0.7, 7 for >=3.2.0)
        --toversion=TOVERSION             Set To-RDB version no, default to 6 (6 for Redis Version <= 3.0.7, 7 for >=3.2.0)
        --faketime=FAKETIME               Set current system time to adjust key‘s expire time.
        --sockfile=FILE                   Use FILE to as socket buffer, default is disabled.
        --filesize=SIZE                   Set FILE size, default value is 1gb.
        --pidfile=REDISPORT.PID           Pid file path.
        --logfile=REDISPORT.LOG           Log file path.
        -e, --extra                       Set ture to send/receive following redis commands, default is false.
        --rewrite                         Force rewrite when destination restore has the key
        --filterdb=DB                     Filter db = DB, default is *.
        --targetdb=DB                     Target db = DB, default is *.
        --filterkey="a|b|c"               Filter key with prefix string, multiple string is separated by ‘|‘
        --httpport=HTTPPORT               Http port.
        --bigkeysize=BIGKEYSIZE           Big Key Size.
        --psync                           Use PSYNC command.
        --replacehashtag                  Replace key hash tag
        --filterslots="1|2|3"             Filter slots = slots, default is *.
        --pacluster                       set pacluster = true, default is false

可执行命令:
redis-port decode   [--ncpu=N]  [--parallel=M]  [--input=INPUT]  [--output=OUTPUT] [--fromversion=RDBVERSION] [--toversion=RDBVERSION] [--pidfile=REDISPORT.PID] [--logfile=REDISPORT.LOG] [--httpport=HTTPPORT] [--bigkeysize=BIGKEYSIZE]
redis-port restore  [--ncpu=N]  [--parallel=M]  [--input=INPUT]   --target=TARGET   [--auth=AUTH] [--extra] [--faketime=FAKETIME]  [--filterdb=DB] [--filterkey="str1|str2|str3"] [--fromversion=RDBVERSION] [--toversion=RDBVERSION] [--rewrite] [--pidfile=.PID] [--logfile=REDISPORT.LOG] [--httpport=HTTPPORT] [--bigkeysize=BIGKEYSIZE] [--targetauthtype=TARGETAUTHTYPE] [--targetencodepassword=PASSWORD] [--targetdb=DB]
redis-port dump     [--ncpu=N]  [--parallel=M]   --from=MASTER   [--password=PASSWORD]  [--output=OUTPUT]  [--extra] [--fromversion=RDBVERSION] [--toversion=RDBVERSION] [--pidfile=.PID] [--logfile=REDISPORT.LOG]  [--httpport=HTTPPORT] [--bigkeysize=BIGKEYSIZE]
redis-port sync     [--ncpu=N]  [--parallel=M]   --from=MASTER  [--fromencodepassword=PASSWORD] [--fromauthtype=FROMAUTHTYPE] [--targetauthtype=TARGETAUTHTYPE] [--password=PASSWORD]   --target=TARGET [--targetencodepassword=PASSWORD]  [--auth=AUTH]  [--sockfile=FILE [--filesize=SIZE]] [--filterdb=DB]  [--targetdb=DB] [--filterkey="str1|str2|str3"] [--psync] [--fromversion=RDBVERSION] [--toversion=RDBVERSION] [--rewrite]  [--pidfile=.PID] [--logfile=REDISPORT.LOG] [--httpport=HTTPPORT] [--bigkeysize=BIGKEYSIZE] [--replacehashtag] [--filterslots="1|2|3"] [--pacluster]

第三步:具体使用

前提条件:
    原redis1:ip1  port1  pwd1
    新redis2:ip2  port2? pwd2

参数说明:

Options:
        -n N, --ncpu=N                    Set runtime.GOMAXPROCS to N.
        -p M, --parallel=M                Set the number of parallel routines to M.
        -i INPUT, --input=INPUT           Set input file, default is stdin (‘/dev/stdin‘).
        -o OUTPUT, --output=OUTPUT        Set output file, default is stdout (‘/dev/stdout‘).
        -f MASTER, --from=MASTER          Set host:port of master redis.
        -t TARGET, --target=TARGET        Set host:port of slave redis.
        -P PASSWORD, --password=PASSWORD  Set redis auth password.
        -A AUTH, --auth=AUTH              Set auth password for target.
        --fromencodepassword=PASSWORD     Set encode password for from.
        --targetncodepassword=PASSWORD    Set encode password for target.
        --fromauthtype=FROMAUTHTYPE           Set auth type for from.
        --targetauthtype=TARGETAUTHTYPE   Set auth type for target.
        --fromversion=FROMVERSION         Set From-RDB version no, default to 6 (6 for Redis Version <= 3.0.7, 7 for >=3.2.0)
        --toversion=TOVERSION             Set To-RDB version no, default to 6 (6 for Redis Version <= 3.0.7, 7 for >=3.2.0)
        --faketime=FAKETIME               Set current system time to adjust key‘s expire time.
        --sockfile=FILE                   Use FILE to as socket buffer, default is disabled.
        --filesize=SIZE                   Set FILE size, default value is 1gb.
        --pidfile=REDISPORT.PID           Pid file path.
        --logfile=REDISPORT.LOG           Log file path.
        -e, --extra                       Set ture to send/receive following redis commands, default is false.
        --rewrite                         Force rewrite when destination restore has the key
        --filterdb=DB                     Filter db = DB, default is *.
        --targetdb=DB                     Target db = DB, default is *.
        --filterkey="a|b|c"               Filter key with prefix string, multiple string is separated by ‘|‘
        --httpport=HTTPPORT               Http port.
        --bigkeysize=BIGKEYSIZE           Big Key Size.
        --psync                           Use PSYNC command.
        --replacehashtag                  Replace key hash tag
        --filterslots="1|2|3"             Filter slots = slots, default is *.
        --pacluster                       set pacluster = true, default is false

具体操作:

1.连接redis1客户端? redis-cli -a pwd1 -h ip1 -p port1? 执行bgsave
2.将redis-port上传到原redis1的服务器db目录下找到对应的dump.rdb
3.授权 chmod +x redis-port?
4.有两种方式,
    第一种传输dump.rdb文件,
? ?? ?./redis-port restore -i dump.rdb -t?ip2:port2?-A 123456 -n 4
    第二种俩个redis之间传输
? ? ? ./redis-port sync -f 10.19.185.17:7006 -t 10.19.xx.17:8522 --fromversion=9? --toversion=9 -A 123456 -P 123456 -n 4 -p 32? --sockfile=test.tmp --filesize=32GB? ?(若是redis5.0以上版本号配置--fromversion=9? --toversion=9)
5.执行完成查看两边数据量是否一致
? ??redis-cli -a pwd1 -h ip1 -p port1 dbsize
? ? redis-cli -a pwd2 -h ip2 -p port2 dbsize

二、redis迁移pika方案(aof_to_pika工具迁移)

注:迁移数据前请确认是否有重复的key,以及是否能接受覆盖掉的key的值:

1.redis 0-15个库,如果都有数据,那么在执行save时,不同库中的相同的key会被覆盖,例如 db1中的key会覆盖掉db0中相同0的key的数据
2.若pika中有数据,那么redis中的key会覆盖掉pika中的相同的key的数据

1.工具准备aof_to_pika.zip

链接:https://pan.baidu.com/s/1kKkP4kxCBdCPKogMWElKrQ  提取码:b0s6

2.具体操作步骤

1.停止应用写入redis数据,并进入到redis中执行dbsize查询数据量
2.原redis是否做了aof持久化,若没做进入redis执行config set appendonly yes进行持久化,同时拷贝 appendonly.aof
3.需要机器的gcc版本较高(实践证明gcc 4.8.x 是可以的)
4.安装aof_to_pika工具
? ?在准备好的机器上创建pika/bin/ 目录下执行
? ? ? ? unzip?aof_to_pika.zip? ? //解压工具包
? ? ? ? cd?aof_to_pika && make? ?//进入到工具包并执行编译
5.将appendonly.aof文件上传到 ?pika/bin/output/bin/目录下
6.在pika/bin/output/bin/目录下执行? “./aof_to_pika -i ./appendonly.aof -h 【pika-ip】 -p 【pika-port】 -a 【pwd】-v ” 进行迁移
7.迁移完成后通过执行 “redis-cli -a 【pwd】?-h 【pika-ip】 -p 【pika-port】 info keyspace 1 ” 查看迁移后的数据量(主从都查询一下,确保主从数据同步)

三、pika迁移pika数据迁移方案

建立主从方式迁移数据

原pika ip1 port1 pwd1
新pika集群 (主) ip2 port2  pwd2
          (从) ip3 port3  pwd3

1.进入(从)ip3 port3 ,将主从断开
? ? ? ?redis-cli -a 【pwd3】 -h 【ip3】 -p 【port3】slaveof no one
2.进入(主) ip2 port2,与原pika建立主从关系
? ? ??redis-cli -a 【pwd2】 -h 【ip2】 -p 【port2】slaveof 【ip1】【port1】
3.查看两边数据是否一致
? ? ??redis-cli -a 【pwd1】 -h 【ip1】 -p 【port1】info keyspace 1
? ? ? redis-cli -a 【pwd2】 -h 【ip2】 -p 【port2】info keyspace 1
4.数据一致后,进入从节点重新建立主从关系
? ??  redis-cli -a 【pwd3】 -h 【ip3】 -p 【port3】slaveof pika1 9221
5.查询主从数据是否一致
? ? ? redis-cli -a 【pwd1】 -h 【ip1】 -p 【port1】info keyspace 1
? ?  ?redis-cli -a 【pwd2】 -h 【ip2】 -p 【port2】info keyspace 1
? ? ? redis-cli -a 【pwd3】 -h 【ip3】 -p 【port3】info keyspace 1

四、redis迁移到已有数据的redis中

1.建立主从的方式,从redis中会先执行Flushing old data后才建立主从,此方式不可行
2.推荐使用redis-port?方式迁移,迁移方式同上

./redis-port sync -f 【需要迁移ip】:【需要迁移port】-t? 【目标ip】:【目标port】--fromversion=9? --toversion=9 -A 123456 -P 123456 -n 4 -p 32? --sockfile=test.tmp --filesize=32GB

注:数据迁移过程中,因为俩个redis中都有数据,那么需要确定,重复的key是否可以丢失,迁移中默认是保留目标redis中重复的key值,需要迁移的redis中的重复的key不会被迁移


以上是关于Redis&Pika单机及主从数据迁移方案的主要内容,如果未能解决你的问题,请参考以下文章

线上项目腾讯云平滑迁移方案及步骤

pika集群水平扩展——让性能容量不再受限

Redis主从复制&哨兵&集群&常见问题

读完这篇文章,就基本搞定了Redis主从复制

Redis学习之4种模式实践及机制解析(单机主从哨兵集群)

详解Redis 主从复制及主从复制原理