亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

luffyZh / 1736人閱讀

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

出現(xiàn)的問題

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

下面講述一下整個處理過程

初步分析

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

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

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

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

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

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

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

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

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

該文作者在生產(chǎn)環(huán)境使用Mongo數(shù)據(jù)庫,有性能問題,其中一個關(guān)鍵點(diǎn)是,Mongo數(shù)據(jù)庫,如果有用戶名和密碼,在每次建立數(shù)據(jù)庫連接時,都會驗(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ù)據(jù)庫而言是最重要的安全模塊,全球那么多公司在使用,就算賬號驗(yàn)證有一定的性能損耗,但是也不可能有這么大的問題,應(yīng)該還是我自己使用方面的問題,繼續(xù)深入尋找原因

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

我的方式:
user:123456@127.0.0.1:27017/admin
然后在代碼中通過use,切換到baby庫

B服務(wù)的方式:
針對baby數(shù)據(jù)庫建立一個賬號,由baby庫授權(quán)
user:123456@127.0.0.1:27017/baby?authSource=baby&maxPoolSize=50

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

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

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

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

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

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

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

到此,可以知道問題所在了,MongoDB賬號授權(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ù)庫,該賬號只是做為管理員使用,而不應(yīng)該作為生產(chǎn)環(huán)境使用,MongoDB的思想是賬號和數(shù)據(jù)庫綁定,而不是實(shí)例,MySQL是一個MySQL實(shí)例對應(yīng)賬號,不針對某db

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

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

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

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

相關(guān)文章

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

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

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

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

    Tonny 評論0 收藏0
  • 首個最全的MongoDB 3.6 全覽

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

    陳江龍 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<