1. 程式人生 > >MongoDB 連線數高產生原因及解決

MongoDB 連線數高產生原因及解決

MongoDB Sharding架構下連線數很容易達到很高,這裡連線數分為幾個概念:
tcp 連線數 netstat可以統計的,一般這個是最高.如果mongod/mongos在同一臺伺服器,更明顯。
參考命令:netstat -ant|awk '{print $5}' |awk -F: '{print $1}'|sort |uniq -c|sort -rn
mongos/mongod 連線數 mongostat/db.serverStatus()/connPoolStats可統計。
連線數多高算高呢?
這要看連線到mongodb叢集應用伺服器例項數、qps(增刪改查)等判斷。
應用伺服器單臺,如果qps<100, ,mongos連線數超過2000,肯定是高了。這一般是由於連線池配置不合理導致。
mongod/mongos 預設最大連線數maxConns=20000,2.4版本及以前版本最大不能超過這個數值,2.6版本(開發版2.5版本)取消這個限制。
相關連結

http://nosqldb.org/topic/50ca8a50ee680fee790001f2

什麼原因導致連線數過高

  • 連線池配置不合理
    分片情況下,現象是tcp 連線數過高(如達到20000),mongos連線數過高(如超過10000)
    java為例,connectionsPerHost 不宜配置過大,官方預設值由原來10改成100了,而且有預設5倍的乘數(threadsAllowedToBlockForConnectionMultiplier),一般20~50就可以了。

  • 應用伺服器例項過多

我們遇到的場景,當連線到mongos的應用伺服器(如Tomcat例項數量)過百,甚至達到近200臺時,tcp連線數超高,達到15000以上,檢視mongod對應埠連線數高達8000多,mongos 2000多。此時ops(query,insert,update,delete)低於200每秒,。定期重啟(如一週一次)mongos可適當緩解該問題。

  • mongodb本身的原因表現為mongos連線數不高(如1000+),mongod連線數比較高(如8000+)。

如何解決
總結一下,連線數高分為幾個場景:
應用伺服器例項過多,可統計每個例項建立的連線數,適當調低連線池引數。
mongos連線數高,這種就是配置的問題,更改連線池引數。
mongos連線數不高,mongod連線數比較高,如超過5000,如果連線池配置合理還比較高的話,嘗試啟用releaseConnectionsAfterResponse引數(2.2.4版本以上),該引數為
隱藏引數releaseConnectionsAfterResponse

mongos>use admin
switched to db admin
mongos
> db.runCommand({ setParameter :1, releaseConnectionsAfterResponse :true}){"was":false,"ok":1}

或者

shell> mongos --setParameter "releaseConnectionsAfterResponse=true"--configdb ...

該引數注意事項:
寫操作需要立即呼叫getLastError (w=1,即安全寫模式),w=2(等待從庫寫確認)的時候可能會有些錯誤。
升級過後,或者重啟mongos程序後,需要重新設定該引數,該引數只對單個mongos生效。
啟用releaseConnectionsAfterResponse 引數,tcp 連線數明顯降低到比較穩定數目。幾個小時,tcp連線數從8000多降到4000多,效果不錯。

  • releaseConnectionsAfterResponse 引數原理

通常,對於每個mongos->mongod連線是單獨快取的,並且該連線不能重複使用,即使該連線是空閒時也是如此,一直到連線關閉連接回到連線池中才能再使用;releaseConnectionsAfterResponse 引數啟用後,mongos->mongod之間的連線在完成一個讀操作或者安全寫操作後能夠重複使用(把連線放到連線池中而不是快取,即更早的迴歸到連線池中),releaseConnectionsAfterResponse引數簡單講就是mongos->mongod的連線更早的回到連線池中,這樣就不會開太多的連線了,從而減少連線數。
Create a new serverParameter for mongos, "releaseConnectionsAfterResponse," which enables returning ShardConnections from the per-socket pool to the global pool after each read operation. This should reduce the total number of outgoing mongos connections to each shard.
the option allows better use of the connection pool, it doesn't invalidate the connections in the pool. Normally, mongos->mongod connections for insert/update/delete/query are cached individually for each incoming connection, and can't be re-used until the incoming connection is closed, even if they are idle and there are other active incoming connections.
What the releaseConnectionsAfterResponse option does is allow the mongos->mongod connection to be re-used (returned to the pool) after any read op (including getLastError(), so after safe writes as well). It shouldn't have a significant performance impact - the connection isn't destroyed, it's just returned from the incoming connection cache to the shared pool early.

