激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - MongoDB - MongoDB中的一些坑(最好不要用)

MongoDB中的一些坑(最好不要用)

2020-04-30 15:37MongoDB之家 MongoDB

這篇文章主要介紹了MongoDB中的一些坑(最好不要用),本文總結(jié)了MongoDB 數(shù)據(jù)庫級鎖、建索引導(dǎo)致數(shù)據(jù)庫阻塞、不合理使用嵌入 embed document、不合理使用 Array 字段等4個坑,需要的朋友可以參考下

MongoDB 是目前炙手可熱的 NoSQL 文檔型數(shù)據(jù)庫,它提供的一些特性很棒:如自動 failover 機(jī)制,自動 sharding,無模式 schemaless,大部分情況下性能也很棒。但是薄荷在深入使用 MongoDB 過程中,遇到了不少問題,下面總結(jié)幾個我們遇到的坑。特別申明:我們目前用的 MongoDB 版本是 2.4.10,曾經(jīng)升級到 MongoDB 2.6.0 版本,問題依然存在,又回退到 2.4.10 版本。

MongoDB 數(shù)據(jù)庫級鎖

坑爹指數(shù):5星(最高5星)

MongoDB的鎖機(jī)制和一般關(guān)系數(shù)據(jù)庫如 MySQL(InnoDB), Oracle 有很大的差異,InnoDB 和 Oracle 能提供行級粒度鎖,而 MongoDB 只能提供 庫級粒度鎖,這意味著當(dāng) MongoDB 一個寫鎖處于占用狀態(tài)時,其它的讀寫操作都得干等。

初看起來庫級鎖在大并發(fā)環(huán)境下有嚴(yán)重的問題,但是 MongoDB 依然能夠保持大并發(fā)量和高性能,這是因為 MongoDB 的鎖粒度雖然很粗放,但是在鎖處理機(jī)制和關(guān)系數(shù)據(jù)庫鎖有很大差異,主要表現(xiàn)在:

MongoDB 沒有完整事務(wù)支持,操作原子性只到單個 document 級別,所以通常操作粒度比較小;
MongoDB 鎖實(shí)際占用時間是內(nèi)存數(shù)據(jù)計算和變更時間,通常很快;
MongoDB 鎖有一種臨時放棄機(jī)制,當(dāng)出現(xiàn)需要等待慢速 IO 讀寫數(shù)據(jù)時,可以先臨時放棄,等 IO 完成之后再重新獲取鎖。
通常不出問題不等于沒有問題,如果數(shù)據(jù)操作不當(dāng),依然會導(dǎo)致長時間占用寫鎖,比如下面提到的前臺建索引操作,當(dāng)出現(xiàn)這種情況的時候,整個數(shù)據(jù)庫就處于完全阻塞狀態(tài),無法進(jìn)行任何讀寫操作,情況十分嚴(yán)重。

解決問題的方法,盡量避免長時間占用寫鎖操作,如果有一些集合操作實(shí)在難以避免,可以考慮把這個集合放到一個單獨(dú)的 MongoDB 庫里,因為 MongoDB 不同庫鎖是相互隔離的,分離集合可以避免某一個集合操作引發(fā)全局阻塞問題。

建索引導(dǎo)致數(shù)據(jù)庫阻塞

坑爹指數(shù):3星

上面提到了 MongoDB 庫級鎖的問題,建索引就是一個容易引起長時間寫鎖的問題,MongoDB 在前臺建索引時需要占用一個寫鎖(而且不會臨時放棄),如果集合的數(shù)據(jù)量很大,建索引通常要花比較長時間,特別容易引起問題。

解決的方法很簡單,MongoDB 提供了兩種建索引的訪問,一種是 background 方式,不需要長時間占用寫鎖,另一種是非 background 方式,需要長時間占用鎖。使用 background 方式就可以解決問題。 例如,為超大表 posts 建立索引, 千萬不用使用

復(fù)制代碼 代碼如下:

db.posts.ensureIndex({user_id: 1})

 

而應(yīng)該使用

復(fù)制代碼 代碼如下:

db.posts.ensureIndex({user_id: 1}, {background: 1})

 

