MongoDB分片迁移原理与源码
MongoDB架构
单节点
单个节点的MongoDB实例,具备MongoDB基本的功能和服务能力,不过缺乏数据冗余和高可用,以及横向扩展的能力,一般很少在实际生产环境中使用。
副本集
MongoDB的副本集,是指一组具有相同数据的mongod节点服务的集合。副本集架构可以实现数据冗余以及高可用。
一个基本的副本集架构如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0w9c6ksg-1585748050179)(https://docs.mongodb.com/manual/_images/replica-set-read-write-operations-primary.bakedsvg.svg)]
一个副本集下,一主多备因为有用相同的数据,这种复制机制可以减少单节点下数据丢失的风险。
另外,副本集内的节点之间是通过异步复制oplog的方式,来实现节点之间数据的一致的。MongoDB的数据一致性是基于Raft协议改进实现的。
MongoDB复制流程与Raft协议有一些基本的差别,包括:
- 选举差异。MongoDB的节点可以设置优先级并设置了多种节点角色,Raft无此概念。MongoDB的副本集的心跳是节点两两互发的,而Raft是主节点发,备节点回复。MongoDB的主节点在不能收到大多数节点的心跳的时候,就会自动降级,防止出现多主和过期主,而Raft的主节点再收到更高任期的主节点心跳的时候才会降级。
- 日志复制。MongoDB的日志复制是异步过程&#x