devops| redis 數(shù)據(jù)量暴漲進(jìn)行數(shù)據(jù)清理實戰(zhàn)

date: 2018-4-17 21:57:44
title: devops| redis 數(shù)據(jù)量暴漲進(jìn)行數(shù)據(jù)清理實戰(zhàn)
description: redis 作為程序員的 「瑞士軍刀」, 在現(xiàn)有業(yè)務(wù)中扮演著重要的角色. 為了避免觸雷, 「保衛(wèi)世界和平」, 對 redis 數(shù)據(jù)進(jìn)行分析并清理.

最近一段時間, 需求爆發(fā)式增長, 業(yè)務(wù)量也蹭蹭蹭上漲, 也伴隨著一些新的煩惱, 線上 redis 服務(wù), 頻繁觸發(fā)容量超出 80% 閥值報警. 而 redis 作為程序員的 「瑞士軍刀」, 在現(xiàn)有業(yè)務(wù)中扮演著重要的角色. 為了避免觸雷, 「保衛(wèi)世界和平」, 對 redis 數(shù)據(jù)進(jìn)行分析并清理.

快速尋找解決辦法

業(yè)務(wù)使用的阿里云的 redis 服務(wù), 報警也是使用阿里云上設(shè)置的, 比如下面這個模板:

aliyun-redis-monitor

容量不夠用, 首先想到的就是 redis 的淘汰機(jī)制, 對應(yīng)的設(shè)置:

aliyun-redis-maxmemory

各個淘汰機(jī)制不作過多介紹, 感興趣可以搜索網(wǎng)上更詳細(xì)的資料進(jìn)行了解. 現(xiàn)有的淘汰機(jī)制是符合現(xiàn)有業(yè)務(wù)特點的, 那就需要從其他地方下功夫了.

快速的在阿里云 redis 服務(wù)控制面板中瀏覽了一圈, 沒有發(fā)現(xiàn)相關(guān)的設(shè)置, 于是轉(zhuǎn)向百度. 嘗試 redis 容量超過閥值 redis 數(shù)據(jù)分析 redis 數(shù)據(jù)清理 等關(guān)鍵詞后, 依然沒有找到相關(guān)的答案.

最后, 向技術(shù)社區(qū)進(jìn)行求助 -- Swoole 開發(fā)者 微信交流群. 剛一拋出問題, 就找到需要的答案了.

@daydaygo 我搞過七芭,我們公司濫用redis,緩存和數(shù)據(jù)庫都在用刚照。最后搞了個腳本未檩,scan所有key了袁,統(tǒng)計前綴,然后根據(jù)前綴對應(yīng)到業(yè)務(wù)中,再挨個干掉。當(dāng)然淘汰機(jī)制和swap都得上戚宦。 -- Mr.Xie

@Mr. Xie 推薦工具 https://github.com/sripathikrishnan/redis-rdb-tools -- ForzaDong
這個有嘗試過,好像因為dump太大锈嫩,分析老是失敗受楼,就放棄了。 當(dāng)時有 20G, 現(xiàn)在減半了.  -- Mr.Xie
2G跑了10多分鐘吧, 你分析前100就行了, 不用全部分析. -- ForzaDong
當(dāng)時內(nèi)存耗光呼寸,bgsave失敗艳汽,也沒有啟swap,比較緊急对雪,沒想那么多河狐。 -- Mr.Xie

代碼審計, redis 存儲空間的回收. 只會 set get 不考慮 del 的程序員, 不是好程序員. -- 如果的如果
用完就的釋放, 這要養(yǎng)成習(xí)慣. -- dbq
都知道重要, 但大多數(shù)都趕工期. -- zhanghan

bigscan? 使用 --bigkeys 參數(shù). -- Leandre

挑選了聊天中的部分, 不僅有解決方法, 還有寶貴的一線經(jīng)驗.

數(shù)據(jù)清理實戰(zhàn)

  • 下載阿里云的備份數(shù)據(jù)到本地進(jìn)行分析

[圖片上傳失敗...(image-5fc52a-1523981140107)]

下載獲取 redis 的 .rdb 備份文件

有 go/php 2個語言支持, go 語言示例:

analysis := NewAnalysis()
//Open redis: 127.0.0.1:6379 without password
err := analysis.Open("127.0.0.1", 6379, "")
defer analysis.Close()
if err != nil {
    fmt.Println("something wrong:", err)
    return
}

//Scan the keys which can be split by '#' ':'
//Special pattern characters need to escape by '\'
analysis.Start([]string{"#", ":"})

//Find the csv file in default target folder: ./reports
//CSV file name format: redis-analysis-{host:port}-{db}.csv
//The keys order by count desc
analysis.SaveReports("./reports")

分析的效果:

image

PS: 需要將 .rdb 文件中的數(shù)據(jù), 導(dǎo)入到本地的 redis 服務(wù)器中, 然后使用此工具進(jìn)行分析

  • 工具二(推薦): redis-rdb-tools

sripathikrishnan/redis-rdb-tools
阿里云幫助文檔 > 云數(shù)據(jù)庫 Redis 版 > 最佳實踐 > Redis 內(nèi)存分析方法

推薦使用此工具, 阿里云的幫助文檔列舉了詳細(xì)的使用方法, 這里就不過多解釋了.

PS: 阿里云幫助文檔有空可以多看看, 尤其是里面的 最佳實踐

寫在最后

redis 作為程序員的 「瑞士軍刀」, 對它多一點了解, 可以說是 性價比很高 的一件事兒, 這里再推薦幾個資源:

aliyun redis 開發(fā)規(guī)范
如何提取Redis中的大KEY -- 使用 –bigkeys 參數(shù)
Redis危險命令重命名、禁用

keys * 使用 scan 命令進(jìn)行重寫(PHP版本, 代碼來自 yuchen 大大):

public static function redisKeys($redis, $pattern, $step, $callback=NULL) {
    if (strpos($pattern, '*') === false) {
        throw new \ErrorException('none * in pattern');
    }

    $ret = [];
    $cursor = 0;
    do {
        $redis_query = $redis->scan($cursor, 'match', $pattern, 'count', $step);
        if (! empty($redis_query[1])) {
            if (is_callable($callback)) {
                $_ret = call_user_func($callback, $redis_query[1]);
                if ( false === $_ret ) {
                    break;
                }
                else if ((! empty($_ret)) && is_array($_ret)) {
                    $ret = array_merge($ret, $_ret);
                }
            }
            else {
                $ret = array_merge($ret, $redis_query[1]);
            }
        }

        $cursor = $redis_query[0];
    } while ($cursor != 0);

    return $ret;
}

感謝 Swoole 開發(fā)者微信交流群 里的各位大大給出的指導(dǎo)~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瑟捣,一起剝皮案震驚了整個濱河市馋艺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迈套,老刑警劉巖捐祠,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桑李,居然都是意外死亡踱蛀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門贵白,熙熙樓的掌柜王于貴愁眉苦臉地迎上來率拒,“玉大人,你說我怎么就攤上這事禁荒∏伍伲” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵圈浇,是天一觀的道長寥掐。 經(jīng)常有香客問我靴寂,道長,這世上最難降的妖魔是什么召耘? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任百炬,我火速辦了婚禮,結(jié)果婚禮上污它,老公的妹妹穿的比我還像新娘剖踊。我一直安慰自己,他們只是感情好衫贬,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布德澈。 她就那樣靜靜地躺著,像睡著了一般固惯。 火紅的嫁衣襯著肌膚如雪梆造。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天葬毫,我揣著相機(jī)與錄音镇辉,去河邊找鬼。 笑死贴捡,一個胖子當(dāng)著我的面吹牛忽肛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烂斋,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼屹逛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汛骂?” 一聲冷哼從身側(cè)響起罕模,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎香缺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歇僧,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡图张,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诈悍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祸轮。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侥钳,靈堂內(nèi)的尸體忽然破棺而出适袜,到底是詐尸還是另有隱情,我是刑警寧澤舷夺,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布苦酱,位于F島的核電站售貌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疫萤。R本人自食惡果不足惜颂跨,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扯饶。 院中可真熱鬧恒削,春花似錦、人聲如沸尾序。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽每币。三九已至携丁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脯爪,已是汗流浹背则北。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留痕慢,地道東北人尚揣。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像掖举,于是被迫代替她去往敵國和親快骗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容