查看redis監控的時候看到redis的graph出現不正常的狀況,截圖以下:redis
如上面截圖所展現的樣子,能夠看到redis 的客戶端鏈接數很突兀的上升到10K,又忽然降低到0.排除了監控自己的緣由,很明顯是由於redis自己出了問題。緩存
進入redis服務器,鏈接上去 服務器
/usr/bin/redis-cli -p 6399 -h 127.0.0.1架構
>127.0.0.1:6399>> info負載均衡
ERR max number of clients reachedtcp
不管執行命令,顯示的都是上面的那個錯誤。這個時候惟一想到的就是redis的客戶端已經達到了最大的鏈接數,沒法建立鏈接了。即redis client能夠打開的文件描述符不足3d
1.獲取獲得redis:6399這個服務的PID信息server
netstat -tunlp | grep 6399blog
2.獲取redis的可以打開的最大文件描述符進程
cat /proc/PID/limints
能夠看上述截圖中Max open file這行參數能夠看獲得進程可以打開的最大文件描述符
3.查看進程打開的文件描述符
方法一:ll /proc/6677/fd | wc -l
方法二:lsof | grep 6399 | wc -l
經過上述方法獲取獲得的值是10015和10007,能夠看獲得redis的文件描述符已經使用完畢了。
4.由於redis-cli鏈接上redis以後不管如何更改出現上面的報錯,可是redis server由於是做爲緩存使用,不可以隨隨便便的重啓,因此只能在客戶端想辦法,只能主動讓客戶端斷開鏈接。因此獲取獲得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
在上面的命令能夠很明顯的獲取獲得那個IP地址鏈接redis服務的鏈接不少
5.進入鏈接最多的服務器,得到鏈接redis的客戶端信息
netstat -tun | grep 6399
lsof -i:Port
根據上面倆個命令能夠得到客戶端的應用服務信息
6.獲取獲得應用服務信息以後,咱們和開發商量以後,只能重啓才能讓客戶端主動斷開鏈接。因此直接重啓了應用服務。
7.更改redis配置信息。
重啓客戶端以後,redis的connect也減小了一部分,這個時候能夠鏈接上redis了。
a)獲取redis的狀態信息
>127.0.0.1:6399>>info
b)獲取redis本地配置文件信息,最大鏈接數,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)從上面命令能夠看得出,最大鏈接數是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
作完上面措施以後,客戶端鏈接數也已經斷開。
問題產生的緣由:
1.zabbix監控獲取獲得的值爲何是0
zabbix server上面執行
zabbix_get -s 0.0.0.0 -k 'redis[connect client,6399]'
0
緣由是由於在agent段redis腳本抓取info信息的時候,對於不是數字類型的數據替換成0,因此致使zabbix 監控獲取獲得的數值是0
2.爲何有這麼多的鏈接
線上的架構是
client ->VIP->server #VIP指的是負載均衡
客戶端和服務的鏈接的中間是經過VIP進行轉發的,他們直接的通訊是TCP/IP四層的通訊,在VIP上面自己本身是有作timeout設置的,默認20min ,它會主動的斷開鏈接,可是卻沒有通知client和server端,致使client和server端並不清楚本身已經斷開了鏈接。可是因爲client的代碼並無設置主動斷開鏈接,因此client會認爲本身是一直鏈接的狀態,等到下一次它發起請求的時候,VIP會告訴client鏈接已經斷開,client會從新在建立一個新的鏈接;對於server端來講即redis它自己也沒有開啓timeout和tcp-keepalive的,因此server端也不會主動的斷開鏈接,因此鏈接會愈來愈多,致使鏈接數徹底被使用完。