Redis-shake是一款開源的Redis遷移工具,在Rump模式下,Redis-shake可以以scan的方式從源端Redis獲取全量數據,寫入到目的端,實現數據遷移。這種遷移方式不依賴于SYNC和PSYNC,可以廣泛應用于自建Redis、云Redis之間的遷移。
本文將介紹如何利用Redis-shake的Rump模式,以在線全量的遷移方式,一次性將其他云廠商Redis遷移至DCS中。
本方案數據流向示意圖


前提條件
- 已在目標端云服務創建Redis實例。
- 已在目標端云服務創建用于運行Redis-shake的彈性云主機(ECS)。
- 創建的ECS需要選擇與Redis實例相同的VPC,并且需要綁定彈性公網IP。
- Rump模式不支持增量數據遷移,建議您先停止源端Redis的寫入再進行遷移,防止數據不一致。
- 該方案配置只支持同DB映射遷移,異DB映射遷移該方案配置不適用。
- 源端為多DB使用(有非DB0的DB使用),DCS為Proxy集群時,DCS需要開啟多DB模式,否則會遷移失敗(單DB0的Proxy集群不支持select命令)。
- 源端為多DB使用(有非DB0的DB使用),DCS為Cluster集群時,該方案不支持(DCS Cluster集群只支持DB0模式)。
操作步驟
步驟 1 分別在ECS和源端轉發服務器上安裝Nginx,本文以ECS操作系統為Centos7.x為例進行安裝,不同操作系統命令稍有不同。
- 執行以下命令,添加Nginx到yum源。
sudo rpm -Uvh
//nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
- 添加完之后,執行以下命令,查看是否已經添加成功。
yum search nginx
- 添加成功之后,執行以下命令,安裝Nginx。
sudo yum install -y nginx
- 執行以下命令安裝stream模塊。
yum install nginx-mod-stream --skip-broken
- 啟動Nginx并設置為開機自動運行。
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
- 在本地瀏覽器中輸入服務器地址(ECS公網IP地址),查看安裝是否成功。
如果出現下面頁面,則表示安裝成功。


步驟 2 在源端Redis添加源端轉發服務器的白名單。
步驟 3 在源端轉發服務器配置安全組。
- 獲取ECS的公網IP地址。
- 配置源端轉發服務器安全組入方向,添加ECS的公網IP地址,并放開來自ECS訪問請求的端口(以6379為例)。
步驟 4 配置源端轉發服務器的Nginx轉發配置。
- 登錄Linux源端轉發服務器,執行命令打開并修改配置文件。
cd /etc/nginx
vi nginx.conf
- 轉發配置示例如下:
stream {
server {
listen 6379;
proxy_pass {source_instance_address}:{port};
}
}
其中,6379為源端轉發服務器本機監聽端口,{source_instance_address}和{port}為源端Redis實例的連接地址和端口。
配置目的:通過訪問源端轉發服務器本機監聽端口6379,訪問源端Redis。
注意:以上配置必須配置在如下圖所示的位置。
配置位置要求


- 重啟Nginx服務。
service nginx restart
- 驗證啟動是否成功。
netstat -an|grep 6379
端口在監聽狀態,Nginx啟動成功。
驗證結果


步驟 5 配置ECS的Nginx轉發配置。
- 登錄LinuxECS,執行命令打開并修改配置文件。
cd /etc/nginx
vi nginx.conf
- 配置示例如下:
stream {
server {
listen 6666;
proxy_pass {source_ecs_address}:6379;
}
}
其中,6666為ECS本機監聽端口,{source_ecs_address}為源端轉發服務器公網IP地址,6379為源端轉發服務器Nginx的監聽端口。
配置目的:通過訪問ECS本機監聽端口6666,訪問源端轉發服務器。
注意:以上配置必須配置在如下圖所示的位置。
配置位置要求


- 重啟Nginx服務。
service nginx restart
- 驗證啟動是否成功。
netstat -an|grep 6666
端口在監聽狀態,Nginx啟動成功。
驗證結果


步驟 6 在ECS執行以下命令測試6666端口的網絡連接。
redis-cli -h {target_ecs_address} -p 6666 -a {password}
其中,{target_ecs_address}為ECS公網IP地址,6666為ECS監聽端口,{password}為源端Redis密碼,如無密碼可不填。
連接示例


步驟 7 準備遷移工具Redis-shake。
- 登錄ECS。
- 在ECS中執行以下命令下載Redis-shake,本文以下載2.0.3版本為例進行說明。您可以根據實際需要下載其他。
wget
//github.com/tair-opensource/RedisShake/releases/download/release-v2.0.3-20200724/redis-shake-v2.0.3.tar.gz
- 執行命令解壓Redis-shake文件。
tar -xvf redis-shake-v2.0.3.tar.gz
步驟 7 配置Redis-shake的配置文件。
- 執行命令進入解壓后的目錄。
cd redis-shake-v2.0.3
- 修改配置文件redis-shake.conf。
vim redis-shake.conf
修改源端Redis信息配置:
? source.type
源端redis實例類型,單機、主備、proxy集群實例都選擇standalone,cluster實例選擇cluster。
? source.address
ECS公網IP地址和映射源端轉發服務器的端口(ECS監聽端口 6666) ,用英文冒號隔開。
? source.password_raw
源端待遷移Redis實例的密碼,如未設置密碼,無需填寫。
修改目標端DCS信息配置:
? target.type
Redis實例類型,單機、主備、proxy集群實例都選擇standalone,cluster實例選擇cluster。
? target.address
Redis實例的連接地址和端口,用英文冒號隔開。
? target.password_raw
Redis實例的密碼,如未設置密碼,無需填寫。
- 按下Esc鍵退出編輯模式,輸入 :wq! 按回車鍵保存配置并退出編輯界面。
步驟 9 執行命令啟動Redis-shake并使用rump(在線全量)模式開始數據遷移。
./redis-shake.linux -conf redis-shake.conf -type rump
遷移過程


遷移結果


步驟 10 遷移完成后,請使用redis-cli工具連接源Redis和目標Redis,確認數據的完整性。
- 分別連接源Redis和目標Redis。
連接操作請參考使用redis-cli連接Redis實例。
- 輸入 info keyspace ,查看keys參數和expires參數的值。
- 對比源Redis和目標Redis的keys參數分別減去expires參數的差值。如果差值一致,表示數據完整,遷移正常。
步驟 11 刪除Redis-shake配置文件。