mongoDB的理解,现阶段在串联调查的知识点,以后开始解析代码,从逻辑层面来再次确认理解不正确或者认识不足的地方。
Replica-set
之前接触过的NoSQL数据库,比如:hbase,hive来说,为了数据的安全性和可扩展性考虑,都是是用master-slave的模型,master节点永远承担这read&write,slave就是冷备份,只有当master发生宕机的情况下,众多的slave中才会升格一个作为master,避免整个集群失效。
WiredTiger
而mongoDB的,WiredTiger存储引擎下,是去中心化的,没有所谓的master-slave,官方称为primary-secondary。
- 在一个副本集中,有且只有一个primary,且拥有read&write权限。
- 一个正常的secondary成员存储着primary所有数据的copy,secondary成员具有投票权和被选举权(根据设定而定)
而在一个副本集中,secondary成员还有以下2种分类:
- 拥有被选举(Priority:1)
即可以被选举成为primary,具有write权限。
- 没有被选举(Priority:0)
这种成员角色维护着primary的数据copy,但在故障切换中,永远不会成为primary。这类成员具有以下特性:
- 作为冷备份
- 可副本集中,确保可以选举出合适的primary
- 在replica-set的多个数据中心,通过网络分区,确保中心数据在故障切换中,可快速选举primary
这类成员又细分为以下4类:
- Hidden members
这类成员也像其他成员一样,维持着primary数据的copy,不能成为primary,可参与投票,但没有相应read的权限,只是专注于报告需求或者备份。
- Delayed members
利用primary的oplog复制数据。好处是当发生人为错误,比如误删数据库的情况下,可以根据oplog进行恢复
- Arbiters
这类成员不对primary的数据进行copy,所以永远不会成为primary,唯一的用途就是在副本集中发生无法决策出primary时,快速选举出最适合做primary的节点
- Non-voting members
拥有primary数据的copy,可以接受来自客户端的read操作,也可以成为primary,但在选举中不具有投票权。
成为primary的先决条件是:在可投票的X个成员中,某个成员获得选票大于等于【(x/2)+1】.