Redis 數(shù)據(jù)遷移的項(xiàng)目實(shí)踐
redis遷移
通過Redis-shake的sync(同步)模式,可以將Redis的數(shù)據(jù)實(shí)時(shí)遷移至另一套R(shí)edis環(huán)境。
前提條件: Redis的版本為2.8、3.0、3.2、4.0或5.0版本。
redis-shake 介紹
- redis-shake是阿里云用于Redis數(shù)據(jù)傳輸與過濾的開源工具,該工具易于部署,靈活高效。
- redis-shake的Sync(同步)模式支持全量數(shù)據(jù)遷移和增量數(shù)據(jù)遷移;
- Restore(恢復(fù))模式支持將本地RDB文件中的數(shù)據(jù)恢復(fù)至目標(biāo)端;
- Scan模式是使用SCAN命令來獲取源端Redis中的Key,然后使用DUMP命令獲取Key的值,最終使用RESTORE命令將Key(與其值)恢復(fù)至目標(biāo)端。
不同模式的同步流程如下圖所示:

注意事項(xiàng):
- 如果目標(biāo)庫(kù)的數(shù)據(jù)逐出策略(maxmemory-policy)配置為除noeviction以外的值,可能導(dǎo)致目標(biāo)庫(kù)的數(shù)據(jù)與源庫(kù)不一致。關(guān)于數(shù)據(jù)逐出策略詳情,請(qǐng)參見Redis數(shù)據(jù)逐出策略。
- 如果源庫(kù)中的部分Key使用了過期(Expire)機(jī)制,由于可能存在Key已過期但未被及時(shí)刪除的情形,在目標(biāo)庫(kù)中查看(如通過info命令)的Key數(shù)量會(huì)比源庫(kù)的Key數(shù)量少。
redis-shake 3.X 版本測(cè)試
redis-shake 3.X 下載
wget 'https://github.com/alibaba/RedisShake/releases/download/v3.1.7/redis-shake-linux-amd64.tar.gz'
redis-shake 3.X 解壓
mkdir redis-shake tar zxvf redis-shake-linux-amd64.tar.gz -C redis-shake
redis-shake 3.X 配置
我們使用redis-shake中sync模式,以下配置已sync配置為例
type = "sync" [source] version = 2.8 # redis version, such as 2.8, 4.0, 5.0, 6.0, 6.2, 7.0, ... address = "x.x.x.x:6379" username = "" # keep empty if not using ACL password = "xxxxxxx" # keep empty if no authentication is required tls = false elasticache_psync = "" # using when source is ElastiCache. ref: https://github.com/alibaba/RedisShake/issues/373 [target] type = "standalone" # "standalone" or "cluster" version = 2.8 # redis version, such as 2.8, 4.0, 5.0, 6.0, 6.2, 7.0, ... # When the target is a cluster, write the address of one of the nodes. # redis-shake will obtain other nodes through the `cluster nodes` command. address = "x.x.x.x:6379" username = "" # keep empty if not using ACL password = "xxxxxxx" # keep empty if no authentication is required tls = false [advanced] dir = "data" ncpu = 4 # runtime.GOMAXPROCS, 0 means use runtime.NumCPU() cpu cores pprof_port = 0 # pprof port, 0 means disable metrics_port = 0 # metric port, 0 means disable log_file = "redis-shake.log" log_level = "info" # debug, info or warn log_interval = 5 # in seconds rdb_restore_command_behavior = "skip" # panic, rewrite or skip pipeline_count_limit = 1024 # pipeline target_redis_client_max_querybuf_len = 1024_000_000 target_redis_proto_max_bulk_len = 512_000_000
redis-shake 3.X 啟動(dòng)
./redis-shake sync.toml

