天天看點

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

新增如下函數:

一個小改進,解決Redis資料線上加載大痛點

在執行 loadrdb 時候,調用函數rdbload,加載rdb檔案。

src/rdb.c

一個小改進,解決Redis資料線上加載大痛點

src/redis.c

在函數 struct rediscommand rediscommandtable[]

新增如下一行:

一個小改進,解決Redis資料線上加載大痛點

src/redis.h

在 void bgsavecommand(redisclient *c); 下面加入如下兩行:

一個小改進,解決Redis資料線上加載大痛點

src/help.h

在函數 struct commandhelp

新增如下内容:

一個小改進,解決Redis資料線上加載大痛點

編譯redis

一個小改進,解決Redis資料線上加載大痛點

測試結果 

一個小改進,解決Redis資料線上加載大痛點

可以看出,不重新開機redis,可以加載資料了。

應用場景 

1、線上資料導入到測試redis

一般開發由類似需求,用于分析問題和測試。

2、恢複資料

如果redis出現誤操作,可以執行線上加載資料,尤其是在sentinel(s)+redis主從複制架構中,該方法更加漸變。

注意點 

1、如果是redis主從複制,在主庫線上加載aofile/rdbfile時,從庫上也需要存在這些檔案,否則從庫報錯退出。

2、執行線上加載操作時候,同樣的檔案内容,不要重複執行,否則從庫異常退出。

如果主庫重複執行loadrdb 時候,主庫也會異常退出。

該方案還存在着不足之處,在這裡隻做抛磚引玉,希望和大家一起探讨改進,便于dba的快捷操作。

原文釋出時間為:2017-03-30

本文來自雲栖社群合作夥伴dbaplus