MongoDB是什么,怎么用?看完你就知道了( 四 )

  • n 表示需要返回的结果集
  • nscanned表示需要遍历的文档数 indexBounds 表示索引边界
  • 注意新版本的MongoDB 的explain方法是需要参数的,不然只显示普通的信息 。
    六、MongoDB副本集本节同样主要简单呈现MongoDB副本集搭建的简易性,与副本集的强壮性,监控容易性
    1.为什么要使用副本集
    提供主从复制能力,热备能力,故障转移能力
    2.构建方式
    rs.initiate()rs.add("localhost:40001")rs.add("localhost:40002",{arbiterOnly:true})3.监控
    db.isMasrter()rs.status()4.副本集的工作原理
    实际上MongoDB对副本集的操作跟mysql主从操作是差不多的,先看一下mysql的主从数据流动过程
    主binlog -> 从relay.log -> 从bin.log -> 从数据库而MongoDB主要依赖的日志文件是oplog
    主oplog -> 从oplog写操作先被记录下来,添加到主节点的oplog里 。与此同时,所有从结点复制oplog 。首先,查看自己oplog里最后一条的时间戳;其次,查询主节点oplog里所有大于此时间戳的条目;最后,把那些条目添加到自己的oplog里并应用到自己的库里 。从节点使用长轮询立即应用来自主结点oplog的新条目 。
    当遇到以下情况,从节点会停止复制
    • 如果从节点在主节点的oplog里找不到它所同步的点,那么会永久停止复制
    • 一旦某个从节点没能 在主节点的oplog里找到它已经同步的点,就无法再保证这个从结点的完美副本
    local数据库保存了所有副本集元素据和oplog日志
    • replset.minvalid 包含指定副本集成员的初始化同步信息
    • system.replset 保存在副本集配置文档
    • system.indexes 标准索引说明容器
    • me slaves 主要用于写关注
    可以使用以下命令查看复制情况
    db.oplog.rs.findOne()
    • ts 保存了该条目的BSON时间戳
    • t 是从纪元开始的描述
    • i是计数器
    • op 表示操作码
    • ns 标明了有关的命名空间
    5.心跳检测
    每个副本集成员每秒钟ping一次其他所有成员,可以通过rs.status()看到节点上次的心跳检测时间戳和健康状况 。
    6.故障转移
    这个点没必要过多描述,但是有一个特殊场景,如果从节点和仲裁节点都被杀了,只剩下主节点,他会把自己降级成为从节点 。
    7.提交与回滚
    如果主节点的数据还没有写到从库,那么数据不能算提交,当该主节点变成从节点时,便会触发回滚,那些没写到从库的数据将会被删除,可以通过rollback子目录中的BSON文件恢复回滚的内容 。
    8.驱动与复制
    (1)使用单节点链接
    只能链接到主节点,如果链接到从节点的话,会被拒绝写入操作,但是如果没有使用安全模式,因为mongo的fire and forget 特性,会把拒绝写入的异常给吃掉 。
    (2)使用副本集方式链接
    能根据写入的情况自动进行故障转移,但是当副本集进行新的选举时,还是会出现故障,如果不使用安全模式,依旧会出现写不进去,但现实成功的情况 。
    (3)写关注
    可以使用写关注来关注数据是否已经被写入MongoDB的库中,使用写关注会消耗性能,需要在速度和持久性之间做出权衡 。
    七、分片分片是数据库切分的一个概念实现,这里也是简单总结为什么要使用分片以及分片的原理,操作 。
    1.为什么需要分片
    当数据量过大,索引和工作数据集占用的内存就会越来越多,所以需要通过分片负载来解决这个问题
    2.分片的工作原理
    (1)分片组件
    • 分片:每个分片都是一个副本集
    • mongos路由器:是一个路由器,将读写请求指引到合适的分片上
    • 配置服务器config:持久化分片集群的元数据,包括:全局集群配置;每个数据库、集合和特定范围数据位置;一份变更记录,保存了数据在分片之间进行迁移的历史信息 。配置服务器之间不是副本集形式存在,mongos向配置服务器提交信息时是两阶段提交,保证配置服务器之间的一致性 。
    (2)分片的核心操作
    分片一个集合:分片是根据一个属性的范围进行划分的,MongoDB使用所谓的分片键让每个文档在这些范围里找到自己的位置
    块:是位于一个分片中的一段连续的分片键范围,可以理解为若干个块组成分片,分片组成MongoDB的全部数据
    (3)拆分与迁移
    块的拆分:初始化时只有一个块,达到最大块尺寸64MB或100000个文档就会触发块的拆分 。把原来的范围一分为二,这样就有了两个块,每个块都有相同数量的文档 。


    推荐阅读