Redis數(shù)據(jù)同步和數(shù)據(jù)遷移如何做?
前言
一個 Redis 需要從另一個 Redis 數(shù)據(jù)同步 或者 數(shù)據(jù)遷移,這種一般怎么做?
數(shù)據(jù)遷移 這種一般比較好做,可以直接從源redis導(dǎo)出rdb,再把rdb文件導(dǎo)入目標(biāo)redis。但是如果需要實時增量同步就比較困難,有什么好的方法解決這種需求,這里介紹下阿里云開源 redis-shake 工具。
- redis-shake項目地址:https://github.com/alibaba/RedisShake
基本功能
redis-shake:是我們基于redis-port基礎(chǔ)上進(jìn)行改進(jìn)的一款產(chǎn)品。它支持解析、恢復(fù)、備份、同步四個功能。以下主要介紹同步sync。
- 恢復(fù)restore:將RDB文件恢復(fù)到目的redis數(shù)據(jù)庫。
- 備份dump:將源redis的全量數(shù)據(jù)通過RDB文件備份起來。
- 解析decode:對RDB文件進(jìn)行讀取,并以json格式解析存儲。
- 同步sync:支持源redis和目的redis的數(shù)據(jù)同步,支持全量和增量數(shù)據(jù)的遷移,支持從云下到阿里云云- 上的同步,也支持云下到云下不同環(huán)境的同步,支持單節(jié)點、主從版、集群版之間的互相同步。需要注意- 的是,如果源端是集群版,可以啟動一個RedisShake,從不同的db結(jié)點進(jìn)行拉取,同時源端不能開啟- move slot功能;對于目的端,如果是集群版,寫入可以是1個或者多個db結(jié)點。
- 同步rump:支持源redis和目的redis的數(shù)據(jù)同步,僅支持全量的遷移。采用scan和restore命令進(jìn)行遷移,支持不同云廠商不同redis版本的遷移。
基本原理
redis-shake 的基本原理就是模擬一個從節(jié)點加入源redis集群,首先進(jìn)行全量拉取并回放,然后進(jìn)行增量的拉取(通過psync命令)。如下圖所示:

如果源端是集群模式,只需要啟動一個redis-shake進(jìn)行拉取,同時不能開啟源端的move slot操作。如果目的端是集群模式,可以寫入到一個結(jié)點,然后再進(jìn)行slot的遷移,當(dāng)然也可以多對多寫入。
目前,redis-shake到目的端采用單鏈路實現(xiàn),對于正常情況下,這不會成為瓶頸,但對于極端情況,qps比較大的時候,此部分性能可能成為瓶頸,后續(xù)我們可能會計劃對此進(jìn)行優(yōu)化。另外,redis-shake到目的端的數(shù)據(jù)同步采用異步的方式,讀寫分離在2個線程操作,降低因為網(wǎng)絡(luò)時延帶來的同步性能下降。
高效性
全量同步階段并發(fā)執(zhí)行,增量同步階段異步執(zhí)行,能夠達(dá)到毫秒級別延遲(取決于網(wǎng)絡(luò)延遲)。同時,我們還對大key同步進(jìn)行分批拉取,優(yōu)化同步性能。
監(jiān)控
用戶可以通過我們提供的restful拉取metric來對redis-shake進(jìn)行實時監(jiān)控:curl 127.0.0.1:9320/metric。
校驗
如何校驗同步的正確性?可以采用我們開源的 redis-full-check:https://github.com/aliyun/redis-full-check?spm=a2c6h.12873639.0.0.4b8974955p9YxV 。
支持版本
- 支持2.8-5.0版本的同步。
- 支持codis。
- 支持云下到云上,云上到云上,云上到云下(阿里云目前支持主從版),其他云到阿里云等鏈路,幫助用戶靈活構(gòu)建混合云場景。
注意事項
- 如果目標(biāo)庫的數(shù)據(jù)逐出策略(maxmemory-policy)配置為noeviction以外的值,可能導(dǎo)致目標(biāo)庫的數(shù)據(jù)與源庫不一致。關(guān)于數(shù)據(jù)逐出策略詳情,請參見Redis數(shù)據(jù)逐出策略介紹。
- 如果源庫中的某些Key使用了過期(expire)機(jī)制,由于可能存在Key已過期但未被及時刪除的情形,所以在目標(biāo)庫中查看(如通過info命令)到的Key數(shù)量會比源庫的Key數(shù)量少。
說明:源和目標(biāo)庫中,未設(shè)置過期機(jī)制或未過期的Key數(shù)量是一致的。
安裝 Redis-shake
- # 下載 Redis-shake 安裝包
- $ wget 'http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/120287/cn_zh/1608173646665/redis-shake-v2.0.3.tar.gz'
- # 解壓Redis-shake 安裝包
- $ tar xzf redis-shake-v2.0.3.tar.gz
- # 修改配置文件
- $ cd redis-shake-v2.0.3/
- $ vim redis-shake.conf
- # 啟動Redis-shake,開始執(zhí)行數(shù)據(jù)遷移
- $ ./redis-shake.linux -type=sync -conf=redis-shake.conf
- 如果啟動報錯,相關(guān)原因及解決方法,請參見常見報錯及解決方法。
參考鏈接
https://developer.aliyun.com/article/691794
https://help.aliyun.com/document_detail/117311.html?spm=a2c4g.11186623.6.651.57fc1516WTPTT9