MongoDB高手进阶指南

MongoDB高手进阶指南

1、概述

(1)版本历程

  • 0.x 起步节点
  • 1.x 支持复制集和分片
  • 2.x 更加丰富的数据库功能
  • 3.x 合并了一家专门作数据库引擎的Wired Tiger公司,更加完善的周边生态环境
  • 4.x 支持分布式事务

MongoDB的正式版本都是偶数版本,x.x.x,主要版本(x.x)大约每一年升级一次,小版本主要是修复问题,一般1-2个月发布一次。javascript

MongoDB支持原生高可用:Application经过Driver链接到Primary节点,一个Primary节点链接多个Secondary节点。java

MongoDB支持水平扩展,分片集群:Driver链接多个Mongos,Mongos链接多个Shard,每一个Shard都是一个Primary和多个Secondary。node

MongoDB高手进阶指南

2、复制集

主要用于实现服务的高可用git

(1)特征

MongoDB的复制集主要具有以下特征:github

  • 快速复制:数据写入时将数据迅速复制到另外一个节点。
  • 故障转移:在接受写入的节点发生故障的时候自动选择另外一个新的节点代替。
  • 其余做用:数据分发、读写分离、异地容灾。

(2)MongoDB的数据复制原理

  • 一个修改操做会被记录到oplog,有一个线程监听oplog,若是有变更就会将这个变更应用到其余的数据库上。
  • 从节点在主节点上打开一个tailable游标,不断获取新加入的oplog,并在从库上回放

(3)节点间选举

  • 一个典型的复制集由3个以上具备投票权的节点构成,一个Primary接受写入操做和选举时投票,两个Secondary复制Primary节点数据和选举时投票。面试

  • 具备投票权的节点两两发送心跳数据,主节点5次没有收到心跳被定义为失联状态。而后MongoDB基于Raft协议进行选举。
  • Replica Set中最多50个节点,具备投票权的节点最多只有7个
  • 影响选举的因素:整个集群必须有大多数节点存活
  • 被选举为主节点的条件
    • 可以与多数节点创建链接
    • 具备较新的oplog
    • 具备较高的优先级(能够配置)
  • 经常使用的配置选项
    • 是否具备投票权(v参数):有就会参与投票。
    • 优先级(priority参数):优先级越高的节点越优先称为主节点。优先级为0的节点没法成为主节点。
    • 隐藏(hidden参数):复制数据,可是对应用不可见。隐藏节点具备投票权,可是优先级必须为0。
    • 延迟(slaveDelay参数):复制N秒以前的数据,报纸与主节点的时间差
  • 复制集的部署事项:主从数据库配置同样,硬件具备独立性,软件版本一致。

3、分片集群

MongoDB高手进阶指南

(1)mongos路由节点

  • 提供集群的单一入口
  • 转发应用端请求
  • 选择合适的数据节点进行读写
  • 合并多个数据额节点的返回结果
  • 无状态
  • 至少有两个mongos节点

(2)config配置目录节点

  • 提供集群元数据的存储,分片数据分布的映射

(3)数据节点

  • 以复制集为单位
  • 横向扩展
  • 最大1024个分片
  • 分片之间数据不能重复
  • 全部分片在一块儿才能够完成工做

(4)特色

  • 对应用全透明,无须特殊处理
  • 数据自动均衡
  • 动态扩容,无须下线
  • 提供三种分片方式

(5)分片集群的3中方式

  • 基于范围:片键范围查询性能好,优化读,数据分布可能不均匀,容易产生热点。
  • 基于Hash:数据分布均匀,写优化,范围查询效率低,适用于日志,物联网高并发场景。
  • 基于Zone:按照地域、时效等属性分为多个Zone。一个集合(collection)中的全部的对象都被存放到一个块(chunk)中,默认块的大小是 64MB。当数据容量超过64 MB,才有可能实施一个迁移

(6)合理的架构

  • 一个分片不超过3TB,尽可能保证在2TB。经常使用索引必须容纳进内存。正则表达式

  • 须要多少个分片?算法

    分片数量=max(所需存储容量/单节点挂载容量, 工做集大小/单服务器内存容量0.6, 并发总量/单节点并发量0.7)mongodb

  • 如何选择片键?数据库

    • 基数,基数越大越好,好比百家姓要比年龄基数大。
    • 写分布,数据分布不均匀,好比学生的年龄。
    • 定向性,mongos能够直接将数据定位。

