成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

記錄一次并發(fā)讀取MongoDB的踩坑過程

luffyZh / 1680人閱讀

摘要:出現(xiàn)的問題筆者前段時(shí)間開發(fā)一個(gè)新項(xiàng)目的某個(gè)功能模塊要讀取老游戲中某個(gè)數(shù)據(jù)庫計(jì)作庫連續(xù)讀庫中的個(gè)集合相當(dāng)于的張表取數(shù)據(jù)在測試環(huán)境單次操作時(shí)是內(nèi)但是并發(fā)測試情況下比如內(nèi)個(gè)并發(fā)時(shí)讀取庫個(gè)集合的耗時(shí)能達(dá)到以上甚至且個(gè)并發(fā)請求幾乎同時(shí)完成但是在我本地

出現(xiàn)的問題

筆者前段時(shí)間開發(fā)一個(gè)新項(xiàng)目的某個(gè)功能模塊,要讀取老游戲中某個(gè)Mongo數(shù)據(jù)庫(計(jì)作A庫),連續(xù)讀A庫中的6個(gè)集合(相當(dāng)于MySQL的6張表)取數(shù)據(jù),在測試環(huán)境,單次操作時(shí)是10ms內(nèi),但是并發(fā)測試情況下,比如1s內(nèi)100個(gè)并發(fā)時(shí),讀取A庫6個(gè)集合的耗時(shí)能達(dá)到2s以上,甚至7,8s,且n個(gè)并發(fā)請求幾乎同時(shí)完成,但是在我本地環(huán)境,并發(fā)下,平均一次操作也在幾十ms到100多ms上下浮動(dòng),并發(fā)請求也比較正常

下面講述一下整個(gè)處理過程

初步分析

雖然使用MongoDB的經(jīng)驗(yàn)不多,但是在我的認(rèn)知里,MongoDB的讀取性能不可能如此低,不然如何投入生產(chǎn)環(huán)境?

那么,到底是哪里出了問題呢?

對比本地環(huán)境和測試環(huán)境使用方式,發(fā)現(xiàn)一個(gè)區(qū)別,我本地環(huán)境在Docker中跑的Mongo容器實(shí)例,為了方便,并沒有設(shè)置用戶名和密碼,直接ip+端口號(hào)連接,而測試環(huán)境用了用戶名密碼,不管三七二十一,按照高中時(shí)候?qū)W的生物學(xué)中對照實(shí)驗(yàn)的思路,目前就只發(fā)現(xiàn)一個(gè)區(qū)別,先進(jìn)行驗(yàn)證

本地連接Mongo的url
127.0.0.1:27017
本地環(huán)境配置用戶名密碼,得出結(jié)論:賬號(hào)授權(quán)數(shù)據(jù)庫切換耗時(shí)阻塞

先按照網(wǎng)上的教程,給Admin數(shù)據(jù)庫建立一個(gè)管理員賬號(hào),擁有Mongo實(shí)例中讀寫任何一個(gè)db的權(quán)限

db.createUser({user:"root",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

使用賬號(hào)密碼后,無并發(fā)時(shí),仍然是ms級(jí)別,但是發(fā)現(xiàn),本地環(huán)境和測試環(huán)境一樣,并發(fā)時(shí),耗時(shí)達(dá)到數(shù)秒,且n個(gè)并發(fā)請求幾乎同時(shí)完成,好像某個(gè)操作導(dǎo)致阻塞,然后這個(gè)阻塞操作完成后,沒有阻塞只會(huì),并發(fā)讀取操作正常執(zhí)行,可以確定是Mongo數(shù)據(jù)庫的賬號(hào)管理相關(guān)問題

為啥賬號(hào)模塊會(huì)導(dǎo)致這么大的缺陷?

通過神器Google搜索,看了n篇博客,發(fā)現(xiàn)一篇12年的博客

該文作者在生產(chǎn)環(huán)境使用Mongo數(shù)據(jù)庫,有性能問題,其中一個(gè)關(guān)鍵點(diǎn)是,Mongo數(shù)據(jù)庫,如果有用戶名和密碼,在每次建立數(shù)據(jù)庫連接時(shí),都會(huì)驗(yàn)證用戶名密碼,建議在生產(chǎn)環(huán)境不要使用用戶名和密碼,通過禁止外網(wǎng)訪問,通過內(nèi)網(wǎng)ip以及限制ip的方式,訪問mongo數(shù)據(jù)庫

由于線上老項(xiàng)目是lua寫的,公司已經(jīng)一年多未進(jìn)行代碼維護(hù),且準(zhǔn)備后面新項(xiàng)目上線后,直接下線老項(xiàng)目,筆者以及公司其他后端,都不懂lua,為了避免導(dǎo)致不可預(yù)料的問題,同時(shí),在我看來,用戶名和密碼,對于數(shù)據(jù)庫而言是最重要的安全模塊,全球那么多公司在使用,就算賬號(hào)驗(yàn)證有一定的性能損耗,但是也不可能有這么大的問題,應(yīng)該還是我自己使用方面的問題,繼續(xù)深入尋找原因

通過請教一位同事,公司另一個(gè)基礎(chǔ)服務(wù)(計(jì)作B服務(wù)吧)在生產(chǎn)環(huán)境也用了MongoDB,且流量也很大,并沒有問題,通過對比

我的方式:
user:[email protected]:27017/admin
然后在代碼中通過use,切換到baby庫

B服務(wù)的方式:
針對baby數(shù)據(jù)庫建立一個(gè)賬號(hào),由baby庫授權(quán)
user:[email protected]:27017/baby?authSource=baby&maxPoolSize=50

區(qū)別在于我是跳轉(zhuǎn)到baby庫,而正常環(huán)境下是使用該數(shù)據(jù)庫下的用戶

說明數(shù)據(jù)庫授權(quán)耗時(shí)以及數(shù)據(jù)庫切換也比較耗時(shí),為啥會(huì)耗時(shí),看到一篇博客講到了Mongo的賬號(hào)授權(quán)原理,知道了建立連接數(shù)據(jù)庫授權(quán)時(shí)會(huì)導(dǎo)致庫級(jí)鎖(即連接a在使用時(shí),連接b進(jìn)行授權(quán),也會(huì)導(dǎo)致baby庫鎖定,連接a被阻塞)

本地環(huán)境為數(shù)據(jù)庫配置賬戶密碼,直連,本地正常,測試環(huán)境依然延遲數(shù)秒

于是接著本地也適用B服務(wù)一樣的方式,通過baby庫下建立user賬號(hào),直連的方式連接,本地環(huán)境耗時(shí)正常,并發(fā)下讀取6個(gè)集合,在100ms以內(nèi),屬于正常性能,但是發(fā)到測試環(huán)境,并發(fā)下雖然耗時(shí)減少了,相對于之前的8s,現(xiàn)在依然有1s多的延遲

連接數(shù)據(jù)庫方式一樣,但是耗時(shí)差別很大,經(jīng)過上一步知道了耗時(shí)是因?yàn)閿?shù)據(jù)庫鎖機(jī)制導(dǎo)致的問題,后面在Google上搜Mongo鎖機(jī)制,在知乎上看到了一個(gè)回答

