MongoDB 使用规范

整体设计要求

  1. 数据库字符编码规范(统一为 UTF8)
  2. 数据库命名:数据库名大小写不敏感,建议全小写,单词之间以下划线分隔,尽量使用与项目相关的命名,通常一个项目一个数据库,不要在名字中包含空格、null、,“,数据库命名保持在16个字符以内。
  3. 集合命名:集合的名字大小写敏感,建议使用全小写,单词之间以下划线分隔,不要在名字中包含空格、null、$ 等,在集合上创建索引时,为索引指定名字,集合命名保持在 24 个字符以内。
  4. 字段命名:建议使用全小写,单词之间以下划线分隔,不要使用下划线_作为字段开头的字符,除_id之外,字段名不能包含点.和 null,也不能以$开头,字段命名保持在 30 个字符以内。
  5. 模型设计:单个文档最大不超过 16M,非结构化数据建议保存在 GridFS,原子更新仅限于单文档,数组不宜无限制频繁增长,数组嵌套层次建议不要超过2层。
  6. 字段类型选择:MongoDB 使用的是扩展 JSON 数据类型,MongoDB 的数据库字符类型是UTF8,整型数字建议选择以 Int 或 Long 类型保存,时间建议选择以 Date 类型保存,金额建议选择以 Decimal128 类型保存,如果业务应用中可以找到唯一的 ID,可以将其设置为 _id。
  7. 需要校验数据模型的场景下,建议启用文档验证;文档验证通过对集合数据模式定义规则并在服务器端进行校验来保证集合内数据格式的一致性。
  8. 模型设计原则:从数据的读写访问方式出发,为重要的场景优化,不求面面俱到,模式设计是与应用紧密相关联的。即使使用同一份数据时,不同的应用可能无法从当前应用设计的模式中受益。
  9. 模型设计策略:基于内嵌方式的”反范式”模式设计,传统的引用方式,也叫做关联方式,混合方式:混合使用”反范式”和引用方式。
  10. 单个复制集或者分片的数据大小(datasize,数据压缩前,非存储大小)不应超过 2TB。

索引规范

  1. 面向查询来设计索引,做到每个常用查询都有索引对应,不要创建不必要的索引,做到每个索引都有对应的查询。
  2. 注意复合索引中的字段的顺序:精确匹配—排序—范围查询。
  3. 如有可能尽量创建”部分”索引(Partial Index)以减少索引的大小。
  4. 索引项不超过 1024 字节。
  5. MongoDB 每个集合不能创建超过 64 个索引,最佳实践中,每个集合的索引不应超过 7 个。
  6. 创建索引时指定索引的命名;索引的命名空间(数据库命名+集合命名+索引命名)不超过128字节。
  7. 复合索引中的字段个数不得超过 31 个,最佳实践中每个复合索引不应复合超过 5 个字段。
  8. 单个索引中包含数组的字段不能超过 1 个。
  9. 生产系统应该在维护窗口内创建索引,避免对应用系统造成影响。

查询语句规范

  1. 设计索引来优化 sort 操作符。
  2. 将缩小范围的操作符前置。
  3. count 运算需要扫描全部数据,所以尽量在 count 运算前缩小数据范围。
  4. 分片集合需要使用 aggregate 命令进行 count,或者使用 countDocuments。

分片片键选择规范

  1. 片键选择的主要因素:基数、重复频率、是否递增,片键应该为基数大、重复频率低、不递增,避免将递增的字段选择为片键。
  2. 当范围分片不适用的情况下,可以考虑哈希分片。
  3. 构建跨数据中心的多活架构时,可以考虑分片标签。
  4. 可以使用”预分片”,减少自动平衡可能带来的性能影响。
  5. 考虑使用均衡窗口,设置运行自动均衡的时间。
  6. mongos 和配置服务器不同步时,mongos 使用 flushRouterConfig 读取最新的配置信息。

数据库连接规范

  1. MongoDB 的开发语言驱动全面,而且文档完善,请尽量选择使用官方开发语言驱动。
  2. 在应用连接数据库时需要配置数据库连接池(最小连接数,最大连接数、最大空闲时间),配置合理的读写安全策略(ReadConcern 和 WriteConcern),合理的读偏好。
  3. MongoDB 3.6+ 版本以及使用对应兼容的 Driver 版本,增加 retryReads=true 参数可在发生网络错误时重试读操作。MongoDB 4.2+ 版本即对应兼容的 Driver 版本,默认支持可重试读。
  4. 可重试写入允许 MongoDB 驱动程序在遇到网络错误或无法在副本集或分片集群中找到健康的主节点时自动重试某些写入操作。MongoDB 3.6+ 版本以及使用对应兼容的 Driver 版本,增加retryWrites=true 参数可在发生网络错误或复制集选举时重试写操作。 MongoDB 4.2+ 版本即对应兼容的 Driver 版本,默认支持可重试写。
  5. 可以利用从节点的特性,使用从节点进行统计计算,离线数据分析以及不需要强一致性的在线查询。