4、灾备与恢复

(1)备份

mongodump -h HostName:Port -d DatabaseName -c CollectionName

使用--oplog参数实现增量备份。复制从mongodump从开始执行到完成全部的oplog。会输出到dump/oplog.bson文件。

(2)恢复

mongostore -h HostName:port -d DatabaseName -c CollectionName Filename.bson

使用--oplogReplay参数实现增量恢复。经过—-oplogLimit参数和--oplogFile参数实现特定时间点的恢复。

在分片集群的备份中,多个分片可能在发生数据迁移和均衡,致使备份的数据发生错乱,能够经过中止均衡器解决。

(3)备份方案

  • 延迟节点备份
  • 全量备份+OpLog增量备份
    • mongodump
    • 复制数据文件
    • 文件系统快照

5、事务支持

(1)写事务

writeConcern参数:决定一个写操做落到多少个节点上才算成功。

  • w参数:
    • 1:默认,要求写操做已经传播到独立的mongo实例或者副本集的Primary成员
    • 0:不要求确认写操做。
    • majority:要求写操做已经传播到大多数具备存储数据且具备投票权的成员。
  • j参数:
    • true:写操做落到journal算成功。
    • false:写操做落到内存算成功。

(2)读事务

  • 从哪里读?位置
    • readPreference参数控制,取值以下:
    • Primary(默认):主节点,通常用户下订单
    • PrimaryPrefered:主节点优先,通常用户查订单
    • Secondary:从节点,通常用于报表
    • SecondaryPrefered:优先从节点。
    • nearest:就近原则,由PingTime决定,通常用于上传图片分发到全球
    • 结合使用Tag定向某些节点:经过指定{"purpose": ""}实现。
  • 什么样的数据能够读?隔离性
    • readConcern参数控制,取值以下:
    • avaliable:读取全部可用的数据。
    • local(默认):读取全部可用而且属于当前分片的数据。
    • majority:读取大多数节点上提交完成的数据,防止脏读。
      • 实现机制:节点使用MVCC机制维护多个版本,每一个大多数节点确认过的版本数据做为一个快照,MongoDB经过维护多个快照实现连接不一样的版本,快照维持在再也不使用。
    • linearizable:线性化读取文档,保证以前全部写入的,可以保证出现网络分区的时候读取的安全,由于在读取的时候会检查全部节点。
    • snapshot:读取最近快照中的数据。
    • 如何安全的读写?
    • readConcern设置为majority
    • writeConcern设置为majority

(3)多文档事务MongoDB的ACID

  • A=4.0版本的复制集多表多行,4.2版本的分片集群多表多行,1.0版本的单表单文档
  • C=writeConcern和readConcern。
  • I=readConcern。
  • D=Journal和Replication。

(4)ChangeStream

用于追踪变动,相似于触发器,基于oplog实现,返回的_id可用于断点恢复,有个cursor进行追踪,推送majority条件的变动

  • 应用程序能够实时的了解数据的变化。
  • 复制协议版本必须是1且使用WT存储引擎
  • 只有副本集和Shard可用。
  • 使用MongoDB Driver3.6,而且必须开启3.6版本特性参数featureCompatibilityVersionwriteConcern必须配置。
  • ChangeStream与触发器的异同点:
    • ChangeStream是异步的,基于事件回调机制。
    • ChangeStream每一个客户端都会生效一次。
    • ChangeStream支持断点,触发器只能事务回滚。
  • 应用场景:
    • 跨集群复制
    • 微服务联动
  • ChangeStream的中断事件不能超过oplog的回收时间。

6、面试题

MongoDB的优点?

  • 面向Collection和Document,以JSON格式保存数据,支持二进制数据和大型对象。
  • 高性能,支持Document嵌入,减小了数据库上的IO操做,基于具备完整的索引支持,支持快速查询。
  • 高可用,复制集,提供自动故障转移。
  • 高可扩展,分片集群。
  • 支持聚合管道和全文索引。
  • 支持插件式存储引擎,WiredTiger存储引擎和in-memory存储引擎。

  • MongoDB支持的数据类型:

    • 相似于Java中的:String(UTF-8编码才是合法的)、Integer、Double、Boolean、Arrays、Datetime。
    • 特有的:ObjectId(用于存储文档ID,ObjectId基于分布式主键实现MongoDB分片也可用)、Min/Max Keys(将一个值与BSON元素最低值和最高值比较)、Code(JavaScript代码)、Regular Expression(正则表达式)、Binary Data(二进制数据)、Null(空值)、Object(内嵌的文档)。

