閱讀415 返回首頁    go 技術社區[雲棲]


一個小改進,解決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

\

 

測試結果 

 

20170330104157320.jpg

 

可以看出,不重啟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

  上一篇:go  當紅架構Cloud Native,怎麼搭建才能成為上雲助攻手?
  下一篇:go  告警:IO利用率飆至60%+,請及時排查優化!