- 求職 : Linux運(yùn)維
- 論壇徽章:
- 203
|
MongoDB副本集默認(rèn)會(huì)創(chuàng)建local、admin數(shù)據(jù)庫,local數(shù)據(jù)庫主要存儲(chǔ)副本集的元數(shù)據(jù),admin數(shù)據(jù)庫則主要存儲(chǔ)MongoDB的用戶、角色等信息。
慎用local數(shù)據(jù)庫
local數(shù)據(jù)庫,從名字可以看出,它只會(huì)在本地存儲(chǔ)數(shù)據(jù),即local數(shù)據(jù)庫里的內(nèi)容不會(huì)同步到副本集里其他節(jié)點(diǎn)上去;目前l(fā)ocal數(shù)據(jù)庫主要存儲(chǔ)副本集的配置信息、oplog信息,這些信息是每個(gè)Mongod進(jìn)程獨(dú)有的,不需要同步到副本集種其他節(jié)點(diǎn)。
在使用MongoDB時(shí),重要的數(shù)據(jù)千萬不要存儲(chǔ)在local數(shù)據(jù)庫中,否則當(dāng)一個(gè)節(jié)點(diǎn)故障時(shí),存儲(chǔ)在local里的數(shù)據(jù)就會(huì)丟失。
另外,對(duì)于重要的數(shù)據(jù),除了不能存儲(chǔ)在local數(shù)據(jù)庫,還要注意MongoDB默認(rèn)的WriteConcern是{w: 1},即數(shù)據(jù)寫到Primary上(不保證journal已經(jīng)寫成功)就向客戶端確認(rèn),這時(shí)同樣存在丟數(shù)據(jù)的風(fēng)險(xiǎn)。對(duì)于重要的數(shù)據(jù),可以設(shè)置更高級(jí)別的如{w: "majority"}來保證數(shù)據(jù)寫到大多數(shù)節(jié)點(diǎn)后再向客戶端確認(rèn),當(dāng)然這對(duì)寫入的性能會(huì)造成一定的影響。
慎用admin數(shù)據(jù)庫
當(dāng)Mongod啟用auth選項(xiàng)時(shí),用戶需要?jiǎng)?chuàng)建數(shù)據(jù)庫帳號(hào),訪問時(shí)根據(jù)帳號(hào)信息來鑒權(quán),而數(shù)據(jù)庫帳號(hào)信息就存儲(chǔ)在admin數(shù)據(jù)庫下。
mongo-9551 RIMARY> use admin
switched to db admin
mongo-9551 RIMARY> db.getCollectionNames()
[ "system.users", "system.version" ]
system.version存儲(chǔ)authSchema的版本信息
system.users存儲(chǔ)了數(shù)據(jù)庫帳號(hào)信息
如果用戶創(chuàng)建了自定義的角色,還會(huì)有system.roles集合
用戶可以在admin數(shù)據(jù)庫下建立任意集合,存儲(chǔ)任何數(shù)據(jù),但強(qiáng)烈建議不要使用admin數(shù)據(jù)庫存儲(chǔ)應(yīng)用業(yè)務(wù)數(shù)據(jù),最好創(chuàng)建新的數(shù)據(jù)庫。
admin數(shù)據(jù)庫里的system.users、system.roles2個(gè)集合的數(shù)據(jù),MongoDB會(huì)cache在內(nèi)存里,這樣不用每次鑒權(quán)都從磁盤加載用戶角色信息。目前cache的維護(hù)代碼,只有在保證system.users、system.roles的寫入都串行化的情況下才能正確工作,詳情參考官方issue SERVER-16092
從代碼中我們可以看出,MongoDB將將admin數(shù)據(jù)庫上的意向?qū)戞i(MODE_IX)直接升級(jí)為寫鎖(MODE_X),也就是說admin數(shù)據(jù)庫的寫入操作的鎖級(jí)別只能到DB級(jí)別,不支持多個(gè)collection并發(fā)寫入,在寫入時(shí)也不支持并發(fā)讀取。如果用戶在admin數(shù)據(jù)庫里存儲(chǔ)業(yè)務(wù)數(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->lock(_id, _mode); |
|