什么是mongod,默认参数有哪些?

  • mongod是处理MongoDB系统的主要进程,默认参数有--dbpath=/data/db,--port=27017

MySQL和MongoDB的区别:

  • MongoDB是非关系型数据库
  • MySQL采用虚拟内存+持久化的方式
  • MySQL使用传统的SQL语句方式
  • MongoDB常见的架构有副本集和分片集群,MySQL有MS、MHA、MMM等架构
  • MongoDB基于内存,将热数据存储在物理内存,从而实现数据告诉读写,MySQL每一个存储引擎都有本身的特色。

更新操做会马上fsync到磁盘?

  • 不会,磁盘写操做默认延迟执行,写操做可能在2~3s内落到磁盘,能够经过syncPeriodSecs参数配置。

MongoDB支持的索引类型?

  • 单字段索引
  • 复合索引
  • 多键索引
  • 全文索引
  • Hash索引
  • 通配符索引
  • 2d sphere索引

MongoDB在A:{B,C}上创建索引,查询A:{B,C}和A:{C,B}都会使用索引吗?

因为MongoDB索引使用B-tree树原理,只会在A:{B,C}上使用索引。

若是块移动操做(moveChunk)失败了,我须要手动清除部分转移的文档吗?

不须要,移动操做是一致而且是肯定的。一次失败后,移动操做会不断重试。当完成后,数据只会出如今新的分片里。

数据在何时才会扩展到多个分片里?

MongoDB 分片是基于区域(range)的。因此一个集合(collection)中的全部的对象都被存放到一个块(chunk)中,默认块的大小是 64Mb。当数据容量超过64 Mb,才有可能实施一个迁移,只有当存在不止一个块的时候,才会有多个分片获取数据的选项。

更新一个正在被迁移的块(Chunk)上的文档时会发生什么?

更新操做会当即发生在旧的块(Chunk)上,而后更改才会在全部权转移前复制到新的分片上。

若是一个分片(Shard)中止或很慢的时候,发起一个查询会怎样?

若是一个分片中止了,除非查询设置了 “Partial” 选项,不然查询会返回一个错误。若是一个分片响应很慢,MongoDB 会等待它的响应。

什么是Arbiter?

仲裁节点不维护数据集。 仲裁节点的目的是经过响应其余副本集节点的心跳和选举请求来维护副本集中的仲裁。

复制集节点类型有哪些?

  • 优先级0型(Priority 0)节点
  • 隐藏型(Hidden)节点
  • 延迟型(Delayed)节点
  • 投票型(Vote)节点以及不可投票节点

7、应用案例

(1)MongoDB典型的应用场景

MongoDB是OLTP数据库,原则上MySQL和Oracle能作的事情,MongoDB也均可以。MongoDB具备原生的横向扩展能力,灵活的模型支持,适合快速开发迭代,数据模型多变的场景,而且MongoDB使用了JSON数据结构,很是适合微服务领域。

基于功能的选择

MongoDB 传统关系型数据库
亿级以上的数据量支持 Easy 分库分表
灵活的表结构 Easy 数据字典,关联查询
高并发读 Easy Hard
高并发写 Easy Hard
跨地区的集群 Easy Hard
数据分片 Easy 中间件
地址位置查询 完整支持 PostGreSQL还能够,其余的很麻烦
聚合计算 Easy GroupBY,复杂的SQL
异构数据 Easy 数据字典,关联查询
大、宽表 Easy 性能局限

基于场景的选择

  • 移动端应用、小程序

    场景特色:基于RESTful API,快速迭代,数据结构频繁变化,大部分功能基于地理信息,爆发式的增加,高可用

    业界案例:Keep(说实在的, 健身还不如专门请个私教单独一对一),摩拜单车,ADP

  • 电商的海量商品数据

    场景特色:商品信息一应俱全,数据库模式设计困难

    业界案例:京东商城,小红书,GAP

  • 内容管理:

    场景特色:内容数据多样,扩展困难

    业界案例:Adobe AEM,SiteCore

  • 物联网IoT

    场景特色:传感器数据结构每每是半结构化数据,传感器实时采集的数据量巨大,容易增加到百亿级别

    业界案例:华为、Bosch、MindSphere

  • SaaS应用

    场景特色:多租户模式,需求多变,数据增加快

    业界案例:ADP、Teambition

  • 主机分流

    场景特色:高性能查询,实时同步机制

    业界案例:金融行业

  • 实时在线分析

    场景特色:流数据计算,快速计算,秒级响应

    业界案例:MongoDB缓存机制、MongoDB聚合框架、微分片架构

  • 关系型迁移到MongoDB承载更多的数据和并发

    场景特色:数据增加致使性能低,分库分表方案复杂

    业界案例:头条、网易、百度、东航、中行