日志字段說明:
- allowOps:表示每秒向目標(biāo)庫(kù)發(fā)送多少條命令
- disallowOps:表示每秒過濾的命令數(shù)。
- entryId:從1開始計(jì)數(shù),表示redis-shake共處理多少條命令。
- InQueueEntriesCount:表示還剩余多少條命令待發(fā)送。
Redis數(shù)據(jù)逐出策略
volatile-lru 按照LRU算法逐出原有數(shù)據(jù),但僅逐出設(shè)置了過期時(shí)間的數(shù)據(jù)。
volatile-ttl 僅逐出設(shè)置了過期時(shí)間的數(shù)據(jù),并且是按照TTL由小到大的順序進(jìn)行逐出。
allkeys-lru 按照LRU算法逐出原有數(shù)據(jù)。
volatile-random 隨機(jī)逐出原有數(shù)據(jù),但僅逐出設(shè)置了過期時(shí)間的數(shù)據(jù)。
allkeys-random 隨機(jī)逐出原有數(shù)據(jù)。
noeviction 不逐出任何數(shù)據(jù),當(dāng)內(nèi)存已滿時(shí)新數(shù)據(jù)的寫入會(huì)得到一個(gè)錯(cuò)誤信息(DEL和某些其他的命令除外)。
volatile-lfu 按照LFU算法逐出原有數(shù)據(jù),只從設(shè)置了過期時(shí)間的key中選擇最不常用的key進(jìn)行刪除。
allkeys-lfu 按照LFU算法優(yōu)先逐出最不常用的key。
reids-shake 2.X 版本測(cè)試
reids-shake 2.X 下載
wget 'http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/120287/cn_zh/1608173646665/redis-shake-v2.0.3.tar.gz'
reids-shake 2.X 解壓
tar xzf redis-shake-v2.0.3.tar.gz
reids-shake 2.X 配置
conf.version = 1 #當(dāng)前配置文件版本號(hào),請(qǐng)不要修改 id = redis-shake log.file = #指定日志文件,不指定將打印到stdout log.level = info pid_path = #指定pid路徑,不指定默認(rèn)/var/run system_profile = 9310 http_profile = 9320 # metric端口號(hào) -1表示不啟用 parallel = 32 #啟動(dòng)多少個(gè)并發(fā)線程同步一個(gè)RDB文件,默認(rèn)32 source.type = sentinel #支持standalone,sentinel,cluster和proxy四種模式 source.address = sourcemaster:master@x.x.x.x:26379 source.password_raw = XXXXXXXXXXXXXXXXXXX source.auth_type = auth source.tls_enable = false source.rdb.input = local source.rdb.parallel = 0 source.rdb.special_cloud = target.type = sentinel target.address = targetmaster:master@x.x.x.x:26379 target.password_raw = XXXXXXXXXXXXXXXXXXX target.auth_type = auth target.db = -1 target.tls_enable = false target.rdb.output = local_dump target.version = 2.8 #目標(biāo)redis版本 fake_time = #處理過期的鍵值,當(dāng)遷移兩端不一致,目的端需要加上這個(gè)值 key_exists = ignore #當(dāng)源目的有重復(fù)的key,支持rewrite(覆蓋目的端key)、none(進(jìn)程直接退出)、ignore(保留目的端key,忽略源端key) filter.db.whitelist = 5;9 #指定通過的db 該配置db5、db9通過其他忽略 filter.db.blacklist = #指定過濾的db filter.key.whitelist = #指定特定前綴的key通過 filter.key.blacklist = #指定特定前綴的key過濾 filter.slot = filter.lua = false big_key_threshold = 524288000 #key不大直接調(diào)用restore寫入目的端,如果key對(duì)應(yīng)的value字節(jié)超過定制那么分批次一個(gè)一個(gè)寫入,如果目的端是Codis 該參數(shù)需要置1,目的端大版本小于源端,建議置1. metric = true metric.print_log = false sender.size = 104857600 #發(fā)送緩存的字節(jié)長(zhǎng)度,超過這個(gè)閾值將會(huì)強(qiáng)行刷緩存發(fā)送 sender.count = 4095 #發(fā)送緩存的報(bào)文個(gè)數(shù),超過這個(gè)閾值將會(huì)強(qiáng)行刷緩存發(fā)送 sender.delay_channel_size = 65535 # 用于metric統(tǒng)計(jì)時(shí)延的隊(duì)列 keep_alive = 0 # TCP keep-alive?;顓?shù),單位秒,0表示不啟用。 scan.key_number = 50 # 每次scan的個(gè)數(shù),不配置則默認(rèn)100. scan.special_cloud = #有些版本具有特殊格式目前支持騰訊云的集群版"tencent_cluster"、阿里云的集群版"aliyun_cluster",主從版本不需要,只針對(duì)集群版。 scan.key_file = #有些云版本,不支持sync/psync,也不支持scan,我們支持從文件中進(jìn)行讀取所有key列表并進(jìn)行抓?。阂恍幸粋€(gè)key。 qps = 200000 #每秒傳輸key的個(gè)數(shù) resume_from_break_point = false #斷點(diǎn)續(xù)傳 replace_hash_tag = false
reids-shake 2.X 啟動(dòng)
./redis-shake.linux -type=sync -conf=redis-shake.conf

字段說明:
- forwardCommands:源庫(kù)發(fā)送過來的命令數(shù)。
- filterCommands:被過濾的命令數(shù),例如在Redis-shake配置文件中設(shè)置了過濾某些庫(kù)。
- writeBytes:源庫(kù)發(fā)送過來的字節(jié)數(shù)。
到此這篇關(guān)于Redis 數(shù)據(jù)遷移的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Redis 數(shù)據(jù)遷移內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Redis實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制
JWT是一種輕量級(jí)的身份驗(yàn)證和授權(quán)機(jī)制,它是一種 JSON 格式的數(shù)據(jù)串,通常用于客戶端和服務(wù)端之間的單點(diǎn)登錄(Single Sign-On, SSO)場(chǎng)景,本文給大家介紹了如何使用Redis來實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制,需要的朋友可以參考下2024-08-08
如何保證Redis與數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性
這篇文章主要介紹了如何保證Redis與數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性,文中舉了兩個(gè)場(chǎng)景例子介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
redis緩存數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了redis緩存數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
基于Redis實(shí)現(xiàn)分布式鎖的方法(lua腳本版)
這篇文章主要介紹了基于Redis實(shí)現(xiàn)分布式鎖的方法(lua腳本版),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
Redis集群的節(jié)點(diǎn)之間通信的實(shí)現(xiàn)
Redis集群的節(jié)點(diǎn)之間通過Gossip協(xié)議進(jìn)行通信,在Redis集群中,Gossip協(xié)議用于節(jié)點(diǎn)之間的狀態(tài)同步和故障檢測(cè),下面就來詳細(xì)的介紹一下Redis集群節(jié)點(diǎn)通信,感興趣的可以了解一下2025-09-09
Redis數(shù)據(jù)庫(kù)存儲(chǔ)鍵值對(duì)的底層原理分析
Redis是一種內(nèi)存數(shù)據(jù)庫(kù),使用哈希表存儲(chǔ)鍵值對(duì),它通過哈希函數(shù)計(jì)算鍵的存儲(chǔ)地址,并通過地址找到數(shù)據(jù),當(dāng)出現(xiàn)哈希沖突時(shí),Redis使用鏈地址法解決,為優(yōu)化性能,Redis采用漸進(jìn)式哈希表遷移技術(shù),逐步將數(shù)據(jù)從舊哈希表遷移到新哈希表,減少對(duì)業(yè)務(wù)的影響2026-03-03
Redis分布式鎖如何自動(dòng)續(xù)期的實(shí)現(xiàn)
本文主要介紹了Redis分布式鎖如何自動(dòng)續(xù)期的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

