MongoDB 命名规范

李鹏0 1,196 次浏览

库名全部小写,禁止使用任何_以外的特殊字符,禁止使用数字打头的库名,如:123_abc

库以文件夹的形式存在,使用特殊字符或其它不规范的命名方式会导致命名混乱 
数据库名最多为64字符

在创建新的库前应尽量评估该库的体积、QPS等,提前与DBA讨论是应该新建一个库还是专门为该库创建一个新的集群

  • 不能为空字符串(” “)

  • 不能以$开头

  • 不能包含.(点号)和空字符串

  • 数据库名区分大小写(建议数据库名全部使用小写)

  • 数据库名最长为64个字节

  • 不要与系统保留的数据库名相同,这写数据库包括:admin,local,config等

【案例一】某开发在拿到DBA提供的MongoDB后由于MongoDB的权限控制比较宽松,导致该业务的开发在创建集合的时候懒得与DBA讨论,而是随意的将所有集合都创建在一个库中,最初并没有什么问题,因为业务的请求量并不大。半年后,该业务增长到了一个比较大的量级,而此时开发人员上线了一个新的项目,该项目的写入量很大,大部分都为批量更新,由于所有集合都存放在一个库中,这个新项目的批量更新带来了频繁的库级锁,由于库级锁是排他的(在有锁的同时不可读写)开发发现:这个实例上的所有业务的数据库请求都变得极其缓慢。最后开发配合DBA一起将该库拆散到了多个新的库中,将一库N集合转换为单库单集合,性能问题迎刃而解。

集合

集合名全部小写,禁止使用任何_以外的特殊字符,禁止使用数字打头的集合名,如:123_abc,禁止system打头

system是系统集合前缀 
集合名称最多为64字符 
为了避免库级锁带来的问题,应尽量对写入较大的集合使用“单库单集合”的结构,所以对于新增业务应尽量创建新库,而不是在现有库中创建新集合

一个库中写入较大的集合会影响其它集合的读写性能 
如果评估单集合数据量较大,可以将一个大表拆分为多个小表,然后将每一个小表存放在独立的库中,由于MongoDB是库级锁,因此这样做可以大幅减少并发写入带来的锁争用问题

  • 集合名不能为空字符串(” “)

  • 不能包含\0或空字符,这个字符表示键的结尾

  • 集合名不能以”system.”开头,此前缀是系统本身保留的

  • 集合名不能包含$字符(注:可包含 . 点号)

【案例2】 某业务上线前进行压力测试(该业务为大量更新场景),在压测时发现更新量在1000/s以内的时候更新性能优秀(2ms左右),而在更新量达到2500/s之后更新性能严重下降(10ms左右),经过查看原因是由于并发过大导致锁争用严重,于是采取对应优化措施:开发针对这个大表做HASH分表处理,将一个集合拆分为16个集合并,将每个集合安置在独立的库中。这个方案理论上将此前的的锁争用消耗降低到了此前的1/16, 再次进行压测,结论是更新性能达到了5000/s(达到IO瓶颈),远超业务3000/s的要求。 
MongoDB的集合拥有“自动清理过期数据”的功能,只需在该集合中文档的时间字段增加一个TTL索引即可实现该功能,但需要注意的是该字段的类型则必须是mongo Date();


发表评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen