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数据库里存储业务数据,则可能遭遇性能问题。