Redis的數據同步

RedisShake使用

RedisShake可以用于數據的遷移和同步蹋笼。

遷移的場景很好理解堪置,比如原先的時候多個業(yè)務使用一個redis殃饿,然后為了避免相互影響饮寞,這個時候需要把緩存也拆分出來(特別在業(yè)務初創(chuàng)時期)孝扛。
同步的場景的話列吼,可以用在主備雙活。因為一般調用的鏈路是vip->proxy->redis集群苦始,如果vip發(fā)生了網絡抖動可能會導致redis讀取失敗寞钥,如果做純緩存應用的話可以有數據庫兜底還好(雖然可能預熱期間會導致數據庫壓力增加),如果用redis當持久存儲的業(yè)務來說陌选,就會導致業(yè)務方調用失敗理郑,造成業(yè)務不可用。這個時候如果有備集群的話咨油,可以很好的切換(最簡單的直接修改vip的轉發(fā)您炉,nginx是可以無損重啟的)
也可以用在異地多活,具體設計可以看下阿里云的redis災備介紹中有一小節(jié)介紹跨地域容災役电。

github地址

項目github的地址 https://github.com/alibaba/RedisShake/releases
可以下載source code進行編譯赚爵,也可以直接下載二進制版。

說明文檔

第一次使用法瑟,如何進行配置
通過Redis-shake將自建Redis遷移至阿里云

配置文件說明

sync模式配置以下幾個內容, 包括source.type冀膝,source.address,source.password_raw霎挟,target.type窝剖,target.address,target.password_raw 6個配置酥夭。
具體配置見 第一次使用赐纱,如何進行配置

啟動命令

./redis-shake -conf=redis-shake.conf -type=sync

單個節(jié)點到單個節(jié)點配置舉例

  1. 下載redis源碼,地址 https://github.com/redis/redis/releases/tag/6.0.9
  2. 編譯源碼 make

不一定需要make install

  1. 啟動兩個服務端
./redis-server --port 6380
./redis-server --port 6381
  1. 下載redis-shake的二進制包
wget https://github.com/alibaba/RedisShake/releases/download/release-v2.0.3-20200724/redis-shake-v2.0.3.tar.gz
  1. 配置redis-shake文件采郎,然后啟動redis-shake

沒有設置密碼的話不用填寫

source.type = standalone
source.address = 127.0.0.1:6380
source.password_raw = 

target.type = standalone
target.address = 127.0.0.1:6381
target.password_raw =
  1. 啟動redis-shake
    這邊看你的環(huán)境如果是mac os就用darwin后綴的千所,如果是linux用linux后綴
cp redis-shake.conf redis-shake-standalone.conf
./redis-shake.darwin -conf=redis-shake-standalone.conf -type=sync
  1. 在source的redis db (端口號6380)中輸入一些命令
    redis有5種類型的數據結構狂魔,都試下
redis-cli -h 127.0.0.1 -p 6380

set hello world

hset user:zihao name zihao age 28 sex male
hset user:xmz name xmz age 26 sex female

SADD phone apple sanxing huawei

lpush city hangzhou suzhou chengdu

ZADD stu_score 100 zihao 99 xmz 90 zpy
  1. 查看target的redis db中數據
edis-cli -h 127.0.0.1 -p 6381

localhost:6381> keys *
1) "city"
2) "user:xmz"
3) "stu_score"
4) "hello"
5) "phone"
6) "user:zihao"

集群cluster到集群cluster配置舉例

集群直接使用docker運行蒜埋,redis-cluster鏡像地址
1.啟動1個redis集群,命名為cluster1

docker run -p 7000-7005:7000-7005 -d --name cluster1 grokzen/redis-cluster:6.0.9

2.啟動另1個redis集群最楷,命名為cluster2

docker run -p 8000-8005:7000-7005 -d --name cluster2 grokzen/redis-cluster:6.0.9

3.獲取cluster1和cluster2的集群信息

redis-cli -h localhost -p 7000 -c
localhost:7000> CLUSTER NODES

redis-cli -h localhost -p 8000 -c
localhost:7000> CLUSTER NODES

4.redis-shake文件配置
這邊有兩種配置一種是自動發(fā)現的整份,一種把所有master或者slave寫上。具體看上面的github文檔

source.type = cluster
source.address = master@127.0.0.1:7000
source.password_raw = 

target.type = cluster
target.address = master@127.0.0.1:8000
target.password_raw =

