校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 記一次Mongodb中admin數(shù)據(jù)庫導致的事故

記一次Mongodb中admin數(shù)據(jù)庫導致的事故

熱門標簽:杭州人工電銷機器人價格 廣州長安公司怎樣申請400電話 怎么投訴地圖標注 電銷機器人是什么軟件 濟南電銷機器人加盟公司 云南外呼系統(tǒng) 蘋果汽車租賃店地圖標注 呼和浩特電銷外呼系統(tǒng)加盟 老虎洗衣店地圖標注

前言

MongoDB副本集默認會創(chuàng)建local、admin數(shù)據(jù)庫,local數(shù)據(jù)庫主要存儲副本集的元數(shù)據(jù),admin數(shù)據(jù)庫則主要存儲MongoDB的用戶、角色等信息。

Mongodb的gridfs一次插入數(shù)據(jù)的時候會自動創(chuàng)建幾個索引,我們程序里面的賬號沒有createIndex權限,我需要手動創(chuàng)建一下。結果連接到mongo服務器之后忘記執(zhí)行use xxxdb來切換數(shù)據(jù)庫了,于是在admin數(shù)據(jù)庫里面創(chuàng)建了一個索引,結果導出一邊的程序報出來很多驗證問題。

Mongo的admin數(shù)據(jù)庫太脆弱了,只是創(chuàng)建一個索引就掛了。長個教訓,以后千萬不要手動修改它,更不要用admin保存數(shù)據(jù)。

反思一下,這次操作失誤其實爆出我平時一些不好的習慣。

首先,連接mongo應該指定目標數(shù)據(jù)。而我之前都是連接到admin,然后用use切換到目標數(shù)據(jù)庫。這樣難免會忘記。

$ # 錯誤使用
$ mongo ourdomain.com/admin -u tom -p tompass
$ # 正確的使用
$ mongo ourdomain.com/mydb -u tom -p tompass --authenticationDatabase admin

第二,錯誤的在admin數(shù)據(jù)庫執(zhí)行createIndex,返回的結果明確顯示索引創(chuàng)建成功。

{
  "createdCollectionAutomatically" : true,
  "numIndexesBefore" : 1,
  "numIndexesAfter" : 2,
  "ok" : 1,
  ...
}

但是我忽略了,繼續(xù)在正確的數(shù)據(jù)庫創(chuàng)建索引。不然可以早一些發(fā)現(xiàn)問題。

最后,創(chuàng)建索引應該自動化,比如gridfs這種對md5, filename創(chuàng)建索引的。

慎用admin數(shù)據(jù)庫

當Mongod啟用auth選項時,用戶需要創(chuàng)建數(shù)據(jù)庫帳號,訪問時根據(jù)帳號信息來鑒權,而數(shù)據(jù)庫帳號信息就存儲在admin數(shù)據(jù)庫下。

mongo-9551:PRIMARYgt; use admin
switched to db admin
mongo-9551:PRIMARYgt; db.getCollectionNames()
[ "system.users", "system.version" ]
  • system.version存儲authSchema的版本信息
  • system.users存儲了數(shù)據(jù)庫帳號信息
  • 如果用戶創(chuàng)建了自定義的角色,還會有system.roles集合

用戶可以在admin數(shù)據(jù)庫下建立任意集合,存儲任何數(shù)據(jù),但強烈建議不要使用admin數(shù)據(jù)庫存儲應用業(yè)務數(shù)據(jù),最好創(chuàng)建新的數(shù)據(jù)庫。

admin數(shù)據(jù)庫里的system.users、system.roles2個集合的數(shù)據(jù),MongoDB會cache在內(nèi)存里,這樣不用每次鑒權都從磁盤加載用戶角色信息。目前cache的維護代碼,只有在保證system.users、system.roles的寫入都串行化的情況下才能正確工作,詳情參考官方issue SERVER-16092

從代碼中我們可以看出,MongoDB將將admin數(shù)據(jù)庫上的意向?qū)戞i(MODE_IX)直接升級為寫鎖(MODE_X),也就是說admin數(shù)據(jù)庫的寫入操作的鎖級別只能到DB級別,不支持多個collection并發(fā)寫入,在寫入時也不支持并發(fā)讀取。如果用戶在admin數(shù)據(jù)庫里存儲業(yè)務數(shù)據(jù),則可能遭遇性能問題。

if (supportsDocLocking() || enableCollectionLocking) { 
if (supportsDocLocking() || enableCollectionLocking) {
+
+ // The check for the admin db is to ensure direct writes to auth collections
+ // are serialized (see SERVER-16092).
+ if (_id == resourceIdAdminDB  !isRead) {
+ _mode = MODE_X;
+ }
+
_lockState-gt;lock(_id, _mode); 

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

標簽:廈門 雞西 興安盟 泰安 無錫 自貢 遼陽 玉林

巨人網(wǎng)絡通訊聲明:本文標題《記一次Mongodb中admin數(shù)據(jù)庫導致的事故》,本文關鍵詞  記,一次,Mongodb,中,admin,數(shù)據(jù)庫,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《記一次Mongodb中admin數(shù)據(jù)庫導致的事故》相關的同類信息!
  • 本頁收集關于記一次Mongodb中admin數(shù)據(jù)庫導致的事故的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 鹤庆县| 石河子市| 渝中区| 团风县| 从化市| 怀仁县| 新和县| 福贡县| 循化| 班玛县| 枣阳市| 镇巴县| 高邑县| 定陶县| 徐州市| 高州市| 江永县| 芜湖县| 丰都县| 洪江市| 离岛区| 巫溪县| 昌吉市| 铜鼓县| 巴南区| 射洪县| 湖口县| 葵青区| 岳池县| 绥德县| 大田县| 南皮县| 南澳县| 海原县| 革吉县| 临沧市| 衡东县| 成都市| 通化市| 卓尼县| 井研县|