(2)MongoDB对接MySQL、Oracle

从传统的关系型数据库迁移到MongoDB须要综合考虑的几个问题:

  • 整体架构

    • 运维工具、脚本
    • 权限设置
    • 分布式
    • 监控
    • 备份恢复
  • 模式设计

    表结构整合为JSON文档

  • SQL语句/存储过程/ORM层

    原始SQL

    存储过程特性

    ORM框架

  • 数据迁移

    数据迁移的几个方式:

    (1)数据库导出导入,导出JSON或者CSV

    (2)ETL批量迁移工具,Kettle、Talend

    (3)实时同步工具,infomatica、Tapdata(会运行一个Agent),通常是解析日志模式

    (4)应用主动迁移

(3)MongoDB与Spark

MongoDB做为Spark的存储方案,MongoDB相比HDFS更加细粒度存储,而且支持结构化存储。MongoDB支持索引机制,使得Spark的读取更加快速,HDFS是一次写,屡次读,可是MongoDB适合Spark的读写混合场景。MongoDB是在线式存储,毫秒级的SLA。

(4)可视化与ETL

MongoDB能够经过BI Connector实现与SQL的结合。BI Connector会自动产生DRDL映射文件,而后咱们根据映射文件来编写SQL语句实现数据展现。

BI Connector是企业版的,而且是一个独立的服务。

BI Connector暴露的是MySQL驱动构建的解释器,而后做为一个虚拟的MySQL服务。

(5)两地三中心高级集群设计

容灾级别 描述 RPO RTO
Level0 无灾备源,只有本地的数据备份 24小时 4小时
Level1 本地备份+异地保存,将关键数据保存并送到异地 24小时 8小时
Level2 双中心主备,经过网络创建热点备份 秒级 数分钟到半小时
Level3 双中心双活,互相进行数据备份 秒级 秒级
Level4 双中心双活+异地热备,当一个城市的两个中心不可用时切换 秒级 分钟级

MongoDB高手进阶指南

网络层解决方案

GSLB实现MongoDB负载均衡器的健康检查,经过域名实现应用层的切换。

应用层解决方案

使用负载均衡技术,虚拟IP技术,使用同一个Session,使用同一套数据。

使用HAProxy或者Nginx做为本地的SLB本地负载均衡器。

数据库层解决方案

经过日志同步或者存储镜像实现数据拷贝。

复制集跨中心2+2+1解决方案

2+2+1保证了主中心的高可用,oplog同步实现了毫秒级的拷贝。

(6)全球多写

因为复制集只解决了读取的问题,写入仍是要在Primary上进行因此不可以保证几个国家的用户体验。

MongoDB高手进阶指南

全球多写本质上是一个特殊的分片集群。将集群中的分片节点分区域部署。要实现全球分片多写,那么要实现如下三点条件:

  • 针对要分片的数据集合,模型中增长一个区域字段

  • 给集群中的每一个分片添加区域标签

    sh.addShardTag("shard0", "Asia");
  • 为每一个区域指定属于这个区域的分片块范围

    sh.addShardRange("tableName", {"location": "China"}, "Asia");

全球多写的事务性问题:

  • 当海外用户访问读取数据时,但愿是从海外本地读取,所以须要设置readPreference:"nearest"

  • 当海外用户下单,那么须要写到本地大部分节点才算成功,在国内的海外数据等待oplog同步,所以须要设置writeConcern:"majority"
  • 当须要读取全部区域的数据进行汇总时,只须要设置读取本地主从节点为:readPreference:"nearset"就会保证从本地读取就近的数据。
  • 加入海外用户在国内下单,那么就会致使须要写入远程海外节点,由于配置了writeConcern:"majority"须要写入大部分节点。

固然,MongoDB也能够在国内和海外向Oracle那样同时部署两套集群,经过第三方工具实现同步,中间也须要处理数据冲突问题。常见的中间件有:Tapdata和MongoShake这两个第三方中间件也是基于oplog的

