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

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

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

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

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

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

分片集群

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

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

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

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

下图是集群的示意图:

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

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

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

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

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

分片集群

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

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

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

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

下图是集群的示意图:

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

片键

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

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

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

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

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

分片的优势

读写

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

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

存储

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

高可用

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

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

分片前需要考虑的事情

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

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

分片和非分片集合

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

连接到分片集群

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

分片策略

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

Hashed 分片

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

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

Ranged分片

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

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

MongoDB分片介绍的更多相关文章

  1. mongodb分片介绍—— 基于范围(数值型)的分片 或者 基于哈希的分片

    数据分区 MongoDB中数据的分片是以集合为基本单位的,集合中的数据通过 片键 被分成多部分. 片键 对集合进行分片时,你需要选择一个 片键 , shard key 是每条记录都必须包含的,且建立了 ...

  2. MongoDB 分片集群技术

    在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...

  3. MongoDB分片(Sharding)技术

    分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法.尽管分片起源于关系型数据库分区,但MongoDB分片完全又是另一回事. 和MySQL分区方案相比 ...

  4. 008.MongoDB分片群集概念及原理

    一 MongoDB分片介绍 1.1 分片 Mongodb另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足 ...

  5. (转)MongoDB 分片集群技术

    1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这是生产部署的基础. 1.1.1 复制集的目的 ...

  6. MongoDB 分片管理(不定时更新)

    背景: 通过上一篇的 MongoDB 分片的原理.搭建.应用 大致了解了MongoDB分片的安装和一些基本的使用情况,现在来说明下如何管理和优化MongoDB分片的使用. 知识点: 1) 分片的配置和 ...

  7. MongoDB 分片的原理、搭建、应用

    一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这 ...

  8. MongoDB基础教程系列--第九篇 MongoDB 分片

    1.分片介绍 分片(sharding)是将数据拆分,将其分散存到不同机器上的过程.MongoDB 支持自动分片,可以使数据库架构对应用程序不可见.对于应用程序来说,好像始终在使用一个单机的 Mongo ...

  9. TiDB和MongoDB分片集群架构比较

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 最近阅读了TiDB源码的说明文档,跟MongoDB的分片集群做了下简单对比. 首先展示TiDB的整体架构 M ...

随机推荐

  1. Excel操作之级联菜单

    设置级联菜单主要用的是excel的数据验证功能.下面以简单的设置城市选择框为例: 1.准备好数据 2.给所有省份起个名称(例如:省份),然后同样方法给每个省份所对应的城市以其省份命名,(例如:南京.苏 ...

  2. 简单理解Socket 重要

    http://www.cnblogs.com/dolphinX/p/3460545.html 题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器 ...

  3. cocos2d::CCFileUtils::sharedFileUtils()->getFileData(szFile, "r", &bufferSize) 不同平台返回值不一样

    string pathKey = CCFileUtils::sharedFileUtils()->fullPathForFilename(fileName); unsigned char* pB ...

  4. xgboost和gbdt区别

    1. xgboost在目标函数中加入了正则化项,当正则化项为0时与传统的GDBT的目标函数相同2. xgboost在迭代优化的时候使用了目标函数的泰勒展开的二阶近似,paper中说能加快优化的过程!! ...

  5. 聚类之高斯混合模型(Gaussian Mixture Model)【转】

    k-means应该是原来级别的聚类方法了,这整理下一个使用后验概率准确评测其精度的方法—高斯混合模型. 我们谈到了用 k-means 进行聚类的方法,这次我们来说一下另一个很流行的算法:Gaussia ...

  6. PHP扩展功能 ---- 伪静态

    一.入门三部曲 1.什么是伪静态? 改写URL,以静态的url形式访问页面,但其实是用PHP一类的动态脚本来处理的. 2.为什么要用伪静态? 需要动态获取数据,但是又希望能够对搜索引擎友好. 3.怎么 ...

  7. ACM-SG函数之S-Nim——hdu1536 hdu1944 poj2960

    S-Nim Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  8. Java I/O系列(二)ByteArrayInputStream与ByteArrayOutputStream源码分析及理解

    1. ByteArrayInputStream 定义 继承了InputStream,数据源是内置的byte数组buf,那read ()方法的使命(读取一个个字节出来),在ByteArrayInputS ...

  9. python3 使用pyinstaller打包可执行程序

    步骤 1.使用pip安装pyinstaller pip install pyinstaller 2. 使用pyinstaller打包程序 pyinstaller -F xxx.py pyinstall ...

  10. [原创]HBase学习笔记(2)- 基本操作

    1.使用hbase shell连接hbase 2.输入help可以查看帮助 3.输入list查看当前hbase中的所有表 4.使用create创建表test 其中test是表名,cf是列族.该表只创建 ...