背景

新上了一个业务系统,需要进行压力测试。但是新的系统连接的哨兵和原有已经在跑的系统的哨兵地址是共用的,但是后端的redis地址不一样。为了不影响现有的业务,决定把新上的业务的redis哨兵改成临时的单机版的哨兵以及单机版的redis。

所以需要把原有的数据迁移到现在的新的临时服务器上来。

Python连接哨兵代码实现

#!/usr/bin/env python3
# from redis.sentinel import Sentinel
from redis import sentinel

sentinel.Sentinel = sentinel.Sentinel ([('xx', 6000)],socket_timeout=0.5)

##获取主服务器地址
master = sentinel.Sentinel.discover_master('xx')
print(master)

先确认是否开启了持久化

redis有两种持久化方式:RDB AOF

##  表示没有开启
appendonly no

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"

默认情况下,是快照rdb的持久化方式,将内存中的数据以快照的方式写入二进制文件中,默认的文件名是 dump.rdb

(1)RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中。对服务器的性能消耗小。

redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。

对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能

RDB是一个单一的紧凑文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集(适用于灾难恢复)。

(2)AOF方式是将执行过的写指令记录下来,在数据恢复时按照丛前到后的顺序再将指令执行一遍。

查看了线上的哨兵发现并没有座持久化,既没有RDB方式也没有AOF方式。但是有生成 dump.rdb 文件,因为平时我们是手工生成的,因为影响Redis性能所以才关闭了。

RDB 文件迁移

在原有的服务器使用命令,固化到文件。

# 固化数据到 RDB 文件
save

# 查看路径
config get dir

然后拷贝 dump.rdb 文件到新的服务器上。

这样会生成新的文件,清空然后退出

127.0.0.1:6305> flushall
OK
127.0.0.1:6305> exit


### 另外需要注意文件的权限, 如果是哪个用户启动的需要检查当前的用户权限,权限为660
root@VM-32-2-ubuntu:/var/lib/redis# ll
total 653552
drwxr-x---  4 redis redis      4096 Dec  7 10:58 ./
drwxr-xr-x 52 root  root       4096 Mar  1  2022 ../
-rw-rw----  1 redis redis 669212957 Dec  7 10:55 dump.rdb

然后停掉服务,把旧服务器的文件拷贝过来然后覆盖,启动,查看:

127.0.0.1:6305[2]> info

127.0.0.1:6305[2]> keys *
 1) "NOVEMBER-4-47"
 2) "NOVEMBER-2-7"
 3) "NOVEMBER-4-7"
 4) "REDIS:AUTH:TOKEN_318ed6eac4e14e198ea697c0df751d62"
 5) "NOVEMBER-4-65"
 6) "REDIS:AUTH:TOKEN_3e2a5ed9023141e8931dacf636903333"
 7) "NOVEMBER-2-47"
 8) "REDIS:AUTH:TOKEN_508d5e9dc9444c77b6aa399f0b58a270"
 9) "NOVEMBER-4-1"
10) "NOVEMBER-2-1"
11) "POS:REDIS:ID:ORDER_SN"
12) "NOVEMBER-2-65"
13) "REDIS:AUTH:TOKEN_4024f015276443dba7db76a9d6ed06bc"
14) "REDIS:AUTH:TOKEN_41f0f6c58ab34deab72276065e0e5c3c"
127.0.0.1:6305[2]> 

到此数据已经就来了。

腾讯云Redis的云服务迁移

我们prd用的是腾讯云的Redis云服务,开发人员想把prd环境的Redis的数据同步到测试环境的Redis,所以提了工单让运维这边迁移。

 方式1 使用 Redis dump工具(推荐)

##  官网 github
https://github.com/delano/redis-dump

###  官网
http://delanotes.com/redis-dump/


##### centos7 进行试验
######  安装Redis-Dump
yum -y install ruby ruby-devel
yum -y install rubygems

#### 安装redis-dump
### ruby需要2.6以上

####  使用源码包编译安装
wget https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.7.tar.gz
./configure --prefix=/usr/local/ruby/
make
make install

### 
/usr/local/ruby/bin/gem install redis-dump

导入导出数据

#### 以下是无密码的方式
### 导出
/usr/local/ruby/bin/redis-dump -u 127.0.0.1:6379 >db_full.json

##  查看
$sudo cat db_full.json 
{"db":0,"key":"city","ttl":-1,"type":"string","value":"cs","size":2}
{"db":0,"key":"name","ttl":-1,"type":"string","value":"knight","size":6}


##  导入
cat db_full.json |/usr/local/ruby/bin/redis-load -d 0


#### 有密码的方式如下:
### 导出
/usr/local/ruby/bin/redis-dump -u 127.0.0.1:6379 -a 123456 > db_full.json

### 导入
cat db_full.json| /usr/local/ruby/bin/redis-load -u 127.0.0.1:6379 -a 123456
[root@base-cicd-harbor test]# 




方式2 使用阿里的 redis-shake 工具

redis-shake 是阿里的开源工具

## 官方帮助文档
https://cloud.tencent.com/document/product/239/77372

### 云售后提供的文档
https://cloud.tencent.com/developer/article/1780093

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