MongoDB 主从 (副本集) 和分片集群的概念

Author mogd 2022-04-27
Update mogd 2022-04-28

MongoDB 主从 (副本集) 和分片集群的概念

MongoDB 是一个基于分布式文件存储的开源数据库系统,更类似 MySQL;其是面向文档存储的数据库,而 Redis 是键值对数据库

一、MongoDB 主从复制 (副本集)

MongoDB 复制是将数据同步在多个服务器的过程,复制提供了以下保障:

  • 保障数据的安全性
  • 数据高可用性 (24*7)
  • 灾难恢复
  • 无需停机维护(如备份,重建索引,压缩)
  • 分布式读取数据

1.1 MongoDB 复制原理

mongodb 的复制至少需要两个节点,如果节点在 3 个以上,当主节点异常时可以自动切换;其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据

主节点记录在其上的所有操作 oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致

副本集的特点:

  • N 个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 自动故障转移
  • 自动恢复

在这里插入图片描述

每一个节点以周期性向其他成员发出心跳 replSetHeartbeat 来获取状态,根据应答消息来更新节点的状态,根据最终状态判断是否重新选举主节点;在选举成功新的主节点前,副本集不能进行写操作;如果读查询配置运行在从节点上执行,那么可以执行读操作

默认心跳周期 heartbeatIntervalMillis= 2000ms
认定Primary节点失联的阈值 electionTimeoutMillis=10s

1.2 副本集 Oplog

oplog (MongoDB 操作日志) 是一个有限的集合,保留所有修改在数据库中的数据操作的滚动记录

MongoDB 4.0 开启,oplog 可以增长到超过其配置大小限制以避免删除 majority commit point
MongoDB 4.4 支持以小时为单位指定最小 oplog 保留期,其中 MongoDB 仅在以下情况下删除 oplog 条目:

  • oplog 已达到最大配置大小并且 oplog 条目早于配置的小时数

MongoDB 在主节点上应用数据库操作,oplog 记录这些操作。从节点异步复制和应用操作,任何从节点都可以从其他节点导入 oplog

oplog 中的每一个操作都是冥等的,即 oplog 操作无论对目标数据集应用一次还是多次都会产生相同的结果

修改 oplog 大小

MongoDB 3.4 版本及更早版本,通过删除并重新创建 local.oplog.rs 集合来调整操作日志大小
MongoDB 3.6 及更高版本,通过 replSetResizeOplog 命令来调整操作日志大小
MongoDB 4.0 开始,MongoDB 禁止删除 local.oplog.rs。有关此限制,参考 Oplog Collection Behavior

1.3 副本集数据同步过程

为了维护共享数据集的最新副本,副本集的从节点同步或复制来自其他成员的数据。MongoDB 使用两种形式的数据同步:首次同步以使用完整数据集填充新成员,以及复制以将持续更改应用于整个数据集

首次同步

  1. 克隆除本地数据库之外的所有数据库。为了克隆, mongod扫描每个源数据库中的每个集合,并将所有数据插入到它自己的这些集合的副本中。

    在3.4版更改: 初始同步会在为每个集合复制文档时构建所有集合索引。在早期版本的 MongoDB 中,_id此阶段仅构建索引
    在3.4版更改: 初始同步在数据复制期间提取新添加的 oplog 记录。确保目标成员在local 数据库中有足够的磁盘空间在此数据复制阶段期间临时存储这些 oplog 记录。

  2. 将所有更改应用于数据集。使用来自源的 oplog,mongod更新其数据集以反映副本集的当前状态。同步完成后,成员从 STARTUP2 转换为 SECONDARY

节点在首次同步后持续复制数据,从同步的源中复制 oplog,执行异步复制

二、MongoDB 分片

2.1 MongoDB 分片概念

分片是一种多台机器上分布数据的方法。MongoDB 使用分片来支持具有非常大的数据集和高吞吐量操作的部署

具有大型数据集或高吞吐量应用程序的数据库系统可能会挑战单个服务器的容量。例如,高查询率会耗尽服务器的 CPU 容量。大于系统 RAM 的工作集大小会加重磁盘驱动器的 I/O 容量

一般解决系统增长有两种方式:垂直扩展和水平扩展

  • 垂直扩展涉及增加单个服务器的容量,例如使用更强大的 CPU、添加更多 RAM 或增加存储空间量。可用技术的限制可能会限制单个机器对于给定的工作负载足够强大。此外,基于云的提供商具有基于可用硬件配置的硬上限。因此,垂直缩放有一个实际最大值

  • 水平扩展涉及划分系统数据集并在多个服务器上加载,添加额外的服务器以根据需要增加容量。虽然单台机器的整体速度或容量可能不高,但每台机器都处理整体工作负载的一个子集,可能比单台高速大容量服务器提供更好的效率。扩展部署的容量只需要根据需要添加额外的服务器,这可以比单机的高端硬件更低的总体成本。代价是基础设施和部署维护的复杂性增加

而 MongoDB 通过 sharding 支持水平扩展

一个 MongoDB 分片集群由以下组件组成:

  • shard:每个分片包含分片数据的一个子集。每个分片都可以部署为副本集
  • mongosmongos 充当查询路由器,在客户端应用程序和分片集群之间提供接口。从 MongoDB 4.4 开始,mongos 可以支持 对冲读取以最小化延迟
  • config servers:配置服务器存储集群的元数据和配置设置

在这里插入图片描述

2.2 分片策略

MongoDB 支持两种分片策略

  • 哈希分片
  • 范围分片

哈希分片
哈希分片涉及计算分片键字段的哈希值,然后根据哈希列的分片键值为每一块分配一个范围

注:MongoDB 在使用 哈希索引解析查询时会自动计算哈希值,不需要应用程序计算哈希

在这里插入图片描述

散列分片以减少 “目标操作” 与 “广播操作” 为代价,在整个分片群集中提供了更均匀的数据分布。哈希后的,具有 “接近” 分片键值的文档不太可能位于同一块或分片上- mongos 更有可能执行 广播操作来满足给定的范围查询。 mongos 可以将具有相等匹配项的查询定位到单个分片

范围分片
基于范围的分片涉及将数据划分为由分片键值确定的连续范围。在此模型中,具有“接近”分片键值的文档可能位于相同的块或分片中。这允许在连续范围内读取目标文档的高效查询。但是,由于分片密钥选择不佳,读取和写入性能均可能降低

在这里插入图片描述

当分片键具有以下特征时,选择范围分片:

  • 大型片键基数
  • 分片频率低
  • 非单调更改的分片键

在这里插入图片描述

参考

[1] MongoDB 中文手册

原文地址:https://blog.csdn.net/weixin_41335923/article/details/124481931

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc