這篇文章主要介紹redis中連接錯誤的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!
創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、巴彥淖爾網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、商城開發(fā)、集團公司官網(wǎng)建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為巴彥淖爾等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
前言
最近由于流量增大,redis 出現(xiàn)了一連串錯誤,比如:
LOADING Redis is loading the dataset in memory
use of closed network connection
connection pool exhausted
connection refuse by peer
一個個來分析。
LOADING Redis is loading the dataset in memory
這里至少有2種可能
可用內(nèi)存太小,修改 redis.conf 中的 maxmemory 即可解決
redis 在啟動時正在加載 dump.rdb 文件,由于加載比較慢導(dǎo)致 redis 在啟動時不可用
我遇到的就是第2種情況,AWS在自動擴容的時候,每個新產(chǎn)生的 EC2 實例都報錯,原因就是 redis 在啟動時發(fā)現(xiàn)有個 dump.rdb,然后就去加載它,導(dǎo)致服務(wù)器里的服務(wù)都報錯,然后就退出了,并且 redis 加載這個要好久(不知道為什么),supervisord 自動重啟了新的服務(wù)后依然報錯。
后來把鏡像中的 dump.rdb 文件刪了,服務(wù)才能正常啟動。
dump.rdb 文件產(chǎn)生的原因可能是之前 redis 出現(xiàn)了某種錯誤,然后在制作鏡像時也做進去了,導(dǎo)致新生成的實例個個都報錯。
這次吸取了教訓(xùn),下次制作鏡像之前都要先 stop 掉 redis 然后刪掉 dump.rdb 。
其他3種錯誤
一開始也是各種找資料,然后各種改配置,導(dǎo)致這3種錯誤都先后出現(xiàn)。
一開始我認(rèn)為是 golang 代碼沒有正確處理 redis 連接異常的情況,于是各種升級 redigo,改 golang 中的 timeout 、max_active、wait 等的配置,發(fā)現(xiàn)都沒有用。
這樣來來回回折騰了大概一周,終于從 pool.Active 和 pool.MaxActive 中發(fā)現(xiàn)了貓膩。
因為我 MaxActive 設(shè)置的是 10000,于是我開了 10000 個 go runtine 去測試它,發(fā)現(xiàn)當(dāng)前連接數(shù) pool.Active 老是才 4000 左右,然后就各種報錯。
那段時間也是腦子短路了,老是認(rèn)為 redigo 沒有正確處理 redis 的連接才導(dǎo)致 pool.Active 不能上到最大。老是想著改 redigo 的代碼……
后來實在沒辦法,想著去改一改 ulimit,舊的是 500000,改到 990000,發(fā)現(xiàn)還是報連接錯誤,pool.Active 還是上不去,我想這不可能啊,這才想到會不會是 redis 本身有最大連接數(shù)的配置。上網(wǎng)一查,果然,redis-server 有一個 maxclients 的配置……默認(rèn)是 4000 多,改到 10000 后,整個世界都清靜了……
其實也不能怪我,因為 redigo 也有個 max_active 參數(shù),鬼知道 redis-server 還要設(shè)置呢 [笑哭]?
Redis 用于高并發(fā)服務(wù)的配置
Redis 客戶端(即 golang 代碼)
Wait: true 如果連接池滿了,就等待, Redis 處理很快的,等個幾微秒用戶也感覺不出來什么
IdleTimeout: 5s 一個業(yè)務(wù)邏輯5s都處理不完,那你應(yīng)該優(yōu)化你的代碼了。如果設(shè)置為0,萬一這個連接失蹤了服務(wù)端就收回不了了,會產(chǎn)生僵尸連接的。
MaxActive: 10000 相當(dāng)于這個服務(wù)器能處理每秒 10000 并發(fā)了。
Redis 服務(wù)器(即 redis-server)
maxclients 要設(shè)置得比 MaxActive 大
附加題:一臺服務(wù)器的最大文件數(shù)怎么算?
linux kernel - Need to “calculate” optimum ulimit and fs.file-max values according to my own server needs - Stack Overflow
this ends up being about 100 for every 1MB of ram.
例,如果是 4G 內(nèi)存,那么打開文件數(shù)最大可以設(shè)置為:4 * 1024 * 100 = 409600
以上是“Redis中連接錯誤的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
當(dāng)前文章:Redis中連接錯誤的示例分析
轉(zhuǎn)載源于:http://vcdvsql.cn/article10/pepido.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站改版、建站公司、手機網(wǎng)站建設(shè)、用戶體驗、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)