1、复制是跨多个MongoDB服务器(节点)分布和维护数据的方法,MongoDB可以把数据从一个节点复制到其他节点并修改时进行同步。这种复制通过可复制集机制提供。集合中的节点配置为自动同步数据,并且在服务器出错时自动灾备

  2、MongoDB提供旧的复制,主从复制,但已过时。主节点接受所有写QQ,而从节点读取并且异步同步所有的数据。

  3、主从复制和可复制集群有相同复制机制,后者增加自动化灾备,还提供改进,比如更易恢复和更复杂部署拓扑网络。

  4、复制的缺点在回滚机制。可复制集群里,数据并非真正提交,而是被写入大多数集群的节点,这指的是50%上的服务器。如果可复制集群只有两个数据库,就意味着没有服务器可以换停机。如果主节点在复制数据之前停机,其他成员将继续接受收入,而且任意未复制的数据必须回滚,意味着它不能被读取。

  5、复制是为冗余设计的,它确保从节点和注解的的数据同步,这样复制节点可以和主节点位于一个数据中心或者为了安全可以分布于其他数据中心。

  复制是异步的,任何网络延迟和分区都不会影响主节点的性能。

  复制节点可以延迟某个固定时间点后执行,这防止用户无意删除集合或应用程序与数据库冲突的情况。

  复制简化维护工作,允许管理员在从节点而不是主节点上运行命令。

  复制可以允许在从节点上平衡读/写压力。

  6、可复制集群无能为力的情况:(1)现有硬件无法处理工作负荷;(2)写入和读取的比例超过50%。(3)应用程序需要一致性读取。

  7、可复制集群工作原理:oplog和heartbear。前者允许复制数据,后者监控状态并促发灾备。

  8、MongoDB的复制机制依赖于oplog,这是个盖子集合,存在于每个复制节点的local数据库,而且记录了所有的数据变化。 每次客户端写入主节点的数据,包含足够重生信息的项目就会被添加到主节点的oplog中。一旦写入的数据被复制到某个从节点,从节点的oplog也会存储这个写入请求的记录。每个oplog项目通过BSON的时间戳来区分,并且所有的从节点使用时间戳来追踪它们应用的最新项目。

  9、对于多个更新或者大量的删除,每个受影响的文档都会单独创建oplog文档。

  10、主节点写上写数据,写操作会被记录并添加到主节点的oplog里,然后所有从节点都会复制主节点的oplog。当某个从节点准备更新自己的数据时,会做下面的三件事情:

  • 查看自己oplog里最新记录的时间戳
  • 查询主节点的oplog,查询所有时间戳大于自己当前时间戳的oplog记录
  • 写入数据,并添加每个操作日志到自己的oplog里

  假如出现故障,任意的提升为主节点的从接到都会有一个oplog,这样其他从接到都可以复制。这个特性本质支持了可复制集的故障恢复功能。

  11、从接到使用长轮训来立即应用从主节点复制的oplog记录。长轮训意味从节点向主节点发送了个长请求。当主节点接受修改,会立即响应等待的请求。因此从节点几乎可以做到实时更新。当它们落后时,因为网络分区或者从节点维护,每个从节点里的oplog可以用来监控任意落后的复制。

  12、主从复制的缺点是灾备是完全人工的。如果主节点发生故障失败,管理员必须关闭一个从服务器,然后作为主节点重新启动,应用程序必须重新配置连接性的主节点。而且恢复困难。因为oplog只在主节点存在,故障失败需要在新的服务器上创建新的oplog。这意味着,任意存在的节点需要重新从新的主节点同步oplog。

  13、如果从节点无法在主节点oplog找到同步的日志记录点,会永久停止复制。唯一的补救措施是完整地重新同步主节点的数据。为避免这个问题,可以尝试最小化从节点的失败时间。

  14、3.0版本后,可以修改oplog的大小。操作步骤:停止mongod实例,然后作为独立节点启动,修改oplog大小,重新启动。

  15、可复制集心跳便于选举和灾备。默认情况下,每个可复制集成员会每隔2秒ping一次索引的其他成员,这样系统可以判断自己的健康状态。运行rs.status()查看每个节点的最新心跳和状态(1表示健康,0表示无应答)。

  16、每个节点仍然健康并相应,可复制集就会继续工作。如果某节点无法响应,则可能会采取行动。每个可复制集确保一直只有一个主节点存在

可复制集状态

郭远威 mongodb核心原理与实践 mongodb实战第二版 pdf_复制集

  17、恢复是指在故障后恢复可复制集到最初状态的过程。

  18、两个失败类型要处理:

  • 干净失败:该节点的数据文件仍然完整。
  • 绝对失败:节点数据文件要么丢失,要么冲突。

  19、MongoDB3.0里的可复制集可包含50个节点。

  20、MongoDB驱动为连接可复制集群提供了统一接口。

  • 单节点连接:驱动会初始化TCP socket连接,然后运行isMaster命令。
  • 可复制集连接:科研单独连接可复制集里的单个节点。
Mongo::Client.new(['iron:40000','iron:40001'],:replica_set=>'myapp')

  21、驱动的写关注点控制着在返回之前必须有多少个节点被写入。增加这个值可增加持久性。

  22、MongoDB允许通过读偏好和标签来控制更复杂的可复制集的读/写行为,特别是在多个数据中心部署可复制集成员时。