MongoDB分片介绍

Wesley13
• 阅读 465

本文简单介绍MongoDB的分片功能,对分片进行了概述,具体的功能详解,后续文章会陆续推出

分片是把数据分配到多个服务器上的一种方式,MongoDB使用分片实现大数据部署以及高吞吐操作。

大数据以及高吞吐量的应用会对单个服务器的容量造成很大的挑战。比如,高频率的查询操作会消耗服务器的CPU,如果数据集大于系统的RAM容量,也会对硬盘的性能造成影响。

应对系统容量增加有两种方式:水平扩展和垂直扩展。

垂直扩容就是增加单个服务器的容量,比如,使用更高性能的CPU,增加RAM容量,或者增加存储容量。但是单个服务器扩容是有限制性的,何况,云设备提供商在硬件配置上很容易达到容量上限。所以垂直扩容很有限制性。

水平扩容就是把数据和系统压力分散到多个服务器上,增加多个服务器以达到增加整个系统容量的目的。尽管单个服务器的速度或者容量并不是很大,但是每个服务器都可以分担一部分系统压力,比单个高性能的服务器更加高效。增加整个部署系统的容量只需要增加几台服务器,这样比增加单个服务的性能更节约成本。缺点就是增加了系统的复杂性以及系统的维护成本。

分片集群

分片集群包括以下几个成员:

shard:每个shard包含一组分片数据,每个shard都可以以复制集的方式部署。

mongos:mongos的任务是查询路由,是客户端和分片集群之间的交互接口

config servers:配置服务器存放着系统的元数据以及集群的配置信息。MongoDB3.4之后,配置服务器必须用复制集的方式部署。

下图是集群的示意图:

MongoDB分片介绍

分片是把数据分配到多个服务器上的一种方式,MongoDB使用分片实现大数据部署以及高吞吐操作。

大数据以及高吞吐量的应用会对单个服务器的容量造成很大的挑战。比如,高频率的查询操作会消耗服务器的CPU,如果数据集大于系统的RAM容量,也会对硬盘的性能造成影响。

应对系统容量增加有两种方式:水平扩展和垂直扩展。

垂直扩容就是增加单个服务器的容量,比如,使用更高性能的CPU,增加RAM容量,或者增加存储容量。但是单个服务器扩容是有限制性的,何况,云设备提供商在硬件配置上很容易达到容量上限。所以垂直扩容很有限制性。

水平扩容就是把数据和系统压力分散到多个服务器上,增加多个服务器以达到增加整个系统容量的目的。尽管单个服务器的速度或者容量并不是很大,但是每个服务器都可以分担一部分系统压力,比单个高性能的服务器更加高效。增加整个部署系统的容量只需要增加几台服务器,这样比增加单个服务的性能更节约成本。缺点就是增加了系统的复杂性以及系统的维护成本。

分片集群

分片集群包括以下几个成员:

shard:每个shard包含一组分片数据,每个shard都可以以复制集的方式部署。

mongos:mongos的任务是查询路由,是客户端和分片集群之间的交互接口

config servers:配置服务器存放着系统的元数据以及集群的配置信息。MongoDB3.4之后,配置服务器必须用复制集的方式部署。

下图是集群的示意图:

MongoDB是在集合级别对数据进行分片的。

片键

MongoDB是使用片键对集合中的文档进行分片的。片键是被分片集合中所有文档都有的一个或者多个字段。

对集合分片时需要选择片键,片键一旦选定后就不能再进行修改了。一个分片集合只能有一个片键。

对于非空集合,片键上必须有索引。如果集合是空的,MongoDB在创建片键的时候会自动在片键上创建索引。

片键的选择会影响系统的性能、高效性以及集群的可扩展性。集群即使有最好的硬件设备,如果片键选择有问题也会使集群很快达到性能瓶颈。片键的选择也会影响集群使用的分片策略。

MongoDB分片会把数据分配到块中。每个块都含有基于片键的一部分数据。MongoDB通过均衡器实现各个分片服务器的数据的平衡性。

分片的优势

读写

MongoDB集群通过分片来分散读写压力,每个分片维护一部分集群操作,这样通过增加分片就可以水平扩展读写能力。

如果查询中含有片键,mongos会定位到具体的分片上。这种操作比遍历整个集群要高效的多。

存储

每个分片会维护一组数据,随着数据增长,增加分片就能增加集群的容量。

高可用

分片集群在一个或者多个分片宕机的情况下仍然可以提供读写操作。即使宕机分片上的数据无法操作,其他可用分片上的数据还可以操作。

生产环境中,分片建议部署为复制集,提供冗余性以及可用性。

分片前需要考虑的事情

分片集群的基础设施需要经过精细的容量规划、执行、维护。

片键的选择必须要谨慎,保证集群的性能和高效性。因为分片后片键不能再修改,也不能取消。如果查询里面没有片键,mongos会遍历整个集群,这种操作会比较耗时。

分片和非分片集合

数据库可以含有分片集合以及非分片集合。分片集合被分配在集群的多个分片服务器中,未分片的集合存放在主分片中。每个数据库都有一个主分片。

 MongoDB分片介绍

连接到分片集群

要想与分片中的集合进行交互,就必须先连接到mongos路由上。客户端绝对不应该连接到单个分片上进行读写操作。连接mngos的方法和连接到单个mongod实例是一样的。

 MongoDB分片介绍

分片策略

MongoDB支持两种分片方式:hash分片、范围分片

Hashed 分片

哈希分片就是把片键的值形成一组哈希值,每个分片依据哈希值的范围存放一定量的文档。

 MongoDB分片介绍

即使片键的值是相近的,但是他们的哈希值很可能不一样,所有就不会分配在一个分片服务去上,这样的好处就是,在分片键上基于范围的查询会分散到多个服务器上进行操作,减少了单个服务器的压力。

Ranged****分片

范围分片是依据片键值的范围进行分片的,每个分片服务器存储一定范围的数据。

 MongoDB分片介绍

片键值相近的数据就很有可能会被分配到同一个块中。对于范围分片来说,片键的选择很重要,片键选择合适就可以大大提高系统的系统,反之亦然。选择的片键不合理会导致数据分布不均匀,反而体现不出分片的优势或者造成系统早早出现系统瓶颈。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
MongoDB分片集群机制及原理
1.MongoDB常见的部署架构单机版复制集分片集群2.为什么要使用分片集群数据容量日益增大,访问性能日渐下降,怎么破?新品上线异常火爆,如何支撑更多用户并发?单库已有10TB数据,恢复需要12天,如何加速?地理分布数据3.分片如何解决问题?银
Stella981 Stella981
2年前
MongoDB分片(Sharding)技术
分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法。尽管分片起源于关系型数据库分区,但MongoDB分片完全又是另一回事。和MySQL分区方案相比,MongoDB的最大区别在于它几乎能自动完成所有事情,只要告诉MongoDB要分配数据,它就能自动维护数据在不同服务器之间的均衡。2.1MongoDB
Wesley13 Wesley13
2年前
MongoDB 分片搭建
MongoDB已经到了第三篇,同时也是搭建的最后一篇文章了。MongoDB的分片搭建。为什么使用分片?我们为什么要使用分片呢?因为现在的数据量越来越大了,为了扩大DB的性能以及吞吐量。MongoDB分片构架AMongoDB shardedcluster(https://w
Wesley13 Wesley13
2年前
MongoDB学习笔记10——分片
分片(Sharding)这种技术可以将数据分散到多台机器,但对于应用而言,仍然如同在使用单个数据库一样。在使用MongoDB时,水平分区是唯一可采用的方式。在MongoDB中由MongoS路径进程管理数据的分割,并将请求路由到必需的分片服务器。在进行分片的时候需要mongod配置服务器和mongos分片服务器。1)创建分片设置:打开新的终端窗
Wesley13 Wesley13
2年前
MongoDB 分片管理(一)检查集群状态
一、检查集群状态1.1使用sh.status()查看集群摘要信息1、使用sh.status()可以查看分片信息、数据库信息、集合信息sh.status()如果数据块较多时,使用sh.status(true)又是输出会很多,就不会截断,要使用如下查看2、tooman
Wesley13 Wesley13
2年前
MongoDB的分片集群的安装
简介所谓分片,指的就是把数据拆分,将其分散到不同机器上的过程。MongoDB支持自动分片,对应用而言,好像始终和一个单机的服务器交互一样。分片和复制复制是让多台服务器拥有相同的数据副本,而分片是每个分片都拥有整个数据集的一个子集,且相互是不同的数据,多个分片的数据合起来构成整个数据集。Mongos用来
Stella981 Stella981
2年前
Mongodb集群节点故障恢复场景分析(转)
一个适当配置的Mongodb分片集群是没有单点故障。本文描述了分片集群中存在的几种不同的潜在的节点故障场景,以及Mongodb对这些节点故障是怎么处理的。1、Mongos节点宕机一个Mongos进程应该运行在每一个应用程序服务器上,这个服务器应该独占这个Mongos进程,并且通过它与分片集群来通讯。Mongos进程不是持久化的,相反,
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这