作者介紹
顧偉濤,曾任職于百度、奇虎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
新增如下函數:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQjNxkDN5MDMxAzMzAzNxAjMvwFMzMDMvw1NxAjMvwVZslmZkF2bsBXdvwlbj5yc1xGchJGZvw1LcpDc0RHaiojIsJye.png)
在執行 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