工作中有時會遇到需要把原Redis集群下線,遷移到另一個新的Redis集群的需求(如機房遷移,Redis上雲等原因)。此時原Redis中的數據需要如何操作才可順利遷移到一個新的Redis集群呢? 本節簡單介紹相關方法及一些工具;
redis有主從架構及redis-cluster架構,架構不同,兩者的遷移方法也是不相同的;
Redis主從遷移
若原來的redis集群為主從結構,則遷移工作是相當簡單方便的。可使用slaveof遷移或aof/rdb遷移數據。
- slaveof : 利用slaveof制作新的從庫,從而達到數據遷移的目的。
- aof遷移: 暫停寫服務,把aof文件導出到新的redis機群中完成數據遷移。
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. 測試業務情況(略)
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停寫操作。
Redis集群遷移
Redis-cluster介紹
Redis-cluster是 redis 的一個分布式實現,cluster將數據存儲到多個不同Redis實例中,解決了單機Redis容量有限的問題。並且Redis-cluster某個節點故障時,若此節點有可用的從庫,則redis-cluster將可以繼續處理請求,從而實現了redis的高可用。
Redis-Cluster遷移
方法一: 集群節點增刪實現
方法1: 集群節點增刪實現 把Redis新節點逐台加入當前集群,變成一個大的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
方法二: 遷移工具實現
若場景是希望原Redis集群暫時保留,即如下圖,同時有兩個獨立的集群,則就無法使用遷移方法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數據。(推薦此方法)
遷移工具
常見遷移工具
[
](https://github.com/alibaba/RedisShake)
- 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來重點介紹。
redis-shake
redis-shake是阿里雲自研的開源工具,支持對Redis數據進行解析(decode)、恢復(restore)、備份(dump)、同步(sync/rump)。在sync模式下,redis-shake使用SYNC或PSYNC命令將數據從源端Redis同步到目的端Redis,支持全量數據同步和增量數據同步,增量同步在全量同步完成后自動開始。
功能介紹
- 備份dump:將源redis的全量數據通過RDB文件備份起來。
- 解析decode:對RDB文件進行讀取,並以json格式解析存儲。
- 恢復restore:將RDB文件恢復到目的redis數據庫。
- 同步sync: 支持源redis和目的redis的數據同步,支持全量和增量數據的遷移。支持單節點、主從版、集群版之間的互相同步。需要注意的是,如果源端是集群版,可以啟動一個RedisShake,從不同的db結點進行拉取,同時源端不能開啟move slot功能;對於目的端,如果是集群版,寫入可以是1個或者多個db結點。
- 同步rump:支持源redis和目的redis的數據同步,僅支持全量的遷移。采用scan和restore命令進行遷移,支持不同雲廠商不同redis版本的遷移。
redis-shake遷移原理
redis-shake的基本原理就是模擬一個從節點加入源redis集群,首先進行全量拉取並回放,然后進行增量的拉取(通過psync命令)。如下圖所示:
如果源端是集群模式,只需要啟動一個redis-shake進行拉取,同時不能開啟源端的move slot操作。如果目的端是集群模式,可以寫入到一個結點,然后再進行slot的遷移,當然也可以多對多寫入。
環境准備
本文進行Redis集群遷移測試,為了節約機器,目標集群復用了源Redis機器,只是修改了端口。 本文計划測試cluster_A---> cluster_B,及Cluster_A---> Redis_C主從的兩種遷移場景;
機器規划
redis-shake機器
角色 | 版本 | IP |
---|---|---|
redis-shake | redis-shake-1.6.24 | 192.124.64.212 |
源Redis集群A:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-5.0.6 | 192.124.64.212 | 6301,7301 |
node-2 | redis-5.0.6 | 192.124.64.213 | 6301,7301 |
node-3 | redis-5.0.6 | 192.124.64.214 | 6301,7301 |
目標Redis集群B:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-5.0.6 | 192.124.64.212 | 6302,7302 |
node-2 | redis-5.0.6 | 192.124.64.213 | 6302,7302 |
node-3 | redis-5.0.6 | 192.124.64.214 | 6302,7302 |
源Redis主從C:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-3.2.9 | 192.168.0.108 | 6303 |
node-2 | redis-3.2.9 | 192.168.0.111 | 6303 |
目標Redis主從C:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-3.2.9 | 192.168.0.100 | 6303 |
node-2 | redis-3.2.9 | 192.168.0.107 | 6303 |
Redis主從遷移實施
Redis部署(3.2.9)
源Redis主從:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-3.2.9 | 192.168.0.108 | 6303 |
node-2 | redis-3.2.9 | 192.168.0.111 | 6303 |
目標Redis主從C:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-3.2.9 | 192.168.0.100 | 6303 |
node-2 | redis-3.2.9 | 192.168.0.107 | 6303 |
部署redis(兩個主從都做)
yum -y install gcc gcc-c++
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz
cd redis-3.2.9/deps/
make geohash-int hiredis jemalloc linenoise lua
cd ..
make && make install
cd utils/
./install_server.sh
chkconfig --add redis_6379
chkconfig redis_6379 on
/*
./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
*/
[root@redis utils]# /etc/init.d/redis_6379 status
Redis is running (7887)
修改Redis-Master的redis.conf配置文件
#[root@redis-master redis]# mkdir /usr/local/redis/backup -p
[root@redis-master redis]# vim /etc/redis/6379.conf
daemonize yes
pidfile /var/run/redis-16379.pid
logfile /var/log/redis-16379.log
port 6379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-6379.db
dir /usr/local/redis/backup
masterauth 123456
requirepass 123456
# 重啟服務使服務生效
[root@redis-master redis]# /etc/init.d/redis_6379 restart
修改Redis-Slave的redis.conf配置文件
[root@redis-slave redis]# mkdir /usr/local/redis/backup -p
[root@redis-slave redis]# vim /etc/redis/6379.conf
daemonize yes
pidfile /var/run/redis-26379.pid
logfile /var/log/redis-26379.log
port 26379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-6379.db
dir /usr/local/redis/backup
masterauth 123456
requirepass 123456
slaveof 192.168.0.108 6379
# 重啟服務使服務生效
[root@redis-master redis]# redis-server ./redis.conf
驗證主從復制是否生效
# 主節點
[root@redis-master redis]# redis-cli -h 127.0.0.1 -p 6379 -a 123456
127.0.0.1:16379> set zhou youmen
OK
# 從節點
[root@redis-slave redis]# redis-cli -h 127.0.0.1 -p 6379 -a 123456
127.0.0.1:6379> get zhou
"youmen"
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:192.168.0.108
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:129
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
至此主從復制OK了
Redis遷移
模擬數據
cat input_key.sh
#!/bin/bash
for i in $(seq 1 1000)
do
redis-cli -h 127.0.0.1 -p 6379 -a 123456 set k_${i} v_${i} && echo "set k_${i} is ok"
done
sh input_key.sh
aof同步數據遷移
若是原來的redis可以暫停寫操作,則咱們用aof來同步數據也很方便;
#舊redis導出aof文件
[root@redis-master ~]# redis-cli -h 192.168.0.108 -p 6379 -a 123456 config set appendonly yes
OK
[root@redis-master ~]# redis-cli -h 192.168.0.108 -p 6379 -a 123456 config get appendonly
1) "appendonly"
2) "yes"
scp /usr/local/redis/backup/appendonly.aof 192.168.0.107:
#aof文件導入到新的redis
[root@nginx ~]# redis-cli -h 192.168.0.107 -p 6379 -a 123456 --pipe < appendonly.aof
#導入完成后,關閉原redis AOF
[root@redis-master ~]# redis-cli -h 192.168.0.107 -p 6379 -a 123456 config set appendonly no
Redis集群遷移實施
Redis集群部署
https://www.cnblogs.com/you-men/p/12861215.html
5.1 redis-shark安裝
軟件下載地址: github.com/alibaba/Red… 。軟件解壓縮后就可使用。
安裝:
#安裝redis-shake
$wget 'https://github.com/alibaba/RedisShake/releases/download/release-v1.6.24-20191220/redis-shake-1.6.24.tar.gz' .
$tar -zxvf redis-shake-1.6.24.tar.gz
$mv redis-shake-1.6.24 /usr/local/redis-shake
#環境變量
$echo 'export PATH=$PATH:/usr/local/redis-shake'>>/etc/profile
$source /etc/profile
#查看版本
$redis-shake.linux --version
#目錄中文件信息
$tree /usr/local/redis-shake
.
├── ChangeLog
├── redis-shake.conf
├── redis-shake.darwin
├── redis-shake.linux
├── redis-shake.windows
├── start.sh
└── stop.sh
啟動:
#啟動程序, xxx為sync, restore, dump, decode, rump之一
$redis-shake.linux -conf=redis-shake.conf -type=xxx
redis-shake --conf={配置文件地址} --type={模式:sync/dump等} 模式需要與配置文件中的source target對應。
模式為sync, restore, dump, decode, rump其中之一,全量+增量同步請選擇sync。
mac下請使用redis-shake.darwin,windows請用redis-shake.windows
redis-shake模式介紹:
- dump模式 : 將雲數據庫Redis版實例中的數據備份到RDB文件中。
- decode模式: decode實現對RDB文件進行讀取,並以json格式解析存儲。
- restore模式: restore模式可將RDB文件恢復到目的redis數據庫。
- sync模式: sync模式將某Redis數據遷移至其它Redis集群。
- rump模式: rump模式采用scan和restore命令進行遷移,支持不同雲廠商不同redis版本的遷移。
5.2 redis-shake配置
- 如何進行配置 https://github.com/alibaba/RedisShake/wiki/
- redis-shake遷移 https://help.aliyun.com/document_detail/111066.html
5.2.1 sync模式參數
在sync模式下,redis-shake使用SYNC或PSYNC命令將數據從源端Redis同步到目的端Redis,支持全量數據同步和增量數據同步,增量同步在全量同步完成后自動開始。
sync模式參數說明:
參數 | 說明 | 示例 |
---|---|---|
source.type | 支持standalone,sentinel,cluster和proxy | cluster |
source.address | 源Redis的連接地址與服務端口。 | xxx.xxx.1.10:6379 |
source.password_raw | 源Redis的連接密碼。 | SourcePass233 |
target.address | 目的Redis的連接地址與服務端口。 | xx.redis.rds.aliyuncs.com:6379 |
target.password_raw | 目的Redis的連接密碼。 | TargetPass233 |
rewrite | 如果目的Redis有相同的key,是否覆蓋,可選值:true(覆蓋);false(不覆蓋)。 | 默認為true,為false且存在數據沖突則會出現異常提示。 |
target.db | 待遷移的數據在目的Redis中的邏輯數據庫名。當該值設置為-1時,源Redis和目的Redis中的名稱相同 | -1 |
parallel | RDB文件同步中使用的並發線程數,用於提高同步性能。 | 最小值為1,推薦值為64。 |
5.3 執行遷移
分別演示下cluster_A---> cluster_B,及Cluster_A---> Redis_C主從的兩種場景。
5.3.1 Redis-Cluster遷移到Redis-Cluster
源Redis集群A:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-5.0.6 | 192.124.64.212 | 6301,7301 |
node-2 | redis-5.0.6 | 192.124.64.213 | 6301,7301 |
node-3 | redis-5.0.6 | 192.124.64.214 | 6301,7301 |
目標Redis集群B:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-5.0.6 | 192.124.64.212 | 6302,7302 |
node-2 | redis-5.0.6 | 192.124.64.213 | 6302,7302 |
node-3 | redis-5.0.6 | 192.124.64.214 | 6302,7302 |
1)檢查源/目標Redis信息
獲取源端集群信息:echo 'cluster nodes' | redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 | egrep master 源端集群master: 192.124.64.212:6301;192.124.64.213:6301;192.124.64.214:6301獲取目標端集群信息:echo 'cluster nodes' | redis-cli -c -h 192.124.64.212 -p 6302 -a pwd123 | egrep master 目標集群master: 192.124.64.212:6302;192.124.64.213:6302; 192.124.64.214:6302
2)配置RedisShake
修改配置文件,重點是修改source.type,source.address,source.password_raw; target.type,target.address,target.password_raw。
which redis-shake/usr/local/redis-shake/redis-shake $cd /usr/local/redis-shake/$vim /usr/local/redis-shake/redis-shake-cluster.conf#配置如下# id唯一標識一次同步進程id=redis-shake-clusterlog.file = /var/log/redis-shake.loglog.level = info# 端口配置,默認system_profile = 9310http_profile = 9320 # source相關配置[cluster|standalone]source.type = cluster#source.addres,需要配置源端的所有集群中db節點列表以及目的端集群所有db節點列表source.address = 192.124.64.212:6301;192.124.64.213:6301;192.124.64.214:6301source.password_raw = pwd123source.auth_type = auth # Des相關配置target.type= clustertarget.address = 192.124.64.212:6302;192.124.64.213:6302;192.124.64.214:6302target.password_raw = pwd123target.auth_type = auth# all the data will be written into this db. < 0 means disable.target.db = -1# 過濾執行類型的key# filter.key = QH;cn# 在rdb全量同步階段,如果目標redis已經存在對應的key時是否覆蓋,如果為false就拋異常rewrite = true# 是否做metric統計,建議設置為true,如果設置為false,/metric中的部分參數的值就一直是0metric = true
3)執行遷移 執行遷移,開啟數據同步遷移。 若是數據量特別大,需要在壓力低峰時,要后台執行遷移。
$redis-shake.linux -type sync -conf ./redis-shake-cluster.conf 復制代碼
4)監控進度
- restful監控指標 github.com/alibaba/Red…
查看日志:
查看同步日志確認同步狀態,當出現sync rdb done時,全量同步已經完成,同步進入增量階段。若+forward=0,則此時源端沒有新的數據寫入,同步鏈路中沒有增量數據正在傳輸,您可以以此為依據選擇適當的時機將業務切換到Cluster_B集群。
$tail -f /var/log/redis-shake.log 2020/04/15 20:28:40 [INFO] dbSyncer[2] FlushEvent:IncrSyncStart Id:redis-shake-cluster 2020/04/15 20:28:40 [INFO] dbSyncer[1] total = 178B - 178B [100%] entry=0 2020/04/15 20:28:40 [INFO] dbSyncer[1] sync rdb done 2020/04/15 20:28:40 [INFO] dbSyncer[1] FlushEvent:IncrSyncStart Id:redis-shake-cluster 2020/04/15 20:28:41 [INFO] dbSyncer[2] sync: +forwardCommands=0 +filterCommands=0 +writeBytes=0 2020/04/15 20:28:41 [INFO] dbSyncer[0] sync: +forwardCommands=0 +filterCommands=0 +writeBytes=0
監控狀態:
$curl 127.0.0.1:9320/metric | python -m json.tool
5)檢查驗證 可以用scan命令來簡單抽查數據同步的結果。也可以用redis-full-check進行數據校驗,確保兩端數據一致,詳細步驟請參見校驗遷移后的數據。
測試寫入數據:
#源Redis,寫入測試數據$redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 192.124.64.212:6301> set foo bar192.124.64.214:6301> set foo1 bar1192.124.64.214:6301> scan 0 match '*' count 1000 1) "0"2) 1) "foo" 2) "foo1"#目標Redis,用scan檢查$redis-cli -c -h 192.124.64.212 -p 6302 -a pwd123 scan 0 match '*' count 1000 1) "0"2) 1) "foo" 2) "foo1"
說明: scan命令只能對某一個redis節點scan,不支持對cluster scan。
檢查keys數:
#源Redis/usr/local/redis-5.0.6/bin/redis-cli --cluster info 192.124.64.212:6301 -a pwd123 192.124.64.212:6301 (5e19efdd...) -> 2 keys | 6720 slots | 1 slaves.192.124.64.213:6301 (8021b063...) -> 0 keys | 5462 slots | 1 slaves.192.124.64.214:6301 (7f411012...) -> 2 keys | 4202 slots | 1 slaves.[OK] 4 keys in 3 masters.#目標Redis/redis-cli -h 192.124.64.212 -p 6303 -a pwd123 scan 0 match '*' count 1000 1) "0"2) 1) "foo" 2) "foo1"
可以看到源及目標redis集群,keys的數目是一致的。
Redis-Cluster遷移到Redis主從
源Redis集群A:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-5.0.6 | 192.124.64.212 | 6301,7301 |
node-2 | redis-5.0.6 | 192.124.64.213 | 6301,7301 |
node-3 | redis-5.0.6 | 192.124.64.214 | 6301,7301 |
目標Redis主從C:
角色 | 版本 | IP | port |
---|---|---|---|
node-1 | redis-5.0.6 | 192.124.64.212 | 6303 |
node-2 | redis-5.0.6 | 192.124.64.213 | 6303 |
1)配置RedisShake
修改配置文件,重點是修改source.type,source.address,source.password_raw; target.type,target.address,target.password_raw。
$vim ./redis-shake-standalone.conf source.type = cluster#source.addres,需要配置源端的所有集群中db節點列表以及目的端集群所有db節點列表source.address = 192.124.64.212:6301;192.124.64.213:6301;192.124.64.214:6301source.password_raw = pwd123source.auth_type = auth# Des相關配置target.type= standalonetarget.address = 192.124.64.212:6303;192.124.64.213:6303target.password_raw = pwd123
2)執行遷移
執行遷移,開啟數據同步遷移。 若是數據量特別大,需要在壓力低峰時,要后台執行遷移。
$redis-shake.linux -type sync -conf ./redis-shake-standalone.conf
3)檢查驗證
檢查日志:
$tail -f /var/log/redis-shake.log 2020/04/15 21:10:23 [INFO] dbSyncer[2] sync rdb done 2020/04/15 21:10:23 [INFO] dbSyncer[2] FlushEvent:IncrSyncStart Id:redis-shake-cluster 2020/04/15 21:10:23 [WARN] dbSyncer[2] GetFakeSlaveOffset not enable when psync == false 2020/04/15 21:10:24 [INFO] dbSyncer[1] sync: +forwardCommands=0 +filterCommands=0 +writeBytes=0
檢查數據:
#源Redis,寫入數據$redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 set hello hi$redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 set foo barbar$redis-cli -c -h 192.124.64.212 -p 6301 -a pwd123 set foo1 bar1bar1#$redis-cli --cluster info 192.124.64.212:6301 -a pwd123 192.124.64.212:6301 (5e19efdd...) -> 1 keys | 6720 slots | 1 slaves.192.124.64.213:6301 (8021b063...) -> 0 keys | 5462 slots | 1 slaves.192.124.64.214:6301 (7f411012...) -> 2 keys | 4202 slots | 1 slaves.[OK] 3 keys in 3 masters.#目標Redis,查看數據$redis-cli -h 192.124.64.212 -p 6303 -a pwd123 scan 0 match '*' count 10001) "0"2) 1) "hello" 2) "foo" 3) "foo1"
可以看到源及目標redis集群,keys的數目是一致的。