===============
- connPoolTimeout設定

(該引數不在官方沒有)
效果

mongos> db.runCommand({ setParameter :1, connPoolTimeout :900}){"was":1800,"ok":1}

初步測試,效果不明顯。

  • releaseConnections

計劃添加個命令releaseConnections,從mongod執行,減少複製集連線數。

相關推薦

MongoDB 連線產生原因解決

MongoDB Sharding架構下連線數很容易達到很高,這裡連線數分為幾個概念: tcp 連線數 netstat可以統計的,一般這個是最高.如果mongod/mongos在同一臺伺服器,更明顯。 參考命令:netstat -ant|awk '{print $5}' |awk -F: '{print $1

移動端1px產生原因解決之道

產生原因     因為Retine屏的解析度始終是普通螢幕的2倍,1px的邊框在devicePixelRatio=2的retina屏下會顯示成2px,所以在高清瓶下看著1px總是感覺變胖了,關於詳細原因介紹參考大漠的文章:http://www.w3cplus.com/css

ORACLE 臨時表空間使用率過原因解決方案

        在資料庫的日常學習中,發現公司生產資料庫的預設臨時表空間temp使用情況達到了30G,使用率達到了100%; 待調整為32G後,使用率還是為100%,導致磁碟空間使用緊張。根據臨時表空間的主要是對臨時資料進行排序和快取臨

AJAX跨域產生原因解決方法

什麼是跨域:        跨域問題來源於JavaScript的同源策略,即只有 協議+主機名+埠號 (如存在)相同,則允許相互訪問。也就是說JavaScript只能訪問和操作自己域下的資源,不能訪問和操作其他域下的資源。跨域問題是針對JS和ajax的,html本身沒有跨域問

Linux的殭屍程序產生原因解決方法

來源:http://www.blogdaren.com/post-882.html 1. 產生原因:     在UNIX 系統中,一個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他,那麼他將變成一個殭屍程序。通過ps命令檢視其帶有defunc

MongoDB 查詢超時異常的原因解決辦法