不合理使用嵌入 embed document

坑爹指數(shù):5星

embed document 是 MongoDB 相比關(guān)系數(shù)據(jù)庫差異明顯的一個地方,可以在某一個 document 中嵌入其它子 document,這樣可以在父子 document 保持在單一 collection 中,檢索修改比較方便。

比如薄荷的應(yīng)用情景中有一個 Group document,用戶申請加入 Group 建模為 GroupRequest document,我們最初的時候使用 embed 方式把 GroupRequest 放置到 Group 中。 Ruby 代碼如下所示(使用了 Mongoid ORM):

 

復(fù)制代碼 代碼如下:


class Group
  include Mongoid::Document
  ...
  embeds_many :group_requests
  ...
end

 

class GroupRequest
  include Mongoid::Document
  ...
  embedded_in :group
  ...
end

 


這個使用方式讓我們掉到坑里了,差點(diǎn)就爬不出來,它導(dǎo)致有接近兩周的時間系統(tǒng)問題,高峰時段常有幾分鐘的系統(tǒng)卡頓,最嚴(yán)重一次甚至引起 MongoDB 宕機(jī)。

仔細(xì)分析后,發(fā)現(xiàn)某些活躍的 Group 的 group_requests 增加(當(dāng)有新申請時)和更改(當(dāng)通過或拒絕用戶申請時)異常頻繁,而這些操作經(jīng)常長時間占用寫鎖,導(dǎo)致整個數(shù)據(jù)庫阻塞。原因是當(dāng)有增加 group_request 操作時,Group 預(yù)分配的空間不夠,需要重新分配空間(內(nèi)存和硬盤都需要),耗時較長,另外 Group 上建的索引很多,移動 Group 位置導(dǎo)致大量索引更新操作也很耗時,綜合起來引起了長時間占用鎖問題。

解決問題的方法,說起來也簡單,就是把 embed 關(guān)聯(lián)更改成的普通外鍵關(guān)聯(lián),就是類似關(guān)系數(shù)據(jù)庫的做法,這樣 group_request 增加或修改都只發(fā)生在 GroupRequest 上,簡單快速,避免長時間占用寫鎖問題。當(dāng)關(guān)聯(lián)對象的數(shù)據(jù)不固定或者經(jīng)常發(fā)生變化時,一定要避免使用 embed 關(guān)聯(lián),不然會死的很慘。

不合理使用 Array 字段

坑爹指數(shù):4星

MongoDB 的 Array 字段是比較獨(dú)特的一個特性,它可以在單個 document 里存儲一些簡單的一對多關(guān)系。

薄荷有一個應(yīng)用情景使用遇到嚴(yán)重的性能問題,直接上代碼如下所示:

復(fù)制代碼 代碼如下:

class User
  include Mongoid::Document
  ...
  field :follower_user_ids, type: Array, default: []
  ...
end

 

User 中通過一個 Array 類型字段 follower_user_ids 保存用戶關(guān)注的人的 id,用戶關(guān)注的人從 10個到 3000 個不等,變化是比較頻繁的,和上面 embed 引發(fā)的問題類似,頻繁的 follower_user_ids 增加修改操作導(dǎo)致大量長時間數(shù)據(jù)庫寫鎖,從而引發(fā) MongoDB 數(shù)據(jù)庫性能急劇下降。

解決問題的方法:我們把 follower_user_ids 轉(zhuǎn)移到了內(nèi)存數(shù)據(jù)庫 redis 中,避免了頻繁更改 MongoDB 中的 User, 從而徹底解決問題。如果不使用 redis,也可以建立一個 UserFollower 集合,使用外鍵形式關(guān)聯(lián)。

先列舉上面幾個坑吧,都是害人不淺的陷阱,使用 MongoDB 過程一定要多加注意,避免掉到坑里。

延伸 · 閱讀

