您好,登錄后才能下訂單哦!
查看redis監(jiān)控的時(shí)候看到redis的graph出現(xiàn)不正常的情況,截圖如下:
如上面截圖所展示的樣子,可以看到redis 的客戶端連接數(shù)很突兀的上升到10K,又突然下降到0.排除了監(jiān)控本身的原因,很明顯是因?yàn)閞edis本身出了問題。
進(jìn)入redis服務(wù)器,連接上去
/usr/bin/redis-cli -p 6399 -h 127.0.0.1
>127.0.0.1:6399>> info
ERR max number of clients reached
無論執(zhí)行命令,顯示的都是上面的那個(gè)錯(cuò)誤。這個(gè)時(shí)候唯一想到的就是redis的客戶端已經(jīng)達(dá)到了最大的連接數(shù),無法創(chuàng)建連接了。即redis client可以打開的文件描述符不足
1.獲取得到redis:6399這個(gè)服務(wù)的PID信息
netstat -tunlp | grep 6399
2.獲取redis的能夠打開的最大文件描述符
cat /proc/PID/limints
可以看上述截圖中Max open file這行參數(shù)可以看得到進(jìn)程能夠打開的最大文件描述符
3.查看進(jìn)程打開的文件描述符
方法一:ll /proc/6677/fd | wc -l
方法二:lsof | grep 6399 | wc -l
通過上述方法獲取得到的值是10015和10007,可以看得到redis的文件描述符已經(jīng)使用完畢了。
4.因?yàn)閞edis-cli連接上redis之后無論如何更改出現(xiàn)上面的報(bào)錯(cuò),但是redis server因?yàn)槭亲鳛榫彺媸褂茫荒軌螂S隨便便的重啟,所以只能在客戶端想辦法,只能主動(dòng)讓客戶端斷開連接。所以獲取得到6399端口的連接信息:
netstat -tun | grep 6399 | awk '{print $5}' | awk -F':' '{print $1}' | sort | uniq -c
8 10.143.106.95
8 10.143.90.216
5433 10.207.169.67
4788 10.221.236.76
1 10.221.244.39
6 10.225.36.189
在上面的命令可以很明顯的獲取得到那個(gè)IP地址連接redis服務(wù)的連接很多
5.進(jìn)入連接最多的服務(wù)器,獲得連接redis的客戶端信息
netstat -tun | grep 6399
lsof -i:Port
根據(jù)上面?zhèn)z個(gè)命令可以獲得客戶端的應(yīng)用服務(wù)信息
6.獲取得到應(yīng)用服務(wù)信息之后,我們和開發(fā)商量之后,只能重啟才能讓客戶端主動(dòng)斷開連接。所以直接重啟了應(yīng)用服務(wù)。
7.更改redis配置信息。
重啟客戶端之后,redis的connect也減少了一部分,這個(gè)時(shí)候可以連接上redis了。
a)獲取redis的狀態(tài)信息
>127.0.0.1:6399>>info
b)獲取redis本地配置文件信息,最大連接數(shù),timeout,tcp-keepalive
>127.0.0.1:6399>> config *
>127.0.0.1:6399>> config get maxclients
"10000"
>127.0.0.1:6399>> config get timeout
0
>127.0.0.1:6399>> config get tcp-keepalive
0
c)從上面命令可以看得出,最大連接數(shù)是10000,timeout和tcp-keepalive并沒有開啟,但是又不能重啟redis-server,所以只能在線修改配置信息。
>127.0.0.1:6399>> config set maxclients=100000
OK
>127.0.0.1:6399>> config set timeout = 300
OK
做完上面措施之后,客戶端連接數(shù)也已經(jīng)斷開。
問題產(chǎn)生的原因:
1.zabbix監(jiān)控獲取得到的值為什么是0
zabbix server上面執(zhí)行
zabbix_get -s 0.0.0.0 -k 'redis[connect client,6399]'
0
原因是因?yàn)樵赼gent段redis腳本抓取info信息的時(shí)候,對(duì)于不是數(shù)字類型的數(shù)據(jù)替換成0,所以導(dǎo)致zabbix 監(jiān)控獲取得到的數(shù)值是0
2.為什么有這么多的連接
線上的架構(gòu)是
client ->VIP->server #VIP指的是負(fù)載均衡
客戶端和服務(wù)的連接的中間是通過VIP進(jìn)行轉(zhuǎn)發(fā)的,他們直接的通信是TCP/IP四層的通信,在VIP上面本身自己是有做timeout設(shè)置的,默認(rèn)20min ,它會(huì)主動(dòng)的斷開連接,但是卻沒有通知client和server端,導(dǎo)致client和server端并不清楚自己已經(jīng)斷開了連接。但是由于client的代碼并沒有設(shè)置主動(dòng)斷開連接,所以client會(huì)認(rèn)為自己是一直連接的狀態(tài),等到下一次它發(fā)起請(qǐng)求的時(shí)候,VIP會(huì)告訴client連接已經(jīng)斷開,client會(huì)重新在創(chuàng)建一個(gè)新的連接;對(duì)于server端來說即redis它本身也沒有開啟timeout和tcp-keepalive的,所以server端也不會(huì)主動(dòng)的斷開連接,所以連接會(huì)越來越多,導(dǎo)致連接數(shù)完全被使用完。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。