前言
一個 Redis 需要從另一個 Redis 數據同步
或者 數據遷移
,這種一般怎麼做?
數據遷移
這種一般比較好做,可以直接從源redis導出rdb,再把rdb文件導入目標redis。但是如果需要實時增量同步就比較困難,有什麼好的方法解決這種需求,這裏介紹下阿里雲開源 redis-shake
工具。
redis-shake
項目地址:https://github.com/alibaba/RedisShake
基本功能
redis-shake
:是我們基於redis-port
基礎上進行改進的一款產品。它支持解析
、恢復
、備份
、同步
四個功能。以下主要介紹同步sync
。
-
恢復restore
:將RDB文件恢復到目的redis數據庫。 -
備份dump
:將源redis的全量數據通過RDB文件備份起來。 -
解析decode
:對RDB文件進行讀取,並以json格式解析存儲。 -
同步sync
:支持源redis和目的redis的數據同步,支持全量和增量數據的遷移,支持從雲下到阿里云云- 上的同步,也支持雲下到雲下不同環境的同步,支持單節點、主從版、集羣版之間的互相同步。需要注意- 的是,如果源端是集羣版,可以啓動一個RedisShake,從不同的db結點進行拉取,同時源端不能開啓- move slot功能;對於目的端,如果是集羣版,寫入可以是1個或者多個db結點。 -
同步rump
:支持源redis和目的redis的數據同步,僅支持全量的遷移。採用scan和restore命令進行遷移,支持不同雲廠商不同redis版本的遷移。
基本原理
redis-shake
的基本原理就是模擬一個從節點加入源redis集羣,首先進行全量拉取並回放,然後進行增量的拉取(通過psync命令)。如下圖所示:
如果源端是集羣模式,只需要啓動一個redis-shake進行拉取,同時不能開啓源端的move slot操作。如果目的端是集羣模式,可以寫入到一個結點,然後再進行slot的遷移,當然也可以多對多寫入。
目前,redis-shake到目的端採用單鏈路實現,對於正常情況下,這不會成爲瓶頸,但對於極端情況,qps比較大的時候,此部分性能可能成爲瓶頸,後續我們可能會計劃對此進行優化。另外,redis-shake到目的端的數據同步採用異步的方式,讀寫分離在2個線程操作,降低因爲網絡時延帶來的同步性能下降。
高效性
全量同步
階段併發執行
,增量同步
階段異步執行
,能夠達到毫秒級別延遲(取決於網絡延遲)。同時,我們還對大key同步進行分批拉取,優化同步性能。
監控
用戶可以通過我們提供的restful拉取metric來對redis-shake進行實時監控: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。 -
支持雲下到雲上,雲上到雲上,雲上到雲下(阿里雲目前支持主從版),其他雲到阿里雲等鏈路,幫助用戶靈活構建混合雲場景。
注意事項
-
如果目標庫的數據逐出策略( maxmemory-policy
)配置爲noeviction以外的值,可能導致目標庫的數據與源庫不一致。關於數據逐出策略詳情,請參見Redis數據逐出策略介紹。 -
如果源庫中的某些Key使用了過期(expire)機制,由於可能存在Key已過期但未被及時刪除的情形,所以在目標庫中查看(如通過info命令)到的Key數量會比源庫的Key數量少。
說明:源和目標庫中,未設置過期機制或未過期的Key數量是一致的。
安裝 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,開始執行數據遷移
$ ./redis-shake.linux -type=sync -conf=redis-shake.conf
如果啓動報錯,相關原因及解決方法,請參見常見報錯及解決方法。
參考鏈接
-
https://developer.aliyun.com/article/691794 -
https://help.aliyun.com/document_detail/117311.html?spm=a2c4g.11186623.6.651.57fc1516WTPTT9
熱門文章推薦
-
Zabbix簡單監控es實踐 -
容器部署ELK7.10,適用於生產 -
kubernetes pod爲什麼需要pause容器? -
Linux Used內存到底哪裏去了? -
Kubectl 備忘錄 -
Kubernetes 實用技巧
最後
-
後臺回覆 【 列表】,可獲取本公衆號所有文章列表 -
歡迎您加我微信【 ypxiaozhan01 】,拉您進技術羣,一起交流學習
-
歡迎您關注【 YP小站 】,學習互聯網最流行的技術,做個專業的技術人
本文分享自微信公衆號 - YP小站(ypxiaozhan)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。