<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在經歷了之前的文章內容章節內容,已完成Redis遷移後,可能會存在以下問題需要進行資料遷移之後的對比。例如,如果Redis遷移的過程出現異常,源端與目的端Redis的資料將會不一致。
在Redis遷移完成後進行資料校驗可以檢查資料的一致性,該如何校驗就是我們本文的內容。我們在這裡採用的是阿里開源的資料對比工具與Redis-Shake形成伴侶模式的開源工具redis-full-check,使用redis-full-check進行校驗能夠找出異常資料,為資料對齊提供可靠依據,本文主要介紹如何使用RedisFullCheck。
redis-full-check是阿里雲自研的Redis資料校驗工具,能夠提取源端和目的端的資料進行多輪差異化比較,並將比較結果記錄在一個SQLite3資料庫中,從而達到全量資料校驗的目的。
遷移源端和目的端Redis範例需為主從版、單節點版、開源叢集版以及部分雲上帶proxy的叢集版(阿里雲、騰訊雲)。
開源地址redis-full-check原始碼地址: https://github.com/aliyun/redis-full-check
redis-full-check下載地址: https://github.com/alibaba/RedisFullCheck/releases
執行 ./bin/redis-full-check.darwin64 or redis-full-check.linux64,它分別在OSX和Linux中構建,然而,二進位制檔案並不總是最新版本。 或者您可以根據以下步驟構建red- full-check自己:
git clone https://github.com/alibaba/RedisFullCheck.git cd RedisFullCheck/src/vendor GOPATH=`pwd`/../..; govendor sync
注意:必須先安裝govendor,然後拉出所有依賴
cd ../../ && ./build.sh
執行build.sh進行編譯即可。
基本原理redis-full-check通過全量對比源端和目的端的redis中的資料的方式來進行資料校驗,其比較方式通過多輪次比較:每次都會抓取源和目的端的資料進行差異化比較,記錄不一致的資料進入下輪對比(記錄在sqlite3 db中)。通過多倫比較不斷收斂,減少因資料增量同步導致的源庫和目的庫的資料不一致。最後sqlite中存在的資料就是最終的差異結果。資料對比介紹
redis-full-check對比的方向是單向,如果希望對比雙向,則需要對比2次,第一次以A為源庫,B為目的庫,第二次以B為源庫,A為目的庫。
首次對別:會抓取源庫A的資料,然後檢測是否位於B中,反向不會檢測,它檢測的是源庫是否是目的庫的子集。每次比較,會先抓取比較的key。
第一輪是從源庫中進行抓取,後面輪次是從sqlite3 db中進行抓取;抓取key之後是分別抓取key對應的field和value進行對比,然後將存在差異的部分存入sqlite3 db中,用於下次比較。
下圖是基本的資料流圖。
對比模式(comparemode)有三種可選:
KeyOutline:只對比key值是否相等。ValueOutline:只對比value值的長度是否相等。FullValue:對比key值、value長度、value值是否相等。
對比會進行comparetimes輪(預設comparetimes=3)比較:
第一輪,首先找出在源庫上所有的key,然後分別從源庫和目的庫抓取進行比較。第二輪,開始迭代比較,只比較上一輪結束後仍然不一致的key和field。不一致場景下分析
對於key不一致的情況,包括lack_source ,lack_target 和type,從源庫和目的庫重新取key、value進行比較。
value不一致的string,重新比較key:從源和目的取key、value比較。value不一致的hash、set和zset,只重新比較不一致的field,之前已經比較且相同的filed不再比較。這是為了防止對於大key情況下,如果更新頻繁,將會導致校驗永遠不通過的情況。value不一致的list,重新比較key:從源和目的取key、value比較。
每輪之間會停止一定的時間(Interval)。
對於hash,set,zset,list大key處理採用以下方式:len <= 5192,直接取全量field、value進行比較,使用如下命令:hgetall,smembers,zrange 0 -1 withscores,lrange 0 -1。len > 5192,使用hscan,sscan,zscan,lrange分批取field和value。使用redis-full-check解壓redis-full-check.tar.gz:tar -xvf redis-full-check.tar.gz
執行如下命令進行資料校驗:單機範例之間進行資料對比檢測
./redis-full-check -s $(source_redis_ip_port) -p $(source_password) -t $(target_redis_ip_port) -a $(target_password)
叢集範例之間進行資料對比檢測
./redis-full-check -s "<Redis叢集地址1連線地址:Redis叢集地址1埠號;Redis叢集地址2連線地址:Redis叢集地址2埠號;Redis叢集地址3連線地址:Redis叢集地址3埠號>" -p <Redis叢集密碼> -t <Redis連線地址:Redis埠號> -a <Redis密碼> --comparemode=1 --comparetimes=1 --qps=10 --batchcount=100 --sourcedbtype=1 --targetdbfilterlist=0
redis-full-check中主要引數如下:
-s, --source=SOURCE 源redis庫地址(ip:port),如果是叢集版,那麼需要以分號(;)分割不同的db,只需要設定主或者從的其中之一。例如:10.1.1.1:1000;10.2.2.2:2000;10.3.3.3:3000。 -p, --sourcepassword=Password 源redis庫密碼 --sourceauthtype=AUTH-TYPE 源庫管理許可權,開源reids下此引數無用。 --sourcedbtype= 源庫的類別,0:db(standalone單節點、主從),1: cluster(叢集版),2: 阿里雲 --sourcedbfilterlist= 源庫需要抓取的邏輯db白名單,以分號(;)分割,例如:0;5;15表示db0,db5和db15都會被抓取 -t, --target=TARGET 目的redis庫地址(ip:port) -a, --targetpassword=Password 目的redis庫密碼 --targetauthtype=AUTH-TYPE 目的庫管理許可權,開源reids下此引數無用。 --targetdbtype= 參考sourcedbtype --targetdbfilterlist= 參考sourcedbfilterlist -d, --db=Sqlite3-DB-FILE 對於差異的key儲存的sqlite3 db的位置,預設result.db --comparetimes=COUNT 比較輪數 -m, --comparemode= 比較模式,1表示全量比較,2表示只對比value的長度,3只對比key是否存在,4全量比較的情況下,忽略大key的比較 --id= 用於打metric --jobid= 用於打metric --taskid= 用於打metric -q, --qps= qps限速閾值 --interval=Second 每輪之間的時間間隔 --batchcount=COUNT 批次聚合的數量 --parallel=COUNT 比較的並行協程數,預設5 --log=FILE log檔案 --result=FILE 不一致結果記錄到result檔案中,格式:'db diff-type key field' --metric=FILE metric檔案 --bigkeythreshold=COUNT 大key拆分的閾值,用於comparemode=4 -f, --filterlist=FILTER 需要比較的key列表,以豎線(|)分割。例如:"abc*|efg|m*"表示對比'abc', 'abc1', 'efg', 'm', 'mxyz',不對比'efgh', 'p'。 -v, --version
對比實現案例對比2個主從版/單節點:
./redis-full-check -t 10.101.72.137:30661 -s 10.101.72.137:30551
對比主從和叢集:
./redis-full-check -s "100.81.164.177:21331;100.81.164.177:21332;100.81.164.177:21333" -t 10.101.72.137:30551 --comparemode=1 --comparetimes=1 --qps=10 --batchcount=100 --sourcedbtype=1 --targetdbfilterlist=0
由於叢集版只有db0,所以如果一端是叢集版,另一端是非叢集版(多個邏輯db),則需要新增sourcedbfilterlist或者targetdbfilterlist(非叢集版本的一端)
查詢對比結果
sqlite> select * from key; id key type conflict_type db source_len target_len ---------- --------------- ---------- ------------- ---------- ---------- ---------- 1 keydiff1_string string value 1 6 6 2 keydiff_hash hash value 0 2 1 3 keydiff_string string value 0 6 6 4 key_string_diff string value 0 6 6 5 keylack_string string lack_target 0 6 0 sqlite> sqlite> select * from field; id field conflict_type key_id ---------- ---------- ------------- ---------- 1 k1 lack_source 2 2 k2 value 2 3 k3 lack_target 2
redis-full-check判斷不一致的方式主要分為2類:key不一致和value不一致。
key不一致主要分為以下幾種情況:
lack_target : key存在於源庫,但不存在於目的庫。type: key存在於源庫和目的庫,但是型別不一致。value: key存在於源庫和目的庫,且型別一致,但是value不一致。value不一致不同資料型別有不同的對比標準:string: value不同。hash: 存在field,滿足下面3個條件之一: field存在於源端,但不存在與目的端。field存在於目的端,但不存在與源端。field同時存在於源和目的端,但是value不同。set/zset:與hash類似。list: 與hash類似。
field衝突型別有以下幾種情況(只存在於hash,set,zset,list型別key中)
lack_source: field存在於源端key,field不存在與目的端key。lack_target: field不存在與源端key,field存在於目的端key。value: field存在於源端key和目的端key,但是field對應的value不同。
到此這篇關於實現線上 + 離線模式進行遷移 Redis 資料實戰指南的文章就介紹到這了,更多相關遷移 Redis 資料實戰內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45