精彩推薦
  • MongoDBmongodb基本命令實(shí)例小結(jié)

    mongodb基本命令實(shí)例小結(jié)

    這篇文章主要介紹了mongodb基本命令,結(jié)合實(shí)例形式總結(jié)分析了MongoDB數(shù)據(jù)庫切換、查看、刪除、查詢等基本命令用法與操作注意事項,需要的朋友可以參考下...

    dawn-liu3652020-05-26
  • MongoDBMongoDB 內(nèi)存使用情況分析

    MongoDB 內(nèi)存使用情況分析

    都說 MongoDB 是個內(nèi)存大戶,但是怎么知道它到底用了多少內(nèi)存呢...

    MongoDB教程網(wǎng)10002020-09-29
  • MongoDB分布式文檔存儲數(shù)據(jù)庫之MongoDB分片集群的問題

    分布式文檔存儲數(shù)據(jù)庫之MongoDB分片集群的問題

    這篇文章主要介紹了分布式文檔存儲數(shù)據(jù)庫之MongoDB分片集群的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋...

    Linux-18743072020-12-20
  • MongoDBMongoDB安裝圖文教程

    MongoDB安裝圖文教程

    這篇文章主要為大家詳細(xì)介紹了MongoDB安裝圖文教程,分為兩大部分為大家介紹下載MongoDB和安裝MongoDB的方法,感興趣的小伙伴們可以參考一下 ...

    Yangyi.He6132020-05-07
  • MongoDBMongoDB憑什么躋身數(shù)據(jù)庫排行前五

    MongoDB憑什么躋身數(shù)據(jù)庫排行前五

    MongoDB以比去年同期超出65.96分的成績繼續(xù)雄踞榜單前五,這個增幅在全榜僅次于PostgreSQL的77.99,而其相對于4月份的6.10分的增長也是僅次于微軟SQL Server排名...

    孫浩峰3892020-05-22
  • MongoDBMongodb實(shí)現(xiàn)定時備份與恢復(fù)的方法教程

    Mongodb實(shí)現(xiàn)定時備份與恢復(fù)的方法教程

    這篇文章主要給大家介紹了Mongodb實(shí)現(xiàn)定時備份與恢復(fù)的方法教程,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面...

    chenjsh364522020-05-13
  • MongoDBMongoDB中javascript腳本編程簡介和入門實(shí)例

    MongoDB中javascript腳本編程簡介和入門實(shí)例

    作為一個數(shù)據(jù)庫,MongoDB有一個很大的優(yōu)勢——它使用js管理數(shù)據(jù)庫,所以也能夠使用js腳本進(jìn)行復(fù)雜的管理——這種方法非常靈活 ...

    MongoDB教程網(wǎng)6982020-04-24
  • MongoDB遷移sqlserver數(shù)據(jù)到MongoDb的方法

    遷移sqlserver數(shù)據(jù)到MongoDb的方法

    這篇文章主要介紹了遷移sqlserver數(shù)據(jù)到MongoDb的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下...

    聽楓xl9682021-01-03
主站蜘蛛池模板: 欧美日韩国产一区二区三区在线观看 | 蜜桃成品人免费视频 | 欧美激情在线播放 | 日韩精品羞羞答答 | 草莓福利视频在线观看 | 久在线播放| av在线视| 成人福利电影在线观看 | 毛片视频网站在线观看 | 久久久久亚洲精品 | 久久精品亚洲一区二区三区观看模式 | 久久91精品久久久久清纯 | 911精品影院在线观看 | 国产免费一区二区三区最新不卡 | 九一传媒在线观看 | 成人一区二区三区在线 | 港台三级在线观看 | 99国产精品国产免费观看 | 少妇一级淫片免费放正片 | www.精品视频 | 性盈盈盈影院 | 黄色男女视频 | 精品国产中文字幕 | 男女生羞羞视频网站在线观看 | 男女一边摸一边做羞羞视频免费 | 免费看国产 | 欧美性受ⅹ╳╳╳黑人a性爽 | 伊人久操视频 | 免费看日韩av | 欧美一区二区三区成人 | 特级毛片全部免费播放器 | 欧美成人精品一区二区男人小说 | 日本网站一区二区三区 | 小雪奶水翁胀公吸小说最新章节 | 黄色毛片视频在线观看 | 精品国产96亚洲一区二区三区 | 亚洲国产一区二区三区 | 日韩99| 小视频免费在线观看 | 色婷婷综合久久久中文一区二区 | 操碰网|