記一次Redis連接超限排查
- 2019 年 12 月 20 日
- 筆記
.example_responsive_1 { width: 200px; height: 50px; } @media(min-width: 290px) { .example_responsive_1 { width: 270px; height: 50px; } } @media(min-width: 370px) { .example_responsive_1 { width: 339px; height: 50px; } } @media(min-width: 500px) { .example_responsive_1 { width: 468px; height: 50px; } } @media(min-width: 720px) { .example_responsive_1 { width: 655px; height: 50px; } } @media(min-width: 800px) { .example_responsive_1 { width: 728px; height: 50px; } } (adsbygoogle = window.adsbygoogle || []).push({});
記一次Redis連接超限排查
目錄
記一次Redis連接超限問題排查經過. 文章地址: https://blog.piaoruiqing.com/2019/12/15/max-number-of-clients-reached/ 項目起不來了! … 項目又起不來了! … 又雙叒叕???!!!
上周經常聽到組裡同事說項目又雙叒叕掛了, Redis連不上, 筆者在另一套正常的環境忙著開發新需求, 沒空關心這個問題.(PS: 反正我的環境能用(´థ౪థ)σ , 先忙完我的再說).
於是乎, 看了一眼日誌, 連接數過多… emmm, 順手幫同事把Redis配置里連接數上限加了個0, 問題排查什麼的等忙完再說.
ERR max number of clients reached
終於… 該來的總逃不掉, 筆者用的環境也被搞崩了, 而且是莫名其妙地就涼了.
不過… 因吹斯汀 !

修改連接數上限畢竟治標不治本, 本來連接數上限就是10000
, 微服務總共才幾十個, 按理說根本用不完.
肯定有人沒關連接, 查他.

已知:
- Redis服務重啟後, 用一段時間連接就又滿了.
- 服務總共幾十個, 配置的一萬連接數正常情況下不大可能用完.
第一步 重啟並搶先佔一個連接
筆者重啟了Redis後, 立即連接到Redis, 查看客戶端數量(晚了就連不上了):
$ docker exec -it $(docker ps | grep redis | awk '{print $1}') redis-cli -a {pwd} 127.0.0.1:6379> info ... # Clients connected_clients:391 ...
tips: info命令能查看關於 Redis 伺服器的各種資訊和統計數值.
第二步 記錄全部客戶端
幾分鐘後再次查看:
127.0.0.1:6379> info ... # Clients connected_clients:10002 ...
此時, 連接已經被全部佔滿了.

將全部客戶端資訊保存到文件準備抓出這個搞事情的老哥.
127.0.0.1:6379> client list id=7863 addr=172.18.0.104:56836 fd=6150 name= age=72 idle=72 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=7864 addr=172.18.0.50:56262 fd=6151 name= age=72 idle=72 flags=N db=9 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping id=7865 addr=172.18.0.104:56840 fd=6152 name= age=72 idle=72 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping ...

tips:
client list
: 列出全部客戶端資訊.
第三步 找出異常IP
有了全部的客戶端連接資訊, 就能找出到底是誰的鍋了. 使用命令輸出連接數前五的IP:
$ cat client-list | awk '{print $2}' | awk -F "[=:]" '{print $2}' | sort | uniq -c | sort -k1,1nr | head -5 5432 172.18.0.50 4244 172.18.0.104 43 172.18.0.59 40 172.18.0.54 32 172.18.0.55
到目前為止, 鎖定了172.18.0.50
和172.18.0.104
兩個IP. 這兩個都是docker內部網路的地址.
tips:
awk '{print $2}
: 輸出第二列, 即IP. addr=172.18.0.104:56836.awk -F "[=:]" '{print $2}'
: 通過等號和冒號拆分addr=172.18.0.104:56836, 並輸出中間的IP.sort
: 排序.uniq -c
: 統計數量並在每列旁邊顯示該行重複出現的次數.
第四步 定位服務並把鍋扔過去
拿到了IP就離目標不遠了, 通過docker inspect
能輸出docker實例的資訊, 其中就包括IP.
$ docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) | grep 172.18.0.50 /docker_xxxxx-service - 172.18.0.50 $ docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) | grep 172.18.0.104 /docker_yyyyy-service - 172.18.0.104
tips:
docker inspect
: 獲取容器/鏡像的元數據.--format
: 用模板格式化輸出.
至此, 定位到了xxxxx
和yyyyy
,嗯… 隔壁Py (thon)組的服務. 來, 鍋給你.

推薦閱讀
- 不停服遷移數據
- MySQL查漏補缺
- 開放API網關實踐(一) ——設計一個API網關
- 開放API網關實踐(二) —— 重放攻擊及防禦
- 開放API網關實踐(三) —— 限流
- Kubernetes(一) 跟著官方文檔從零搭建K8S
- Kubernetes(二) 應用部署
- Kubernetes(三) 如何從外部訪問服務
我的部落格即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2lbkh8cwv72z
© 2019, 朴瑞卿.
[版權聲明] 本文發佈於朴瑞卿的部落格, 允許非商業用途轉載, 但轉載必須保留原作者朴瑞卿 及鏈接:https://blog.piaoruiqing.com. 如有授權方面的協商或合作, 請聯繫郵箱: piaoruiqing@gmail.com.