亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MongoDB > 正文

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

2020-10-29 18:52:11
字體:
來源:轉載
供稿:網友

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

MongoDB 數據庫級鎖

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

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

初看起來庫級鎖在大并發環境下有嚴重的問題,但是 MongoDB 依然能夠保持大并發量和高性能,這是因為 MongoDB 的鎖粒度雖然很粗放,但是在鎖處理機制和關系數據庫鎖有很大差異,主要表現在:

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

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

建索引導致數據庫阻塞

坑爹指數:3星

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

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

復制代碼 代碼如下:

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

而應該使用

復制代碼 代碼如下:

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

不合理使用嵌入 embed document

坑爹指數:5星

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

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

復制代碼 代碼如下:

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

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


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

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

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

不合理使用 Array 字段

坑爹指數:4星

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

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

復制代碼 代碼如下:

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲欧美| 亚洲美女精品久久| 亚洲精品videossex少妇| 国产精品久久久久久久av电影| 激情亚洲一区二区三区四区| 日韩国产欧美精品在线| 黄色一区二区在线观看| 俺去亚洲欧洲欧美日韩| 亚洲精品456在线播放狼人| 亚洲欧美中文字幕在线一区| 亚洲成人久久电影| 亚洲天堂av图片| 国产精品久久久久久av下载红粉| 国模gogo一区二区大胆私拍| 91禁国产网站| 成人深夜直播免费观看| 国产69精品久久久久99| 成人在线免费观看视视频| 国产精品嫩草影院久久久| 精品福利一区二区| 91精品国产91久久久久久吃药| 日本欧美中文字幕| 欧美福利小视频| 亚洲石原莉奈一区二区在线观看| 亚洲精品免费网站| 97超级碰碰碰久久久| 欧美黑人巨大精品一区二区| 97久久久免费福利网址| 国产精品高清免费在线观看| 欧美久久久精品| 亚洲福利视频免费观看| 欧美日韩第一页| 91久久久久久久久久久久久| 欧美国产激情18| 欧美日韩第一页| 亚洲视频网站在线观看| 成人伊人精品色xxxx视频| 欧美在线中文字幕| 日本人成精品视频在线| 亚洲少妇中文在线| 国产欧美欧洲在线观看| 91在线色戒在线| 91久久久久久国产精品| 亚洲第一页中文字幕| 亚洲精品久久久久久久久| 欧美乱人伦中文字幕在线| 亚洲男人天堂手机在线| 日韩一中文字幕| 日韩中文字幕在线视频| 国产日韩在线亚洲字幕中文| 中日韩美女免费视频网站在线观看| 欧美大成色www永久网站婷| 1769国产精品| 日韩欧美在线免费观看| 欧美另类极品videosbestfree| 国产精品福利观看| 亚洲精品美女在线观看播放| 日韩中文字幕国产精品| 久久99热精品| 国产精品久在线观看| 亚洲国产欧美一区二区三区同亚洲| 日韩美女免费观看| 欧美激情a在线| 国产日韩欧美在线看| 欧美剧在线观看| 国产视频精品自拍| 欧美激情va永久在线播放| 亚洲精品自拍第一页| 国产精品嫩草影院一区二区| 欧美精品久久久久久久| 亚洲成成品网站| 中文字幕亚洲综合久久| 欧洲日韩成人av| 色噜噜久久综合伊人一本| 欧洲美女免费图片一区| 91九色精品视频| 懂色aⅴ精品一区二区三区蜜月| 亚洲欧美制服丝袜| 午夜免费久久久久| 国产精品视频资源| 97精品国产91久久久久久| 欧美色道久久88综合亚洲精品| 日韩网站免费观看| 91精品啪在线观看麻豆免费| 亚洲美女性视频| 狠狠做深爱婷婷久久综合一区| 青青草一区二区| 国产成人欧美在线观看| 97视频免费看| 欧美日韩亚洲一区二区三区| 国产91精品久久久久久久| 国产精品∨欧美精品v日韩精品| 国产精品国产亚洲伊人久久| 欧美日韩一区二区三区在线免费观看| 亚洲欧美国产一本综合首页| 欧美猛男性生活免费| 岛国av一区二区在线在线观看| 日本免费在线精品| 91沈先生在线观看| 欧美激情精品久久久久久蜜臀| 欧美在线视频网| 久久夜精品va视频免费观看| 97视频在线观看免费| 欧美日韩国产丝袜美女| 精品国内亚洲在观看18黄| 自拍偷拍亚洲在线| 亚洲va码欧洲m码| 欧美裸身视频免费观看| 国产精品99久久久久久久久久久久| 日韩视频免费在线观看| 亚洲乱码av中文一区二区| 日韩成人小视频| 69视频在线播放| 中文字幕日韩免费视频| 97免费在线视频| 日韩一级裸体免费视频| 亚洲自拍偷拍区| 日韩激情在线视频| 国产视频久久久久久久| 久久精品国产电影| xxav国产精品美女主播| 国产99久久精品一区二区| 精品欧美一区二区三区| 中文字幕免费精品一区| 日韩av最新在线观看| 亚洲r级在线观看| 午夜精品福利电影| 一区二区在线免费视频| 国产精品成人久久久久| 久久精品99国产精品酒店日本| 性欧美xxxx| 宅男66日本亚洲欧美视频| 91欧美视频网站| 俺去亚洲欧洲欧美日韩| 亚洲一区亚洲二区| 国产精品96久久久久久又黄又硬| 亚洲欧洲一区二区三区在线观看| 国产日韩精品在线观看| 日韩亚洲精品视频| 一区二区亚洲欧洲国产日韩| 亚洲黄页网在线观看| 国产主播喷水一区二区| 色爱精品视频一区| 最近2019年日本中文免费字幕| 日韩视频免费在线| 久久国产精品久久久久久久久久| 一本色道久久综合狠狠躁篇的优点| 日韩av男人的天堂| 欧美激情亚洲综合一区| 亚洲精美色品网站| 欧美日韩国产一区二区三区| 欧美大片免费看| 国产小视频91| 欧美色图在线视频| 亚洲成人xxx| 日韩小视频网址| 欧美电影免费观看网站| 91免费福利视频| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲视频一区二区| 久久久国产一区二区三区| 国产不卡av在线免费观看| 亚洲美女免费精品视频在线观看| 日韩av在线天堂网|