MongoDB 复制集
MongoDB复制集的主要意义在于实现服务高可用,类似于Redis中的哨兵模式
它主要提供两个方面的功能
- 数据写入主节点(Primary)时将数据复制到另一个副本节(Secondary)点上
- 主节点发生故障时自动选举出一个新的替代节点
在实现高可用的同时,复制集实现了其他几个作用
数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
读写分离:不同类型的压力分别在不同的节点上执行
异地容灾:在数据中心故障时快速切换到异地
典型复制集结构
一个典型的复制集由三个或三个以上具有投票权的节点组成,其中一个主节点(Primary):接收写入操作,读操作和选举时投票,两个或多个从节点(Secondary):复制主节点上的新数据和选举时投票
数据是如何复制的?
当一个修改操作,无论是插入,更新或删除,到达主节点时,它对数据的操作将被记录下来(经过一些必要的转换)。这些记录称为oplog
从节点通过从主节点上不断获取新进入主节点的oplog,并在自己的数据上回放,以此保持跟主节点的数据一致。
通过选举完成故障恢复
具有投票权的节点之间两两互相发送心跳;
当5次心跳未收到时判断为节点失联
如果失联的是主机点,从节点会发起选举,选出新的主节点
如果失联的是从节点则不会产生新的选举
选举基于RAFT一致性算法实现,选举成功的必要条件是大多数投票节点存活
复制集中最多可以有50个节点,但具有投票权的节点最多7个
影响选举的因素
整个集群必须有大多数节点存活
被选举为主节点的节点必须
1.能够与多数节点建立连接
2.具有较新的oplog
3.具有较高的优先级(如果有配置)
复制集节点有以下的选配项
是否具有投票权(v 参数): 有则参与投票
优先级(priority参数):优先级越高的节点越优先成为主节点。优先级为0的节点无法成为主节点,默认值为1。
隐藏(hidden参数):复制数据,但对应用不可见。隐藏节点可以具有投票权,但优先级必须为0
延迟(slaveDelay参数):复制 n 秒之前的数据,保持与主节点的时间差
从节点不建立索引( buildIndexes)
复制集注意事项
硬件:
因为正常的复制集节点都有可能成为主节点,它们的地位是一样的,因此硬件配置上必须一致
为了保证节点不会同时宕机,各节点的硬件必须具有独立性。
软件:
复制集各节点软件版本必须一致,以避免出现不可预知的问题
增加节点不会增加系统写性能
分片集群
-
什么是分片?
将数据水平拆分到不同的服务器上 -
为什么要使用分片集群
数据量突破单机瓶颈,数据量大,恢复很慢,不利于数据管理
并发量突破单机性能瓶颈
MongoDB 分片集群由一下几部分组成
分片集群角色:
路由节点: mongos, 提供集群单一入口,转发应用端请求,选择合适的数据节点进行读写,合并多个数据节点的返回。无状态,建议 mongos节点集群部署以提供高可用性。客户请求应发给mongos,而不是 分片服务器,当查询包含分片片键时,mongos将查询发送到指定分片,否则,mongos将查询发送到所有分片,并汇总所有查询结果。
配置节点: 就是普通的mongod进程, 建议以复制集部署,提供高可用
提供集群元数据存储分片数据分布的数据。主节点故障时,配置服务器进入只读模式,
只读模式下,数据段分裂和集群平衡都不可执行。
整个复制集故障时,分片集群不可用
数据节点:
以复制集为单位,横向扩展最大1024分片,分片之间数据不重复,所有数据在一起才可以完整工作。
分片键
可以是单个字段, 也可以是复合字段
- 范围分片
比如 key 的值 从 min - max
可以把数据进行范围分片 - hash 分片
通过 hash(key ) 进行数据分段
片键值用来将集合中的文档划分为数据段,片键必须对应一个索引或索引前缀(单键、复合键),可以使用片键的值 或者片键值的哈希值进行分片
选择片键的原则:
- 片键值的范围更广(可以使用复合片键扩大范围)
- 片键值的分布更平衡(可使用复合片键平衡分布)
- 片键值不要单向增大、减小(可使用哈希片键)
数据段的分裂(分裂成多个小的数据段,这样分片存储时更加的均匀。)
当数据段尺寸过大,或者包含过多文档时,触发数据段分裂,只有新增、更新文档时才可能自动触发数据段分裂,数据段分裂通过更新元数据来实现
集群的平衡
后台运行的平衡器负责监视和调整集群的平衡,当最大和最小分片之间的数据段数量相差过大时触发
集群中添加或移除分片时也会触发
MongoDB分片集群特点
1.应用全透明
2.数据自动均衡
3.动态扩容,无需下线
MongoDB 应用实战
最新驱动的地址
https://mongodb.github.io/mongo-java-driver/
- java 原生客户端
引入maven
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.5.0</version>
</dependency>
代码演示:此原生的依赖不用用在springboot项目中,否则会出现包冲突;
package com.bijian.mongodb;
import com.mongodb.client.*;
import