415
技術社區[雲棲]
一個小改進,解決Redis數據在線加載大痛點
作者介紹
顧偉濤,曾任職於百度、奇虎360,現為杭州銘師堂教育資深DBA,擅長數據庫監控、備份、高可用架構設計和自動化運維,對Redis和MongoDB方麵有深入研究,關注分布式存儲、大數據存儲、消息隊列、搜索引擎等後端技術。
前言
在使用Redis加載數據過程中存在一個問題,就是必須要重啟Redis服務,如果是Redis主從複製架構,這樣加載數據,是一件很麻煩的事情,筆者根據Redis啟動時加載數據的思想,對Redis進行了改進,實現了在線加載數據,在這裏和大家一起探討下。
設計與實現
本文以Redis 3.0.7為例,根據Redis在啟動過程中,加載數據的邏輯,為Redis增加了2個命令,分別為LOADAOF和LOADRDB,分別實現在線加載aof和rdb文件。
在執行 LOADAOF aofile時候,調用 loadAppendOnlyFile函數,加載aof文件數據。具體實現如下:
src/aof.c
新增如下函數:

在執行 LOADRDB 時候,調用函數rdbLoad,加載rdb文件。
src/rdb.c
新增如下函數:

src/Redis.c
在函數 struct RedisCommand RedisCommandTable[]
新增如下一行:

src/Redis.h
在 void bgsaveCommand(RedisClient *c); 下麵加入如下兩行:

src/help.h
在函數 struct commandHelp
新增如下內容:

編譯Redis

測試結果
可以看出,不重啟Redis,可以加載數據了。
應用場景
1、線上數據導入到測試Redis
一般開發由類似需求,用於分析問題和測試。
2、恢複數據
如果Redis出現誤操作,可以執行在線加載數據,尤其是在sentinel(s)+Redis主從複製架構中,該方法更加漸變。
注意點
1、如果是Redis主從複製,在主庫在線加載aofile/rdbfile時,從庫上也需要存在這些文件,否則從庫報錯退出。
2、執行在線加載操作時候,同樣的文件內容,不要重複執行,否則從庫異常退出。
如果主庫重複執行loadrdb 時候,主庫也會異常退出。
該方案還存在著不足之處,在這裏隻做拋磚引玉,希望和大家一起探討改進,便於DBA的快捷操作。
原文發布時間為:2017-03-30
本文來自雲棲社區合作夥伴DBAplus
最後更新:2017-05-16 11:32:25