天天看點

MongoDB管理:慎用local、admin資料庫

mongodb副本集預設會建立local、admin資料庫,local資料庫主要存儲副本集的中繼資料,admin資料庫則主要存儲mongodb的使用者、角色等資訊。

local資料庫,從名字可以看出,它隻會在本地存儲資料,即local資料庫裡的内容不會同步到副本集裡其他節點上去;目前local資料庫主要存儲副本集的配置資訊、oplog資訊,這些資訊是每個mongod程序獨有的,不需要同步到副本集種其他節點。

在使用mongodb時,<code>重要的資料千萬不要存儲在local資料庫中</code>,否則當一個節點故障時,存儲在local裡的資料就會丢失。

另外,對于重要的資料,除了不能存儲在local資料庫,還要注意mongodb預設的writeconcern是<code>{w: 1}</code>,即資料寫到primary上(不保證journal已經寫成功)就向用戶端确認,這時同樣存在丢資料的風險。對于重要的資料,可以設定更進階别的如<code>{w: "majority"}</code>來保證資料寫到大多數節點後再向用戶端确認,當然這對寫入的性能會造成一定的影響。

當mongod啟用auth選項時,使用者需要建立資料庫帳号,通路時根據帳号資訊來鑒權,而資料庫帳号資訊就存儲在admin資料庫下。

system.version存儲authschema的版本資訊

system.users存儲了資料庫帳号資訊

如果使用者建立了自定義的角色,還會有system.roles集合

使用者可以在admin資料庫下建立任意集合,存儲任何資料,但<code>強烈建議不要使用admin資料庫存儲應用業務資料</code>,最好建立新的資料庫。

admin資料庫裡的system.users、system.roles2個集合的資料,mongodb會cache在記憶體裡,這樣不用每次鑒權都從磁盤加載使用者角色資訊。目前cache的維護代碼,隻有在保證system.users、system.roles的寫入都串行化的情況下才能正确工作,詳情參考官方issue server-16092

從代碼中我們可以看出,mongodb将将admin資料庫上的<code>意向寫鎖(mode_ix)</code>直接更新為<code>寫鎖(mode_x)</code>,也就是說<code>admin資料庫的寫入操作的鎖級别隻能到db級别</code>,不支援多個collection并發寫入,在寫入時也不支援并發讀取。如果使用者在admin資料庫裡存儲業務資料,則可能遭遇性能問題。