8、链接与开发注意事项

  • 链接到复制集:mongodb://node1,node2/dbname?[option]
  • 链接到分片集:mongdb://mongos1,mongos2/dbname?[option]
  • 支持域名解析:mongodb+srv://mongos或者node地址
  • mongos前不可使用负载均衡器,由于mongos自带LB
  • 事务支持:
    • 使用4.2兼容驱动
    • 事务在60秒内完成,不然会被取消。
    • 涉及事务的分片不能使用仲裁节点
    • 事务会影响Chunk迁移效率
    • 正在迁移的Chunk可能形成事务失败。
    • 多文档事务必须在Primary节点进行
    • readConcern只应该在事务级别设置,不该该在每次读写上进行。
  • 其余:
    • 每个查询尽可能对应一个索引。
    • 尽可能使用覆盖索引。
    • 使用projection来减小返回到Client的内容。
    • 处理分页避免使用count,只是用limit。
    • 尽可能控制在1000个更新文档事务以内。
  • 系统上线时的必要检查:
    • 禁用NUMA,不然在某些状况下可能致使突发的大量的SWAP交换。
    • 禁用Transparent Huge Page,不然会影响数据库效率。
    • tcp_keepalive_time设置为120秒,容忍网络问题。
    • 设置最大文件句柄打开数目。
    • 关闭文件系统的atime,提升访问效率。

9、索引管理

MongoDB中的索引是特殊结构,索引存储在易于遍历的数据集合中,并且使用BTree结构。

(1)建立索引要考虑的问题

  • 每一个索引至少须要8KB的空间
  • 添加索引会对写操做性能产生影响,由于每一个集合在插入时也必须更新索引
  • 索引处于Action状态时,每一个索引都会占用磁盘空间和内存

(2)索引的限制

  • 索引名称超度不能够超过128字段
  • 复合索引不能超过32个属性
  • 每一个集合不能超过64个索引

(3)索引管理

  • 建立索引

    db.collection.createIndex(<key>, <option>);
    参数 数据类型 描述
    background Boolean 建立索引会阻塞数据库操做,能够指定为后台操做。
    unique Boolean 是否创建惟一索引
    name String 索引的名称
    dropDups Boolean 3.0版本废弃,创建索引时是否删除重复记录
    sparse Boolean 对文档中不存在的字段数据不创建索引
    expireAfterSeconds Integer 秒,设定索引的TTL
    v Index version 索引的版本号
    weight Document 索引权重值,数值在1-99999之间
    default_language String 对于文本类型的索引,决定了分词器规则,默认为英语
    language_override String 对于文本类型的索引,指定了包含在文档中的字段名
  • 查看索引

    db.collection.getIndexs();
  • 删除索引

    db.collection.dropIndexs();
    db.collection.dropIndex();
  • 查看建立过程和终止

    db.currentOp();
    db.killOp();
  • 使用状况

    // 获取索引访问信息
    $indexStats
    // 返回查询计划
    explain()
    // 控制索引, 强制MongoDB使用特定索引进行查询
    hint()

(4)单值索引

MongoDB能够在任何字段上建立索引,默认状况下会在_id字段建立索引,_id索引时为了防止客户端具备相同的值建立的索引,该索引没法删除。在分片集群中使用_id索引。

(5)复合索引

将多个键组合到一块儿,这样能够加速匹配多个键的查询。

  • 没法建立具备Hash索引的复合索引
  • 复合字段的索引是有顺序的
  • 复合索引支持前缀匹配查询
db.collection.createIndex( { <field1>: <type>, <field2>: <type2>, ... } )

(6)多键索引

MongoDB使用多键索引为数组的每一个元素建立索引,多键索引能够创建在字符串、数字、内嵌文档类型的数组上。若是建立的字段包含数组的值,那么MongoDB将会自动肯定是否建立索引。

db.coll.createIndex( { <field>: < 1 or -1 > } )

(7)全文索引

MongoDB机制提供了全文索引类型,支持在集合中搜索字符串。

db.collection.createIndex( { key: "text",key:"text" ..... } )

MongoDB提供权重以及通配符的建立方式。查询方式多个字符串空格隔开,排除查询使用“-”每一个全文索引能够经过设置权重来分配不一样的搜索程度,默认权重为1,对于文档中的每一个索引字段,MongoDB将匹配数乘以权重并将结果相加。 使用此总和,MongoDB而后计算文档的分数

  • 每一个集合最多只有一个全文索引
  • 若是查询使用$text表达式就没法使用hint()函数