5.啟動redis-shake

cp redis-shake.conf redis-shake-cluster.conf
./redis-shake.linux -conf=redis-shake-cluster.conf -type=sync

6.在source的redis-cluster(cluster1)輸入一些命令

set hello world

hset user:zihao name zihao age 28 sex male
hset user:xmz name xmz age 26 sex female

SADD phone apple sanxing huawei

lpush city hangzhou suzhou chengdu

ZADD stu_score 100 zihao 99 xmz 90 zpy
  1. 在target的redis-cluster(2)查看
172.17.0.3:7002> get hello
-> Redirected to slot [866] located at 172.17.0.3:7000
"world"

172.17.0.3:7002> hgetall user:zihao
1) "name"
2) "zihao"
3) "age"
4) "28"
5) "sex"
6) "male"

172.17.0.3:7000> SMEMBERS phone
-> Redirected to slot [8939] located at 172.17.0.3:7001
1) "huawei"
2) "sanxing"
3) "apple"

172.17.0.3:7001> LRANGE city 0 -1
-> Redirected to slot [11479] located at 172.17.0.3:7002
1) "chengdu"
2) "suzhou"
3) "hangzhou"

172.17.0.3:7001> ZRANGE stu_score 0 -1
1) "zpy"
2) "xmz"
3) "zihao"

集群版cluster到proxy配置舉例

這邊proxy使用的是codis (阿里云的集群版redis也是使用proxy模式的籽孙,阿里云的redis架構)烈评。

搭建一個codis集群環(huán)境

  1. 獲取codis的二進制安裝包 https://github.com/CodisLabs/codis/releases/download/3.2.2/codis3.2.2-go1.8.5-linux.tar.gz
  2. 依次啟動各個組件
    具體的配置細節(jié)本文不做過多描述,詳情見 https://github.com/CodisLabs/codis/blob/release3.2/doc/tutorial_zh.md
  • 啟動zk
docker run --name "Codis-Z2181" -d --read-only -p 2181:2181 jplock/zookeeper
  • 啟動dashboard
#dashboard.toml https://github.com/CodisLabs/codis/blob/release3.2/config/dashboard.toml
#coordinator_name和coordinator_addr改成zk
nohup ./codis-dashboard --ncpu=4 --config=dashboard.toml --log=dashboard.log --log-level=WARN &
  • 啟動proxy
#proxy.toml https://github.com/CodisLabs/codis/blob/release3.2/config/proxy.toml
nohup ./codis-proxy --ncpu=4 --config=proxy.toml --log=proxy.log --log-level=WARN &
  • 啟動codis server
    這邊啟動4臺
nohup ./codis-server --port 6379 &
 nohup ./codis-server --port 6380 &
 nohup ./codis-server --port 6381 &
 nohup ./codis-server --port 6382 &

可以通過redis-cli分別連接測試下連接通不通

redis-cli -h localhost -p 6379
  • 啟動codis fe
nohup ./codis-fe --ncpu=4 --log=fe.log --log-level=WARN --zookeeper=127.0.0.1:2181 --listen=0.0.0.0:8080 &

3.通過fe配置codis集群
打開localhost:8080的頁面
? 添加proxy
通過proxy.toml的admin_addr地址添加


添加proxy.png
  • 添加group


    添加group.png
  • 添加server


    添加server.png
  • 分配slot


    分配slot.png

codis連接測試

[root@JD codis3.2.2-go1.8.5-linux]# redis-cli -h localhost -p 19000
localhost:19000> set hello world
OK
localhost:19000> get hello
"world"

啟動redis-shake將redis-cluster的數據同步到codis

  • 配置redis-shake
source.type = cluster
source.address = master@127.0.0.1:7000
source.password_raw = 

target.type = proxy
target.address = 127.0.0.1:19000
target.password_raw =

#源端的redis版本是6.0.9,target版本的redis版本比較低 所以需要設置這個 不然會報restore的錯誤 
big_key_threshold=1
  • 啟動redis-shake
cp redis-shake.conf redis-shake-proxy.conf
./redis-shake.linux -conf=redis-shake-proxy.conf -type=sync

RedisFullCheck

github地址

https://github.com/alibaba/RedisFullCheck

說明文檔

使用

./redis-full-check -s "172.17.0.2:7000;172.17.0.2:7001;172.17.0.2:7002" -t "172.17.0.4:7000;172.17.0.4:7001;172.17.0.4:7002" --comparemode=1 --comparetimes=1 --qps=10 --batchcount=100 --sourcedbtype=1 --targetdbtype=1 --targetdbfilterlist=0

比對結果輸出

[root@JD redis-full-check-1.4.8]# ./redis-full-check -s "172.17.0.2:7000;172.17.0.2:7001;172.17.0.2:7002" -t "172.17.0.4:7000;172.17.0.4:7001;172.17.0.4:7002" --comparemode=1 --comparetimes=1 --qps=10 --batchcount=100 --sourcedbtype=1 --targetdbtype=1 --targetdbfilterlist=0
[INFO 2021-04-08-17:45:41 main.go:65]: init log success
[INFO 2021-04-08-17:45:41 main.go:168]: configuration: {172.17.0.2:7000;172.17.0.2:7001;172.17.0.2:7002  auth 1 -1 172.17.0.4:7000;172.17.0.4:7001;172.17.0.4:7002  auth 1 0 result.db  1 1 unknown unknown unknown 10 5 100 5   false 16384  20445 false}
[INFO 2021-04-08-17:45:41 main.go:170]: ---------
[INFO 2021-04-08-17:45:41 full_check.go:238]: sourceDbType=1, p.sourcePhysicalDBList=[172.17.0.2:7000 172.17.0.2:7001 172.17.0.2:7002]
[INFO 2021-04-08-17:45:41 full_check.go:241]: db=0:keys=0(inaccurate for type cluster)
[INFO 2021-04-08-17:45:41 full_check.go:253]: ---------------- start 1th time compare
[INFO 2021-04-08-17:45:41 full_check.go:278]: start compare db 0
[INFO 2021-04-08-17:45:41 scan.go:20]: build connection[source redis addr: [172.17.0.2:7000]]
[INFO 2021-04-08-17:45:41 scan.go:20]: build connection[source redis addr: [172.17.0.2:7001]]
[INFO 2021-04-08-17:45:41 scan.go:20]: build connection[source redis addr: [172.17.0.2:7002]]
[INFO 2021-04-08-17:45:42 full_check.go:203]: stat:
times:1, db:0, dbkeys:0, finish:-1%, finished:true
KeyScan:{6 6 0}
KeyEqualAtLast|string|equal|{1 1 0}
KeyEqualAtLast|hash|equal|{2 2 0}
KeyEqualAtLast|list|equal|{1 1 0}
KeyEqualAtLast|set|equal|{1 1 0}
KeyEqualAtLast|zset|equal|{1 1 0}
FieldEqualAtLast|hash|equal|{6 6 0}
FieldEqualAtLast|set|equal|{3 3 0}
FieldEqualAtLast|zset|equal|{3 3 0}

[INFO 2021-04-08-17:45:42 full_check.go:328]: --------------- finished! ----------------
all finish successfully, totally 0 key(s) and 0 field(s) conflict
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末讲冠,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子适瓦,更是在濱河造成了極大的恐慌竿开,老刑警劉巖谱仪,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異否彩,居然都是意外死亡疯攒,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門列荔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敬尺,“玉大人,你說我怎么就攤上這事贴浙∩巴蹋” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵崎溃,是天一觀的道長呜舒。 經常有香客問我,道長笨奠,這世上最難降的妖魔是什么袭蝗? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮般婆,結果婚禮上到腥,老公的妹妹穿的比我還像新娘。我一直安慰自己蔚袍,他們只是感情好乡范,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啤咽,像睡著了一般晋辆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宇整,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天瓶佳,我揣著相機與錄音,去河邊找鬼鳞青。 笑死霸饲,一個胖子當著我的面吹牛,可吹牛的內容都是我干的臂拓。 我是一名探鬼主播厚脉,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胶惰!你這毒婦竟也來了傻工?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎中捆,沒想到半個月后威鹿,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡轨香,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年忽你,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臂容。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡科雳,死狀恐怖,靈堂內的尸體忽然破棺而出脓杉,到底是詐尸還是另有隱情糟秘,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布球散,位于F島的核電站尿赚,受9級特大地震影響,放射性物質發(fā)生泄漏蕉堰。R本人自食惡果不足惜凌净,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屋讶。 院中可真熱鬧冰寻,春花似錦、人聲如沸皿渗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乐疆。三九已至划乖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挤土,已是汗流浹背琴庵。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耕挨,地道東北人细卧。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓尉桩,卻偏偏與公主長得像筒占,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜘犁,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容