MongoDB 是什么?( 四 )

 
3.监控db.isMasrterrs.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个文档就会触发块的拆分 。把原来的范围一分为二,这样就有了两个块,每个块都有相同数量的文档 。
迁移:当分片中的数据大小不一时会产生迁移的动作,比如分片A的数据比较多,会将分片A里面的一些块转移到分片B里面去 。分片集群通过在分片中移动块来实现均衡,是由名为均衡器的软件进程管理的,任务是确保数据在各个分片中保持均匀分布,当集群中拥有块最多的分片与拥有块最少分片的块差大于8时,均衡器就会发起一次均衡处理 。


推荐阅读