(8)Hash索引

散列索引使用散列函数来计算索引字段值的散列值。 散列函数会折叠嵌入的文档并计算整个值的散列值,但不支持多键(即数组)索引。

db.collection.createIndex( { _id: "hashed" } )

散列索引支持使用散列分片键进行分片。 基于散列的分片使用字段的散列索引做为分片键来分割整个分片群集中的数据。

10、安全架构

经过在命令行方式加入--auth参数或者在配置文件添加authorization: enabled开启安全选项。

使用命令行客户端操做:mongo -uUsername -pPassword --authenticationDatabase DbName

(1)MongoDB支持的安全策略

  • 用户名密码
  • 证书
  • LDAP,企业版
  • Kerberos,企业版

(2)针对集群节点之间的认证

  • KeyFile,统一将Key拷贝到不一样的节点,随机的字符串
  • X.509,基于证书的模式,经过内部或者外部的CA服务器颁发,每一个节点都有不一样的证书

(3)MongoDB支持的用户权限

MongoDB的Role创建在Action和Resource上,Action定义了一种动做,Resource表示某个动做能够操做的资源。MongoDB内置权限角色继承关系图以下:

MongoDB高手进阶指南

自定义角色和用户分别可使用createRole()和createUser()。

(4)传输加密

MongoDB支持TLS/SSL来加密全部的网络数据传输,无论是内部节点仍是客户端到服务器。

(5)落盘加密(企业版)

  • 生成master key,这是一个用来加密数据库的key。每个数据库都对应不一样的key。
  • 当落盘时,基于不一样数据库的key进行数据加密。
  • key的管理经过使用KMIP协议的秘钥管理服务器完成。MongoDB也支持文件的方式进行管理。

(6)字段加密

  • MongoDB支持字段级别的加密。
  • 当向加密的数据发送请求的时候,MongoDB的驱动直接联系秘钥管理器,获取秘钥,而后根据查询条件直接去数据库查询,将获取的加密数据拉取过来而后使用秘钥解密返回明文数据。数据的加密解密都发生在MongoDB的驱动程序。

(7)审计(企业版)

  • 记录格式为JSON
  • 能够记录到本地文件或者syslog
  • 记录的内容有:DDL、DML、用户认证

审计日志记录到syslog:

--auditDestination syslog

审计日志记录到指定文件:

--auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json

对删除进行审计:

--auditDestination file --auditFormat JSON --auditPath /path/to/auditLog.json --auditFilter '{atype: {$in: ["dropCollection"]}}'

11、性能优化

(1)mongostat

用于了解MongoDB运行状态的工具。

  • insert、query、update、delete:最近一秒钟有多少个操做
  • getmore:针对游标操做,最近一秒钟的操做
  • command:建立索引等操做,最近一秒钟的执行个数
  • dirty:超过20%的时候可能会阻塞新请求,由于这个参数表示尚未刷盘数据占比
  • used:超过95%的时候可能会阻塞新请求,因为MongoDB基于内存缓存机制,当缓存超过80%时,就会执行LRU算法
  • qrw、arw:表示排队的请求
  • conn:表示当前链接数

(2)mongotop

用于了解集合压力的工具

  • ns:集合
  • total:总时间耗时
  • read:读时间耗时
  • write:写时间耗时

(3)mongod日志

MongoDB会记录超过100ms的查询,会将执行计划输出。

(4)mtools

pip install mtools

经常使用指令:

  • mplotqueries LogFile:将全部的慢查询经过图标展现。
  • mloginfo —queries LogFile:总结全部慢查询模式和出现的次数,消耗时间等。

https://github.com/rueckstiess/mtools

12、GridFS

GridFS是MongoDB的一个子模块,主要用于在MongoDB中存储文件,至关于MongoDB内置的一个分布式文件系统。本质上仍是讲文件的数据分块存储在集合中,默认的文件集合分为fs.filesfs.chunks。fs.files是存储文件的基本信息,好比文件名,大小,上传时间,MD5等。fs.chunks是存储文件真正数据的地方,一个文件会被分割成多个chunk块进行存储,通常为256KB/个

GridFS的好处是你不用单独去搭建一个文件系统,直接使用Mongodb自带的便可,备份,分片都依赖MongoDB,维护起来也方便。

相关文章
相关标签/搜索