用云服務(wù)的新手,估計都會遇到這樣的問題:某天去到公司打開MongoChef秧均,發(fā)現(xiàn)阿里云的MongoDB連不上了食侮。
2017-05-06 18:34:18 星期六
結(jié)論:經(jīng)過實踐證明,就是因為中轉(zhuǎn)服務(wù)器與MongoDB服務(wù)的連接沒釋放的原因目胡,只要先斷開rinetd后再重連即可锯七!目前的解決方法是:在阿里云監(jiān)控臺設(shè)置短信通知連接數(shù)快滿,然后登中轉(zhuǎn)服務(wù)器重啟rinted服務(wù)誉己∶际可以優(yōu)化成:設(shè)置腳本,讓中轉(zhuǎn)服務(wù)器每天定時重啟rinted服務(wù)巨双。
<h2>問題排查</h2>
<ul>
<li>網(wǎng)絡(luò)斷了噪猾?</li>
<li>阿里云中轉(zhuǎn)服務(wù)器掛了?</li>
<li>MongoDB連接數(shù)滿了筑累?</li>
</ul>
ping一下百度袱蜡,可以ping通,排除網(wǎng)絡(luò)斷了的bug慢宗。
ssh下阿里云的中轉(zhuǎn)服務(wù)器坪蚁,可以連上,排除阿里云中轉(zhuǎn)服務(wù)器掛了的bug婆廊。
<h2>MongoDB連接數(shù)問題及解決方法</h2>
登上MongoDB控制臺迅细,發(fā)現(xiàn)連接數(shù)滿了巫橄。百度之淘邻,得到一篇阿里云棲的博文<a title="《為什么 MongoDB 連接數(shù)被用滿了?》">《為什么 MongoDB 連接數(shù)被用滿了湘换?》</a>
原來是我之前寫代碼時忘記寫上<code>db.close()</code>宾舅,導致每次連接建立后都沒釋放统阿。
<h2>如何在不重啟阿里云MongoDB的情況下,強制釋放已建立的連接筹我?</h2>
然而改了代碼扶平,第二天有其他操作忘記加了釋放連接的命令,也會導致連接數(shù)滿蔬蕊,那么問題來了结澄,如何在不重啟MongoDB的情況下,強制釋放已建立的連接呢岸夯?
為此提交了阿里云的工單麻献,技術(shù)人員的回復是暫時沒有可以解決的方法。
于是自己<code>google</code>之猜扮,查閱了<code>stackoverflow</code>勉吻,<code>mongodb doc</code>和<code>pymongo</code>的一些資料,獲知了大概以下信息:
<ul>
<li>可以在終端中<code>mongo mongodb://user:password@URL:port/database</code>連接<code>MongoDB</code>旅赢,執(zhí)行<code>db.serverStatus()</code>查看連接信息齿桃,執(zhí)行<code>db.currentOp()</code> 查看當前操作,并可以用<code>db.killOp()</code>殺死操作煮盼。于是當然可以寫代碼殺死所有操作了短纵。但是殺死這些操作,是否連接數(shù)就會減少還沒試驗孕似。</p></li>
<li><p>據(jù)我快速掃描英文文檔踩娘,如果沒錯的話,<code>pymongo</code>和<code>MongoDB</code>的機制已經(jīng)是線程池的喉祭,可能是我插入數(shù)據(jù)的時候數(shù)據(jù)量太大养渴,于是建立太多連接。只要完成操作泛烙,等一段時間理卑,這些線程池中建立的連接自動會被釋放回收。</p></li>
<li><p>在中轉(zhuǎn)服務(wù)器上重啟<code>rinetd</code>服務(wù)蔽氨。假設(shè)有外接進程連接著<code>MongoDB</code>藐唠,并且不進行操作,而且<code>MongoDB</code>不會進行自動釋放鹉究,那么將中轉(zhuǎn)服務(wù)器的中轉(zhuǎn)服務(wù)斷開后宇立,這些連接自然也就被中斷釋放了。作者就是進行這一步之后自赔,使得連接數(shù)從180下降到40多妈嘹。那么問題來了,如果是這個原因绍妨,那么剩下的40多連接數(shù)润脸,是<code>MongoDB</code>在內(nèi)網(wǎng)產(chǎn)生的嗎柬脸?有待進一步研究。
經(jīng)過實踐證明毙驯,就是因為中轉(zhuǎn)服務(wù)器與MongoDB服務(wù)的連接沒釋放的原因倒堕,只要先斷開rinetd后再重連即可!
關(guān)于<code>rinetd</code>爆价,祥見<a title="《通過公網(wǎng)連接云數(shù)據(jù)庫 MongoDB--ECS Linux 篇》">《通過公網(wǎng)連接云數(shù)據(jù)庫 MongoDB--ECS Linux 篇》</a></p></li>
</ul>
<h2>利用復制集(replica set)設(shè)計讀壓力分散垦巴,即低級的負載均衡</h2>
<p>讓只有讀操作的api連接到secondary(從)數(shù)據(jù)庫上,primary(主)數(shù)據(jù)庫只連接需要進行讀寫的api铭段,就可以分散讀壓力魂那,使得primary(主)數(shù)據(jù)庫不會那么快滿連接數(shù)。
當然稠项,對代碼的優(yōu)化是必須的涯雅,如果資金充沛,那么提高<code>MongoDB</code>的硬件配置是最好不過的的展运。
<h2>小結(jié)</h2>
數(shù)據(jù)庫技術(shù)(包括傳統(tǒng)型如MySQL和大數(shù)據(jù)型MongoDB活逆、Hadoop)是大數(shù)據(jù)時代的核心技術(shù),不管是VR拗胜、物聯(lián)網(wǎng)蔗候、人工智能還是數(shù)據(jù)挖掘,都離不開數(shù)據(jù)埂软。打算在修煉python的同時锈遥,繼續(xù)看《MongoDB 實戰(zhàn)》,在工作中總結(jié)經(jīng)驗勘畔,深入了解底層機制所灸,并且學下MySQL等傳統(tǒng)數(shù)據(jù)庫,假以時日炫七,才能在數(shù)據(jù)庫領(lǐng)域有所進展爬立。