前言
最近在做中間件升級工作,發現服務器redis版本較低3.2.3,為了更好利用redis新特性,於是打算把redis升級到新版本6.0.9。
注意:redis 偶數為穩定版本,奇數為開發版本。下面是升級版本的兩種方法:
- 線上平滑升級
- 離線手動升級
線上平滑升級
為了能夠降低服務中斷時間對應用產生的影響,我們首先在另外一台服務器上,配置要升級服務器的從庫,做為“替身”,然后做如下步驟。
- 配置好從庫“替身”,執行命令:slaveof 10.xxx.xxx.xxx 6379 同步數據,需要等待一段時間主庫把數據同步到從庫,這期間可以使用
info replication查看對比slave和master offset 復制偏移量。 - 讓替身
slave成為線上機器,同步完成后,將slave-read-only設置為no。 - 將線上流量引入到
slave上, 此時slave成為線上機器,查看線上機器的QPS,直至為0。 - 趁此時,卸載線上的
舊Redis,然后安裝新版本的Redis。 - 新版本的
Redis作為slave同步線上Redis的數據,同步完成后同樣將slave-read-only設置為no, 然后將線上流量引回來,此時查看剛才的替身Redis的QPS為0即可。
redis請求的
QPS最好的方法就是通過
monitor來實現:
redis-cli -h 127.0.0.1 -p 6379 monitor | cut -d "." -f1 | uniq -c
可以通過ss -anp | grep redis:port 命令 查看連接情況:
ss -anp | grep .7777

然后可以通過ps aux命令查看具體是什么命令在連接redis:
ps aux|grep 22982

離線手動升級
離線手動升級Redis,采用以下方案進行,這也是我在生產環境使用的方案。
- 在新的三台服務器上安裝部署最新穩定版本(6.0.9)的Redis集群;
- 使用Redis-Shake工具,將舊Redis集群上的數據遷移到新Redis集群,並驗證數據完整性;
- 修改相關應用的配置,指向新Redis集群地址,然后重啟相關應用的服務;
- 通知相關業務人員進行業務驗證,新Redis集群開始運行;
- 新Redis集群穩定運行一段時候后,將舊Redis集群進行下線操作。
1、搭建新的集群
請參考:https://www.cnblogs.com/caoweixiong/p/14235807.html
2、使用Redis-Shake遷移數據
- 下載Redis-Shake
cd /opt wget https://github.com/alibaba/RedisShake/releases/download/release-v2.0.3-20200724/redis-shake-v2.0.3.tar.gz tar -xvf redis-shake-v2.0.3.tar.gz cd redis-shake-v2.0.3 ls -l

- 配置Redis-Shake
1、獲取源集群和目標集群的Master節點和IP:
redis-cli -h {redis_address} -p {redis_port} cluster nodes
在命令返回的結果中,獲取所有master節點的IP端口,如下如所示:

2、編輯RedisShake配置文件:
編輯redis-shake工具配置文件redis-shake.conf,補充源端與目標端所有master節點的連接信息:
log.file = /var/log/redis-shake.log source.type = cluster source.address = 172.16.0.150:7000;172.16.0.150:7001;172.16.0.150:7002;172.16.0.151:7000;172.16.0.151:7001;172.16.0.151:7002 #源端集群master節點 target.address = 172.16.0.89:7000; 172.16.0.89:7001;172.16.0.89:7002;172.16.0.90:7000;172.16.0.90:7001;172.16.0.90:7002 #目標集群master節點 target.rdb.output = local_dump key_exists = rewrite
- 在線遷移(實時同步數據)
1、使用如下命令同步源Redis集群和目標Redis集群數據:
./redis-shake -type sync -conf redis-shake.conf tail -1000f /var/log/redis-shake.log
2、執行日志中出現如下信息,代表全量數據同步完成,進入增量同步階段:
sync rdb done.
3、執行日志出現如下信息時,代表增量同步無新增內容:
sync: +forwardCommands=0 +filterCommands=0 +writeBytes=0
4、如果確定已經全部同步完成,且后續不會有新的業務數據進來,可手動停止同步(Ctrl + C)
redis-shake在線遷移示意圖:

- 離線遷移(備份文件導入)
1、使用以下命令從源集群中導出RDB文件:
./redis-shake.linux -type dump -conf redis-shake.conf
執行日志中出現如下信息時導出備份文件完成:

導出的文件存儲在RedisShake根目錄下:

2、使用以下命令把RDB文件導入到目標集群
編輯RedisShake配置文件:
source.rdb.input = local_dump.0;local_dump.1;local_dump.2;local_dump.3;local_dump.4;local_dump.5 #將需要導入的文件配置到source.rdb.input中
3、執行導入命令:
./redis-shake.linux -type restore -conf redis-shake.conf
執行日志中出現如下信息時導入文件完成:

- 遷移后驗證
數據同步結束后,可使用redis-cli工具連接Redis Cluster集群,通過info命令查看Keyspace中的Key數量,確認數據是否完整導入。

1、檢查對比源端集群和目標集群中的每一個master節點的keys數量是否一致。
2、檢查目標集群中的slave節點的keys數量是否跟master節點的一致。
3、如果數據不完整,可使用flushall或者flushdb命令清理實例中的緩存數據后重新同步。
參考:
- https://www.cnblogs.com/xingxia/p/redis_versions.html
- https://juejin.cn/post/6844903506801868807
- https://blog.csdn.net/jiahao1186/article/details/81038868
- https://developer.aliyun.com/article/691794
- https://github.com/alibaba/RedisShake/wiki/%E7%AC%AC%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%A6%82%E4%BD%95%E8%BF%9B%E8%A1%8C%E9%85%8D%E7%BD%AE%EF%BC%9F
