[TOC]
線上redis遷移思路
背景
實際應用中,我們的系統在上線後,總會遇到一些問題,需要對redis進行遷移,或者說切例項。但是由於是線上系統,一個是要謹慎,一個是要保證服務可用,在不停服的情況進行處理。
比如,我們的redis例項的機器當機、或者機器磁碟只讀、或者redis服務異常;或者需要rename一些高危命令;或者業務底層redis儲存機制更改。當我們遇到諸如此類的場景,那麼就需要考慮切redis例項了,下面就一些常用場景來一一舉例說明
一個大的前提是,業務訪問資源,建議都是通過域名來訪問,而不是ip來訪問。
遷移方案
遷移從庫
背景
如果redis例項所在機器異常,需要遷移,並且這個redis例項,是業務的從庫,業務這邊做了讀寫分離,寫主庫、讀從庫的話,切從庫是最容易實現的,基本就是DBA切個DNS,當前,前提是業務訪問是通過域名訪問而不是直接通過ip訪問
具體方案
假如主庫是7526
-
先從主庫上搭建新的從庫
-
7526 掛載新的例項host 並下掉老的例項Host
-
確定老的從庫的連線數,要保證老的從庫沒有連線,
- 可以通過info檢視client, 也可以client list 檢視
- DBA 可以通過監控檢視, 也可以通過登入redis主機檢視
-
如果老的從庫沒有連線了,並且新的從庫有連線,就說明切從庫例項ok
一般,通過DNS來解析的話,業務如果採用連線池等方式,那可能遷移的過程,業務需要重啟,才能保證馬上斷開連線,實際中就發現雖然ping 從庫域名已經是新的ip地址了,但是時間上,程式裡面連線的還是老的ip,這個時候需要重啟一下服務
遷移主庫
背景
如果redis例項所在機器異常,或者其他需要遷移,並且這個redis例項,是業務的主庫,那麼遷移主庫的流程,相對從庫的流程就稍微麻煩一點。
具體方案
前提如下:
m7614.xxx.redis.com 對應的IP是 192.168.xxx.93
s7614.xxx.redis.com 對應的ip是 192.168.xxx.94
思路:
提升從例項為主例項,然後把主從域名都指向從例項去,然後再搭建新的從庫
遷移流程是:
- 把192.168.xxx.94 slave_readonly 設定為no,並設定 slaveof no one(配置檔案刪slaveof 192.168.xxx.93 7614)
- 然後要注意192.168.xxx.94要同步完原主庫的資料,等資料同步完後,再把m7614.xxx.redis.com 解析改到 192.168.xxx.94,然後業務確定域名是否解析正常
- 業務這邊如果有長連線程式的話重啟相關程式 ,重啟老的主庫例項程式(程式端),確保老庫沒有連線
- 重新搭建從例項。
- 新從庫建好後,再重新搞一下從庫的域名並掛載到新從庫上
雙寫+遷移
背景
在某些場景下,如果直接切主庫、切從庫都不合適,可能會導致資料不一致或者資料丟失;或者需要停服或者短暫停寫的情況下,我們就要考慮雙寫+遷移策略,雙寫+遷移策略是萬能的,不僅僅針對redis,其他資源如mysql等也是好使的。
這個方案稍微繁瑣一點,但是有個好處就是一定保證不停服,不影響使用者,並且能夠回滾,保證資料一致性。缺點就是需要業務方在修改程式碼,並且再程式碼裡面增加開關配置,好的做法是通過配置檔案就能夠開啟雙寫、讀寫新庫等
具體方案
- 業務方修改程式碼,增加雙寫配置開關,然後更新上線
- 再在程式碼裡面開啟雙寫,也就是新庫老庫都寫
- 後臺程式或者指令碼進行資料同步,把老庫的資料同步到新庫中,並要做check,確保資料一定是一致的
- 同步完成後,通過程式碼配置檔案來控制停止雙寫,讀寫新庫。
- 確保讀寫新庫ok後,再清掉老庫的某個遷移出去的db。
這個方案的兩個關鍵點在於:
- 程式碼裡面增加的雙寫開關配置,要做到抽象,確保通過配置,就能開啟雙寫配置、停止雙寫、讀寫新庫
- 後臺指令碼校驗程式要做好,確保資料的一致性
總結
以上幾種情況都是xxx專案在這一年多來遇到的,並且都是和運維、DBA一起做過遷移,算是一點點小經驗。 另外一點就是開發人員要能夠分析排查問題,遇到線上問題後,要能夠通過各種手段定位到原因,再給出合適的解決方案