mongodb 最初是全局鎖,后來庫鎖,接著3.0進(jìn)化到表鎖了... 現(xiàn)在使用 WiredTiger 可以實(shí)現(xiàn)文檔鎖...

對比了測試環(huán)境和本地環(huán)境的版本,本地是最新的,已經(jīng)是3.6版本,測試環(huán)境還是2.6版本,屬于庫鎖

到此,可以知道問題所在了,MongoDB賬號(hào)授權(quán)機(jī)制以及數(shù)據(jù)庫鎖機(jī)制

總結(jié)

感興趣的客觀可以搜索MongoDB鎖機(jī)制相關(guān)博客,網(wǎng)上文章很多,我就不在此啰嗦了

Mongo數(shù)據(jù)庫,在生產(chǎn)環(huán)境,盡量通過限制內(nèi)網(wǎng)ip才可以訪問的方式保證安全,防止攻擊

其次,不要通過admin管理員用戶連接數(shù)據(jù)庫,該賬號(hào)只是做為管理員使用,而不應(yīng)該作為生產(chǎn)環(huán)境使用,MongoDB的思想是賬號(hào)和數(shù)據(jù)庫綁定,而不是實(shí)例,MySQL是一個(gè)MySQL實(shí)例對應(yīng)賬號(hào),不針對某db

盡量使用3.X的新版本MongoDB,數(shù)據(jù)庫鎖已經(jīng)完善

以上只是我個(gè)人解決這個(gè)問題的全過程,博客寫的不夠思路清晰,過去了半個(gè)月,細(xì)節(jié)也記得不是很清楚了了,希望能給技術(shù)圈有所貢獻(xiàn),謝謝支持

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19199.html

相關(guān)文章

  • 一次使用Fiddler抓包工具抓取Https協(xié)議數(shù)據(jù)踩坑過程

    摘要:直到今天,突然看到一個(gè)有意思的微信小游戲。后來試了幾次之后才發(fā)現(xiàn),這個(gè)小游戲比較刁,不僅做了微信的登錄授權(quán),而且做了手機(jī)端訪問的判斷,更甚至竟然用的還是協(xié)議的網(wǎng)頁。調(diào)用的目標(biāo)發(fā)生了異常。 記一次使用Fiddler抓包工具抓取Https協(xié)議數(shù)據(jù)的踩坑過程 前言 記得從剛?cè)腴T前端第一天開始,當(dāng)時(shí)的師傅就跟我介紹了一個(gè)可以抓取一些必須要在微信瀏覽器打開的鏈接的工具Fiddler,主要用來抓取...

    JackJiang 評(píng)論0 收藏0
  • Notadd 2.0 全新 Node.js 版本~ (開發(fā)中) [從 PHP 到 node 踩坑

    摘要:有著最全的協(xié)議支持,同時(shí)有各種非阻塞拓展,可以說是最符合要求的,但是異步需要對做很大的改動(dòng)。的計(jì)劃將基于開發(fā),同時(shí)也提供一些無法提供的功能和特性。 一點(diǎn)小遺憾 對于 Notadd 我們本來期望它實(shí)現(xiàn)更多... 盡管我們也嘗試做了很多努力,但是由于 PHP 本身的局限,以及考慮到開發(fā)環(huán)境配置的復(fù)雜程度,最終使用了折中方案。接下來,我們談?wù)務(wù)麄€(gè)技術(shù)選型歷程,也供今后相關(guān)開發(fā)者做借鑒和參考:...

    Tonny 評(píng)論0 收藏0
  • 首個(gè)最全的MongoDB 3.6 全覽

    摘要:先睹為快振奮人心的時(shí)刻終于到來了,在經(jīng)過一個(gè)上市的日子后,終于發(fā)布了。實(shí)戰(zhàn)在線開啟認(rèn)證模式解讀我是上海小胖,專注等開源數(shù)據(jù)庫的,擁抱開源,接受收費(fèi)。上海小胖原創(chuàng)地址歡迎各位大神前來評(píng)論。每周五,敬請期待,上海小胖獨(dú)更。 MongoDB 3.6 先睹為快 Part 1 振奮人心的時(shí)刻終于到來了,在經(jīng)過一個(gè)MongoDB 上市的日子后,MongoDB 終于發(fā)布了MongoDB 3.6 RC...

    陳江龍 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<