Mongo Db复制集、分片集群和java中使用

本文详细介绍了MongoDB的复制集,包括其高可用性、数据复制过程、选举机制以及注意事项。此外,还讲解了分片集群的概念、组件、分片键选择原则以及数据段分裂和集群平衡。最后,提到了MongoDB在Java中的应用实践。
摘要由CSDN通过智能技术生成

MongoDB 复制集

MongoDB复制集的主要意义在于实现服务高可用,类似于Redis中的哨兵模式

它主要提供两个方面的功能

  1. 数据写入主节点(Primary)时将数据复制到另一个副本节(Secondary)点上
  2. 主节点发生故障时自动选举出一个新的替代节点

在实现高可用的同时,复制集实现了其他几个作用
数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
读写分离:不同类型的压力分别在不同的节点上执行
异地容灾:在数据中心故障时快速切换到异地

典型复制集结构
一个典型的复制集由三个或三个以上具有投票权的节点组成,其中一个主节点(Primary):接收写入操作,读操作和选举时投票,两个或多个从节点(Secondary):复制主节点上的新数据和选举时投票

数据是如何复制的?
当一个修改操作,无论是插入,更新或删除,到达主节点时,它对数据的操作将被记录下来(经过一些必要的转换)。这些记录称为oplog
从节点通过从主节点上不断获取新进入主节点的oplog,并在自己的数据上回放,以此保持跟主节点的数据一致。
在这里插入图片描述

通过选举完成故障恢复
具有投票权的节点之间两两互相发送心跳;
当5次心跳未收到时判断为节点失联
如果失联的是主机点,从节点会发起选举,选出新的主节点
如果失联的是从节点则不会产生新的选举
选举基于RAFT一致性算法实现,选举成功的必要条件是大多数投票节点存活
复制集中最多可以有50个节点,但具有投票权的节点最多7个

影响选举的因素
整个集群必须有大多数节点存活
被选举为主节点的节点必须
1.能够与多数节点建立连接
2.具有较新的oplog
3.具有较高的优先级(如果有配置)

复制集节点有以下的选配项
是否具有投票权(v 参数): 有则参与投票
优先级(priority参数):优先级越高的节点越优先成为主节点。优先级为0的节点无法成为主节点,默认值为1。
隐藏(hidden参数):复制数据,但对应用不可见。隐藏节点可以具有投票权,但优先级必须为0
延迟(slaveDelay参数):复制 n 秒之前的数据,保持与主节点的时间差
从节点不建立索引( buildIndexes)

复制集注意事项
硬件:
因为正常的复制集节点都有可能成为主节点,它们的地位是一样的,因此硬件配置上必须一致
为了保证节点不会同时宕机,各节点的硬件必须具有独立性。
软件:
复制集各节点软件版本必须一致,以避免出现不可预知的问题

增加节点不会增加系统写性能

分片集群

  1. 什么是分片?
    将数据水平拆分到不同的服务器上

  2. 为什么要使用分片集群
    数据量突破单机瓶颈,数据量大,恢复很慢,不利于数据管理
    并发量突破单机性能瓶颈

MongoDB 分片集群由一下几部分组成
在这里插入图片描述
分片集群角色:
路由节点: mongos, 提供集群单一入口,转发应用端请求,选择合适的数据节点进行读写,合并多个数据节点的返回。无状态,建议 mongos节点集群部署以提供高可用性。客户请求应发给mongos,而不是 分片服务器,当查询包含分片片键时,mongos将查询发送到指定分片,否则,mongos将查询发送到所有分片,并汇总所有查询结果。

配置节点: 就是普通的mongod进程, 建议以复制集部署,提供高可用
提供集群元数据存储分片数据分布的数据。主节点故障时,配置服务器进入只读模式,
只读模式下,数据段分裂和集群平衡都不可执行。
整个复制集故障时,分片集群不可用

数据节点:
以复制集为单位,横向扩展最大1024分片,分片之间数据不重复,所有数据在一起才可以完整工作。

分片键

可以是单个字段, 也可以是复合字段

  1. 范围分片
    比如 key 的值 从 min - max
    可以把数据进行范围分片
  2. hash 分片
    通过 hash(key ) 进行数据分段
    片键值用来将集合中的文档划分为数据段,片键必须对应一个索引或索引前缀(单键、复合键),可以使用片键的值 或者片键值的哈希值进行分片

选择片键的原则:

  1. 片键值的范围更广(可以使用复合片键扩大范围)
  2. 片键值的分布更平衡(可使用复合片键平衡分布)
  3. 片键值不要单向增大、减小(可使用哈希片键)

数据段的分裂(分裂成多个小的数据段,这样分片存储时更加的均匀。)
当数据段尺寸过大,或者包含过多文档时,触发数据段分裂,只有新增、更新文档时才可能自动触发数据段分裂,数据段分裂通过更新元数据来实现

集群的平衡
后台运行的平衡器负责监视和调整集群的平衡,当最大和最小分片之间的数据段数量相差过大时触发
集群中添加或移除分片时也会触发

MongoDB分片集群特点
1.应用全透明
2.数据自动均衡
3.动态扩容,无需下线

MongoDB 应用实战

最新驱动的地址
https://mongodb.github.io/mongo-java-driver/

  1. 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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值