Redis狀態(tài)監(jiān)控

2018年5月31日 星期四

09:52

背景

這個(gè)更簡(jiǎn)單,管理員不會(huì)做晶疼,所以得我們做。

需求

需求就對(duì)Redis進(jìn)行監(jiān)控又憨,當(dāng)然翠霍,這個(gè)需求說了和沒說一樣。

分析

既然要監(jiān)控蠢莺,那么就先理清監(jiān)控流程壶运,然后結(jié)合流程編寫腳本就好。

監(jiān)控流程

因?yàn)镽edis可以多實(shí)例部署浪秘,所以要自動(dòng)發(fā)現(xiàn)(主要是太懶所致)蒋情。

  1. 運(yùn)行腳本發(fā)現(xiàn)Redis實(shí)例監(jiān)聽端口;
  2. 測(cè)試端口Redis是否正常響應(yīng)耸携,如正常則返回實(shí)例信息棵癣。
  3. 根據(jù)實(shí)例信息,添加監(jiān)控項(xiàng)目夺衍。
  4. 監(jiān)控項(xiàng)目通過腳本獲取監(jiān)控?cái)?shù)據(jù)狈谊。

監(jiān)控參數(shù)

從網(wǎng)上了解到的信息,Redis的監(jiān)控可以分為以下2類:

  1. 狀態(tài),是否在正常運(yùn)行河劝;
  2. 性能壁榕,是否存在瓶頸;

系統(tǒng)資源我就不說了赎瞎,默認(rèn)監(jiān)控著的牌里。

Redis自帶的redis-cli名有一個(gè)monitor的選項(xiàng),用于實(shí)時(shí)查看系統(tǒng)的操作务甥,可以Debug用牡辽。

狀態(tài)指標(biāo)

指標(biāo)名稱 說明 閾值
redis_ping Redis存活 !=1
uptime_in_days 已啟動(dòng)天數(shù) <1
rdb_last_save_time 持久化時(shí)的上次保存時(shí)間 >1800
rdb_changes_since_last_save 未保存的操作數(shù)量 >1000
cluster_enabled 集群模式 !=1
cluster_info 集群狀態(tài) !=ok
cluster_slots 集群slot數(shù)量 !=16384
cluster_slots_fail 集群故障slots數(shù)量 >0
cluster_known_nodes 集群節(jié)點(diǎn)數(shù)量 <N(最小提供服務(wù)或者已知節(jié)點(diǎn)數(shù)量)。
connected_slaves 已連接的Slave數(shù)量 !=N(實(shí)際的Slave數(shù)量)
last_interaction_seconds Master和Slave上次交互后的時(shí)間 >30
link_down_since_seconds Master和Salve連接斷開后的時(shí)間 >60

性能指標(biāo)

指標(biāo)名稱 說明 閾值
connected_clients 當(dāng)前連接的客戶端數(shù)量 -
blocked_clients 正在等待的客戶端數(shù)量 >100
rejected_connections 達(dá)到maxclient限制后拒絕的連接數(shù)量 >200
key 數(shù)據(jù)庫中的鍵數(shù)量 -
keys_hit_rate 鍵空間的命中率敞临,命中/(命中+未命中) <0.8
key_misses 查詢失敗的鍵數(shù)量 -
instantaneous_ops_per_sec 每秒執(zhí)行命令數(shù) >100000
latest_fork_usec fork阻塞時(shí)間
latency 延遲時(shí)間
used_memory 已分配的內(nèi)存總量 >最大可用內(nèi)存
mem_fragmentation_ratio 內(nèi)存碎片百分比 >1.5
evicted_keys 被驅(qū)逐的鍵數(shù)量 >100

解決方案

使用說明

本地Redis态辛,自動(dòng)發(fā)現(xiàn)

zabbix_agentd的配置中增加如下參數(shù):

UserParameter=redis_discovery[*], /usr/local/zabbixagent/scripts/redis_status.sh $1
UserParameter=redis_info[*], /usr/local/zabbixagent/scripts/redis_status.sh -p $1 -m info -f $2 $3

本地Redis,指定端口

直接使用redis_info即可挺尿。

設(shè)置密碼

使用-a參數(shù)指定密碼奏黑。

支持參數(shù)

redis_info支持參數(shù)如下:

  • ping;
  • mem_utilization
  • hit_rate
  • 其他info模式支持的參數(shù)

腳本

具體腳本內(nèi)容如下编矾,請(qǐng)保存為redis_status.sh攀涵。

#!/bin/bash
#
# -------------------- Copyright --------------------
# FileName: redis_status.sh
# Description: Get status of Redis.
# Version: 1.1
# Date: 2018/05/21
# Author: Rex Kang
# Email: rex.kang@qq.com
# -------------------- History --------------------
# 2018/05/21: First version
# 2018/05/31: fix bug of full path of redis-cli 
# -------------------- End --------------------


CMD="/usr/local/bin/redis-cli"

fdiscover() {
    json="{'data': ["
    json_body=''

    instances=`netstat -ntpl | grep "redis" | awk -F'[ :]+' '{print $5}'`
    count=${#instances[@]}
    $DEBUG && echo -e "REDIS_COUNT:\t$count"

    for ((i=0; i<${count}; i++))
    do
        result="0"
        result=`/usr/bin/redis-cli -h ${SERVER} -p ${instances[$i]} ping 2>/dev/null | grep -c PONG`
        $DEBUG && echo -e "RESULT of ${instances[$i]}:\t$result"
        if [ $result = "1" ]; then
            json_body=${json_body}"{'{#${MACRO_VARNAME}}': '${instances[$i]}'},"
        fi
    done
 
    [ -n "${json_body}" ] && json_body=${json_body%?}
    $DEBUG && echo -e "\n"
    echo $json${json_body}"]}"
    return 0
}


finfo() {
    value=0
    $CLUSTER && CMD="$CMD -c"
    CMD="$CMD -h $SERVER -p $PORT"
    [ -n "$AUTH" ] && CMD="$CMD -a $AUTH"

    if [ $FIELD = 'ping' ]; then
        result=`$CMD ping 2>/dev/null 2>/dev/null | grep -c PONG`
        [ -n "$result" ] && echo $result || echo 0
    elif [ $FIELD = 'latency' ]; then
        resutl=`$CMD --latency 2>/dev/null | awk {'print $6'} | tr -d '[:cntrl:]'`
        [ -n "$result" ] && echo $result || echo 0
    elif [ $FIELD = 'intrinsic-latency' ]; then
        result=`$CMD --intrinsic-latency 5 2>/dev/null | grep 'avg latency' | awk {'print $6'} | tr -d '[:cntrl:]'`
        [ -n "$result" ] && echo $result || echo 0
    elif [ $FIELD = 'mem_utilization' ]; then
        mem_total=`$CMD info | grep "^total_system_memory:" | awk -F':' '{print $2}' | tr -d '[:cntrl:]'`
        mem_used=`$CMD info | grep "^used_memory:" | awk -F':' '{print $2}' | tr -d '[:cntrl:]'`
        $DEBUG && echo -e "RESULT:\t\t$mem_used, $mem_total"
        utilization=`echo "scale=4;$mem_used*100/$mem_total" | bc | awk '{printf("%0.2f", $0)}'`
        echo $utilization
    elif [ $FIELD = 'hit_rate' ]; then
        hit_rate=0
        hits=`$CMD info | grep "^keyspace_hits:" | awk -F':' '{print $2}' | tr -d '[:cntrl:]'`
        misses=`$CMD info | grep "^keyspace_misses:" | awk -F':' '{print $2}' | tr -d '[:cntrl:]'`
        $DEBUG && echo -e "RESULT:\t\t$hits + $misses"
        total=`expr $hits + $misses`
        if [ $total -ne 0 ]; then
            hit_rate=`echo "scale=4;$hits*100/$total" | bc | awk '{printf("%0.2f", $0)}'`
        fi
        echo $hit_rate
    else
        result=`$CMD info | grep "^${FIELD}:"`
        $DEBUG && echo -e "RESULT:\t$result"
        $DEBUG && echo -e "CMD:\t $CMD info | grep '${FIELD}:'"
        if [ -n "$result" ]; then
            echo $result | awk -F':' '{print $2}'
        else
            echo 0
        fi
    fi

    return 0
}


usage() {
    echo -e "usage:\t$1 [-dh ][-s server] [-p port] [-a auth]"
    echo -e "\t [-m discover|info] [-f field]"
    echo -e "\nDiscover mode parameters:"
    echo -e "-s server\t\tDefault is 127.0.0.1"
    echo -e "-p port\t\tDefault is '6379"
    echo -e "-a pass\t\tThe pass if configured"
    echo -e "[-m discover]\t\tDefault mode is discover"

    echo -e "\nInfo mode parameters:"
    echo -e "-s server\t\tDefault is 127.0.0.1"
    echo -e "-p port\t\tDefault is '6379"
    echo -e "-a pass\t\tThe pass if configured"
    echo -e "-m info\t\t\tGet info of redis"
    echo -e "-f field\t\tGet info of specified field"
    echo -e "\nPlease modified var CMD in this file.
    return 0
}

main () {
    DISCOVER=true
    DEBUG=false

    MACRO_VARNAME="REDIS_PORT"

    SERVER="127.0.0.1"
    PORT="6379"
    AUTH=""

    CLUSTER=false

    # parameters

    while getopts "s:p:a:m:f:cdh" OPT; do
        case $OPT in
            f)
                FIELD="$OPTARG"
                ;;
            m)
                [ $OPTARG = "info" ] && DISCOVER=false
                ;;
            s)
                SERVER="$OPTARG"
                ;;
            p)
                PORT="$OPTARG"
                ;;
            a)
                AUTH="$OPTARG"
                ;;
            c)
                CLUSTER=true
                ;;
            d)
                DEBUG=true
                ;;
            h)
                usage $0
                exit 0
                ;;
            ?)
                usage $0
                exit 1
                ;;
        esac
    done


    VAR_OK=false

    if $DEBUG; then
        echo -e "SERVER: \t$SERVER"
        echo -e "PORT: \t\t$PORT"
        [ -n "$AUTH" ] && echo -e "AUTH: \t\t$AUTH" || echo -e "AUTH: \t\tFalse"
        echo -e "DISCOVER: \t$DISCOVER"
        echo -e "CLUSTER: \t$CLUSTER"
        echo -e "FIELD: \t\t$FIELD"
        echo -e "VAR_OK: \t$VAR_OK"
    fi
    # basic info check
    if [ -n "$SERVER" ] && [ -n "$PORT" ]; then
        if $DISCOVER; then
            fdiscover
        else
            if [ -n "$FIELD" ]; then
                finfo
            else
                echo "$0 missing parameters!"
                usage
                exit 2
            fi
        fi
    else
        echo "$0 missing parameters!"
        usage
        exit 1
    fi 
}


main $@

遺留問題

  1. latency的監(jiān)控暫未實(shí)現(xiàn),因?yàn)闆]有發(fā)現(xiàn)只讓它運(yùn)行5秒就結(jié)束的方式洽沟;

其他

  1. 在Redis官網(wǎng)上,看到一個(gè)config resetstat用于重置統(tǒng)計(jì)數(shù)據(jù)蜗细,可能系統(tǒng)需要在進(jìn)行這種操作時(shí)取消告警裆操;
  2. 根據(jù)優(yōu)化依據(jù)來進(jìn)行告警或者運(yùn)維自動(dòng)化工作是一個(gè)非常靠譜的做法炉媒;
  3. 在添加模板時(shí)踪区,注意將結(jié)果類型調(diào)整為float
  4. 如果不使用redis-cli的全路徑吊骤,會(huì)找不到路徑缎岗。

參考

  1. How to Monitor Redis
  2. Monitor白粉;
  3. redis監(jiān)控指標(biāo)传泊;
  4. 關(guān)于redis性能問題分析和優(yōu)化
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鸭巴,隨后出現(xiàn)的幾起案子眷细,更是在濱河造成了極大的恐慌,老刑警劉巖鹃祖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溪椎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)校读,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門沼侣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人歉秫,你說我怎么就攤上這事蛾洛。” “怎么了端考?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵雅潭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我却特,道長(zhǎng)扶供,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任裂明,我火速辦了婚禮椿浓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闽晦。我一直安慰自己扳碍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布仙蛉。 她就那樣靜靜地躺著笋敞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荠瘪。 梳的紋絲不亂的頭發(fā)上夯巷,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音哀墓,去河邊找鬼趁餐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛篮绰,可吹牛的內(nèi)容都是我干的后雷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吠各,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼臀突!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贾漏,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤惧辈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后磕瓷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盒齿,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡念逞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了边翁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翎承。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖符匾,靈堂內(nèi)的尸體忽然破棺而出叨咖,到底是詐尸還是另有隱情,我是刑警寧澤啊胶,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布甸各,位于F島的核電站,受9級(jí)特大地震影響焰坪,放射性物質(zhì)發(fā)生泄漏趣倾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一某饰、第九天 我趴在偏房一處隱蔽的房頂上張望儒恋。 院中可真熱鬧,春花似錦黔漂、人聲如沸诫尽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牧嫉。三九已至,卻和暖如春减途,著一層夾襖步出監(jiān)牢的瞬間酣藻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工观蜗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衣洁。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓墓捻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坊夫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砖第,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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