在對超過百萬條記錄的集合進行聚合操作時,偶爾會發生Read timed out 異常,本文分析了ConnectionTimeOut和SocketTimeOut的區別,並提出該問題的解決辦法。 在對超過百萬條記錄的集合進行聚合操作。 DBObject match=(DBO

Debian9中無法連線Mariadb(Mysql)的原因解決方法

今天安裝好Debian9後,又繼續安裝了Mariadb(Mysql)資料庫。 此時剛剛安裝好資料庫,root還沒有設定密碼,因此應該可以不用密碼就應該可以登入, 但發現普通使用者用mysql -uroot登入時無法登入,只能用Linux的root賬戶登入才可以。 百度後發現

記憶體碎片產生原因解決辦法

首先,使用最原始的標記分配方法,系統需要維護一個簡單的記憶體資訊表: 當程式申請一個長度為3的記憶體空間後: 當程式再申請一個長度為2,以及長度為4的記憶體空間後:此時,只剩1個可用空間。如果這時程式再來申請長度大於1的空間,就申請不了,也就是記憶體不夠。 現在,釋放掉ID=2的空間:我們發現,現在可用記憶體

SQL Server死鎖產生原因解決辦法

其實所有的死鎖最深層的原因就是一個:資源競爭 表現一:   一個使用者A 訪問表A(鎖住了表A),然後又訪問表B,另一個使用者B 訪問表B(鎖住了表B),然後企圖訪問表A,這時使用者A由於使用者B已經鎖住表B,它必須等待使用者B釋放表B,才能繼續,好了他老人家就只好老老實實

hive表據導出到csv亂碼原因解決方案

exce 默認 concat_ws 分隔符 語句 解決方案 打開 clas 連接 轉載自http://blog.csdn.net/lgdlxc/article/details/42126225 Hive表中的數據使用hive - e"select * from table"

jquery ajax success 函 異步調用方法中不能給全局變量賦值的原因解決辦法

tex span var getc res syn ucc 解決辦法 asp 在調用一個jquery的ajax方法時我們有時會需要該方法返回一個值或者給某個全局變量賦值,可是我們發現程序執行完後並沒有獲取到我們想要的值,這時很有可能是因為你用的是ajax的異步調用async

sql異常 獲取據失敗的原因解決方案

報錯 解決方案 utils har .com SQ 技術 提示 png 使用dbutils工具類時 不能使用char作為sql的字段類型 報錯提示不能轉換 所以替換成別的(一般是String)即可 sql異常 獲取數據失敗的原因及解決方案

PPTP連線時常見撥號錯誤提示原因解決辦法

相信大家在連線PPTP的時候,總會出現這樣那樣的錯誤程式碼,很令人頭疼,下面我為大家整理了一些常見的錯誤程式碼供參考:×××錯誤619解決辦法 詳解:私設IP或路由器不支援ppTp pass through,或是此IP地址是私設IP。這種情況大數多原因為客戶機連線Internet的閘道器(如家庭寬

獲取表格行和高度為0的原因解決方法-vue填坑

vue真的坑太多!雖然入門簡單易上手,但是,大專案真的不建議使用此框架,分分鐘重新整理世界觀,很多生命週期問題、載入問題、傳值問題、監聽問題…… 能填一個是一個,能救一人是一人,特意寫篇標題明顯的,希望能一下就被檢索到。 表格存在且有內容,行數可被打印出來,但是獲取到的行數和高度卻為

C語言野指標產生原因解決方法

C語言野指標產生的原因及解決方法 情況一 原因 指標變數宣告時沒有被初始化。 解決辦法 指標宣告時初始化,可以是具體的地址值,也可讓它指向NULL。 情況二 原因 指標 p 被 free 或者 delete 之後,沒有置為 NULL。 解決辦法 指標指向的記憶體空間被

Qt訊號和槽連線失敗原因解決辦法

有時候程式編譯成功了,但是connect並沒有將訊號和槽連線起來。Qt訊號和槽連線失敗原因主要有以下幾點: 槽函式並沒有宣告在類的public slots(或private slots或protected slots)裡,因

Html中產生塌陷的原因解決方法

產生塌陷的原因:由於沒有給父元素設定寬高,想通過子元素撐開寬高時,子元素又脫離了文件流使得子元素無法撐開文件流 脫離文件流的三種情況:   (1)float:給子元素設定浮動   (2)position:absolute;絕對定位   (3)positi

java:集合框架(併發修改異常產生原因解決方案)

A:案例演示     * 需求:我有一個集合,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。 public class Demo3_List

Java連線Redis時出現 “ERR Client sent AUTH, but no password is set” 異常的原因解決辦法

給redis設定過auth後發現還是出現這種情況,這是由於啟動redis時自動載入的redis配置檔案並不是我們配置的那個,我在服務中找到redis: 右擊redis選擇屬性 這裡發現redis啟動時使用我們之前配置在環境變數裡的.exe檔案,先將服務停止

打包spring專案遇到的坑 Unable to locate Spring NamespaceHandler for XML schema ……shcema/context 產生原因解決方法

圖1 圖2 問題原因:導致該問題的原因就是打包的時候,同時將 spring-context 和 spring-aop包提取到了我們的程式應用的包中,在package過程中,這2個依賴包的 XML schema  重名了,到aop將context的 spring.schemas覆