受疫情影响,公司业务下滑,公司内部开始开源节流。IT基础设施这边要做的就是压缩服务器资源,对线上业务系统、服务等进行整合。
此次整合涉及到单机Redis数据的迁移。
本文模拟线上redis环境,进行数据进行迁移测试。
测试环境Redis实例
角色
说明
10.100.210.33:6380
模拟线上生产环境
10.100.202.248:6381
模拟目标服务器上新部署的redis从库——Redis主从方案迁移数据
完成
10.100.202.248:6382
模拟目标服务器上新部署的redis实例——RedisBGSAVE方案迁移数据
完成
10.100.202.248:6383
模拟目标服务器上新部署的redis实例——redis-dump方案迁移数据
未测试
方案一:Redis从库同步主库的数据线上环境中redis主实例配置了requirepassAbc@123,搭建从库实例,要想成功获取主库的数据,需在从库配置文件中配置masterauthAbc@123.
从库的配置文件中,requirepassAbc@123配置项目也需要配置,这里配置该参数的目的是当从库的数据与主库的数据保持同步后,会将其与主库断开连接,重启redis实例,使其使用从库本地的RDB文件进行启动,同时将应用中的redis相关配置项指向该实例,保证其与原redis实例的连接方式不变(连接redis密码与使用主库时一致。)
从库配置
1990:C07May202213:38:50.341Redisversion=5.0.12,bits=64,commit=00000000,modified=0,pid=1990,juststarted1990:C07May202213:38:50.341WARNING:TheTCPbacklogsettingof511cannotbeenforcedbecause/proc/sys/net/core/:S07May202213:38:50.342WARNINGovercommit_memoryissetto0!'_memory=1'to/etc/'_memory=1':S07May202213:38:50.342_6381restartStoppingRedisstoppedStartingRedisserver[root@c7-8redis]Replicationrole::638010.100.210.33:638010.100.210.33:638010.100.210.33:6380bgsave(error):6380authAbc@123:6380bgsaveBackgroundsavingstarted
redis_6380实例运行日志中输出信息如下:
26504:M07May14:31:39.167*Backgroundsavingstartedbypid2145121451:C07May14:31:39.173*DBsavedondisk21451:C07May14:31:39.174*RDB:0MBofmemoryusedbycopy-on-write26504:M07May14:31:39.259*Backgroundsavingterminatedwithsuccess
拷贝文件到目标服务器上:
[root@develop~]./install_etuparunningredisserverPleaseselecttheredisportforthisinstance:[6379]6382Pleaseselecttheredisconfigfilename[/etc/redis/6382.conf]Selecteddefault-/etc/redis/6382.confPleaseselecttheredislogfilename[/var/log/redis_6382.log]Selecteddefault-/var/log/redis_6382.logPleaseselectthedatadirectoryforthisinstance[/var/lib/redis/6382]Selecteddefault-/var/lib/redis/6382Pleaseselecttheredisexecutablepath[/usr/local/bin/redis-server]Selectedconfig:Port:6382Configfile:/etc/redis/6382.confLogfile:/var/log/redis_6382.logDatadir:/var/lib/redis/6382Executable:/usr/local/bin/redis-serverCliExecutable:/usr/local/bin/redis-cliIsthisok?/tmp/6382.conf=/etc//redis_6382InstallingserviceSuccessfullyaddedtochkconfig!Successfullyaddedtorunlevels345!StartingRedisserverInstallationsuccessful!
停止redis_6382实例,避免拷贝过来的rdb文件被进程覆盖
serviceredis_6382stop
[root@c7-8utils]:6382authAbc@123:6382127.0.0.1:6382127.0.0.1:6382keys*1)"GPS:{862370051630949}:20210527-1"2)"GPS:{862370051630949}:20210531-1"3)"HzAccessToken:0bc7db7327184fdda009f411fa2457b7"该方法会存在差异数据,差异数据的多少取决于业务繁忙程度和执行BGSAVE命令后到启动新实例并加载完成之间的时间差。
时间越长,业务越繁忙,差异数据越大。
方案三:redis-dump进行数据迁移redis-dumpredis-load工具目前仍为BETA版本。是一个将Redis数据导入/导出为json格式数据的小工具。
其数据导出/导入通过redis-dump、redis-load命令来实现,其中,redis-dump命令将redis数据输出到json格式的文件中;
redis-load命令则是将json格式数据导入到Redis数据库中。
gitee地址。
redis-dump工具支持按db进行转储,相比BGSAVE和主从模式更灵活。
此处不再进行测试,感兴趣的可以参考redis-dump作者的手册进行测试。