MongoDB分片
13Q:monogodb
中的分片sharding
分片sharding
是将数据水平切分到不同的物理节点。当应用数据越来越大的时候,数据量也会越来越大。当数据量增长 时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。利用分片技术可以添加更多的机器来应对数据量增加 以及读写操作的要求。
14Q:分片(Shard
)和复制(replication
)是怎样工作的?
每一个分片(shard
)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard
)使用集群。
15Q:如果块移动操作(moveChunk
)失败了,我需要手动清除部分转移的文档吗?
不需要,移动操作是一致(consistent
)并且是确定性的(deterministic
)。
- 一次失败后,移动操作会不断重试。
- 当完成后,数据只会出现在新的分片里(shard)
16Q:数据在什么时候才会扩展到多个分片(Shard
)里?
MongoDB
分片是基于区域(range
)的。所以一个集合(collection
)中的所有的对象都被存放到一个块(chunk
)中,默认块的大小是 64Mb。当数据容量超过64 Mb,才有可能实施一个迁移,只有当存在不止一个块的时候,才会有多个分片获取数据的选项。
17Q:更新一个正在被迁移的块(Chunk)上的文档时会发生什么?
更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。
18Q:如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?
如果一个分片停止了,除非查询设置了 “Partial
” 选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB
会等待它的响应。
MongoDB复制集
19Q:MongoDB
副本集实现高可用的原理
MongoDB
使用了其复制(Replica Set
)方案,实现自动容错机制为高可用提供了基础。目前,MongoDB
支持两种复制模式:
Master
/Slave
,主从复制,角色包括Master
和Slave
。Replica Set
,复制集复制,角色包括Primary
和Secondary
以及Arbiter
。(生产环境必选)
20Q:什么是master
或primary
?
副本集只能有一个主节点能够确认写入操作来接收所有写操作,并记录其操作日志中的数据集的所有更改(记录在oplog中)。在集群中,当主节点(master
)失效,Secondary节点会变为master
21Q:什么是Slave
或Secondary
?
复制主节点的oplog并将oplog记录的操作应用于其数据集,如果主节点宕机了,将从符合条件的从节点选举选出新的主节点。
22Q:什么是Arbiter
?
仲裁节点不维护数据集。 仲裁节点的目的是通过响应其他副本集节点的心跳和选举请求来维护副本集中的仲裁
23Q:复制集节点类型有哪些?
- 优先级0型(
Priority 0
)节点 - 隐藏型(
Hidden
)节点 - 延迟型(
Delayed
)节点 - 投票型(
Vote
)节点以及不可投票节点
24Q:启用备份故障恢复需要多久?
从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费10到30秒时间.这期间在主数据库上的操作将会失败–包括写入和强一致性读取(strong consistent read
)操作.然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query
)(在slaveok
模式下),即使在这段时间里.
MongoDB
复制详解分析可查看文章【MongoDB系列-解决面试中可能遇到的MongoDB复制集(replica set)问题】
25Q:raft
选举过程,投票规则?
选举过程:
当系统启动好之后,初始选举后系统由1个Leader
和若干个Follower
角色组成。然后突然由于某个异常原因,Leader
服务出现了异常,导致Follower
角色检测到和Leader
的上次RPC更新时间超过给定阈值时间时。此时Followe
r会认为Leader
服务已出现异常,然后它将会发起一次新的Leader
选举行为,同时将自身的状态从Follower
切换为Candidate
身份。随后请求其它Follower
投票选择自己。
投票规则:
- 当一个候选人获得了同一个任期号内的大多数选票,就成为领导人。
- 每个节点最多在一个任期内投出一张选票。并且按照先来先服务的原则。
- 一旦候选人赢得选举,立刻成为领导,并发送心跳维持权威,同时阻止新领导人的诞生
可查看文章【通俗易懂的Paxos算法-基于消息传递的一致性算法】
26Q:在哪些场景使用MongoDB
?
规则: 如果业务中存在大量复杂的事务逻辑操作,则不要用MongoDB
数据库;在处理非结构化 / 半结构化的大数据使用MongoDB
,操作的数据类型为动态时也使用MongoDB
,比如:
- 内容管理系统,切面数据、日志记录
- 移动端
Apps
:O2O
送快递骑手、快递商家的信息(包含位置信息) - 数据管理,监控数据
各位看官还可以吗?喜欢的话,动动手指点个💗,点个关注呗!!谢谢支持!