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

1、分片介绍

分片(sharding)是将数据拆分,将其分散存到不同机器上的过程。MongoDB 支持自动分片,可以使数据库架构对应用程序不可见。对于应用程序来说,好像始终在使用一个单机的 MongoDB 服务器一样,另一方面,MongoDB 自动处理数据在分片上的分布,也更容易添加和删除分片。

请记住:复制是让多台服务器拥有同样的数据副本,每一台服务器都是其他服务器的镜像,而每一个分片都与其他分片拥有不同的数据子集。

通常,分片可以用来:

  • 增加可用的内存
  • 增加可用的磁盘空间
  • 减轻单台服务器的负载
  • 处理单个 mongod 服务器无法承受的吞吐量

2、MongoDB 分片集群组成

MongoDB 的分片集群由以下部分组成:

shard:每个分片包含分片数据的一个子集,每个分片可以部署为一个副本集

mongos:作为一个查询路由器,提供客户端应用程序和分片集群之间的接口。

config servers:配置服务器存储群集的元数据和配置信息。MongoDB 3.4 版本开始,配置服务器必须部署一个副本集。

分片集群的配置分为 Production Configuration 和 Development Configuration,一个用于生产环境下的配置,另个用于开发或者测试环境的配置。

2.1、Production Configuration(生产环境配置)

在生产集群(production cluster)中,如果集合数据是冗余的,并且系统配置够用,生产分片集群部署,需满足一下几点:

  • 部署配置服务器包含三个成员的副本集(Deploy Config Servers as a 3 member replica set)
  • 部署每一个分片可以是三个成员的副本集(Deploy each Shard as a 3 member replica set)
  • 部署可以有一个或多个路由(Deploy one or more mongos routers)

结构图如下:

2.2、Development Configuration(开发环境配置)

测试或者开发环境,可以使用最少的组件部署一个分片集群,这些非生产集群包含以下组件:

  • 具有一个成员的副本集配置服务器(A replica set config server with one member)
  • 至少一个分片作为一个成员的副本集(At least one shard as a single-member replica set)
  • 一个 mongos 实例(One mongos instance)

结构图如下:

注意:使用测试集群结构,仅仅用于测试或者开发。

下面用较简单的 Development Configuration 举例说明一下。

3、范例

接下来我们就用范例具体说明一下分片的过程,这里准备三台服务器,分别为 218.245.4.11、218.245.4.12、218.245.4.13。

218.245.4.11 作为配置服务器(config server),在该服务器上创建一个成员的副本集。实际项目中,需要三个成员的副本集。

218.245.4.12 作为分片(shard)服务器,在该服务器上也创建一个成员的副本集。实际项目中,可以创建多个分片,每个分片也可以是副本集。

218.245.4.13 作为 mongos 服务器。实际项目中,可以创建多个 mongos。

3.1 创建配置服务器副本集(Create the Config Server Replica Set)

3.1.1 启动配置服务器副本集中的成员(Start a member of the config server replica set),这里定义副本集名字为“configRep”,需要指定 --configsvr 参数,实际项目中用 --bind_ip 指定具体的IP地址

mongod --port 27017 --bind_ip 218.245.4.11 --configsvr  --replSet configRep --dbpath c:\data\db

3.1.2 连接到其中一个配置服务器,用 rs.initiate() 初始化副本集

rs.initiate(
   {
      _id: "configRep",
      configsvr: true,
      members: [
         { _id: 0, host : "218.245.4.11:27017" }
      ]
   }
)

3.2 创建 Shard 副本集(Create the Shard Replica Sets)

3.2.1 启动 Shard 服务器副本集中的成员(Start a member of the shard replica set),这里定义副本集名字为“shardRep”,需要指定 --shardsvr 参数。这里可以不用是一个副本集,可以是单台 mongod 服务器。

mongod --port 27017 --bind_ip 218.245.4.12 --shardsvr  --replSet shardRep --dbpath c:\data\shard

3.2.2 连接到 Shard 服务器,用 rs.initiate() 初始化副本集

rs.initiate(
   {
      _id: "shardRep"
      members: [
         { _id: 0, host : "218.245.4.12:27017" }
      ]
   }
)

3.3 启动 mongos 实例

mongos --configdb configRep/218.24.5.4.11:27017 --port 27017

MongoDB 3.4 版本中,参数 --configdb 的值必须包含副本集的名称,这也是 MongoDB 3.4 版本为什么配置服务器要部署为副本集的原因。

3.4 给集群添加分片

添加分片的操作,必须在 mongos 下操作,也就是要先连上 mongos。可以用 sh.addShard() 方法添加分片

sh.addShard("shardRep/218.245.4.12:27017")

如果分片不用副本集,可以这样添加分片

sh.addShard("218.245.4.12:27017")

3.5 设置分片存储的数据库

MongoDB 中用 sh.enableSharding() 方法设置需要分片存储的数据库,连上 mongos。

sh.enableSharding("liruihuan")

3.6 设置需要分片的集合

在设置分片集合之前,我们有必要了解一下片键(shard key)的概念。MongoDB是怎么对集合分片的呢?这时候就用到了片键。片键是集合的一个键,MongoDB 根据这个键拆分数据。例如,如果选择基于“name”进行分片,MongoDB 对根据不同名字进行分片:“name1”到“name100”位于第一片,“name101”到“name200”位于第二片,以此类推。

给集合分片,需要用 sh.shardCollection() 方法指定需要分片的集合和片键,下面例子是给 user 集合分片,片键为 name,连上 mongos。

sh.shardCollection("liruihuan.user", { name : 1 } )

注意,如果这个集合包含有数据,在用 shardCollection() 之前,我们必须用 db.collection.createIndex() 方法给片键创建索引。如果这个集合为空,MongoDB 在用 shardCollection() 时会创建索引。

3.7 给 user 集合添加20万条数据

给 user 集合添加20万条数据,看看集合是这么分片的

for(var i = 0; i <200000; i++)
{
    db.user.insert({"name":"lrh"+i,"age":18})
}

用 sh.status() 查看分片情况

--- Sharding Status ---
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("58fcb9e3f6420984b3570e11")
}
  shards:
	{  "_id" : "shardRep",  "host" : "shardRep/218.245.4.12:27017",  "state" : 1 }
  active mongoses:
	"3.4.3" : 1
  databases:
	{  "_id" : "liruihuan",  "primary" : "shardRep",  "partitioned" : true }
		liruihuan.user
			shard key: { "name" : 1 }
			unique: false
			balancing: true
			chunks:
				shardRep	3
			{ "name" : { "$minKey" : 1 } } -->> { "name" : "liruihuan" } on : shardRep Timestamp(1, 1)
			{ "name" : "liruihuan" } -->> { "name" : "lrh7" } on : shardRep Timestamp(1, 2)
			{ "name" : "lrh7" } -->> { "name" : { "$maxKey" : 1 } } on : shardRep Timestamp(1, 3)

我们可以看出集合的数据被分到名为 shardRep 副本集的分片上了,我们这里只用了一个分片,大家可以启动多个分片,看看数据是怎么分割的。

业精于勤,荒于嬉;行成于思,毁于随。

如果你觉得这篇文章不错或者对你有所帮助,可以通过右侧【打赏】功能,给予博主一点点鼓励和支持

时间: 2024-12-25 01:35:52

MongoDB基础教程系列--第九篇 MongoDB 分片的相关文章

MongoDB基础教程系列--第二篇 MongoDB基本操作(一)

1.安装环境 在官网上下载MongoDB的最新版本,根据自身Windows版本下载正确的MongoDB版本.下载后,双击32位或者64位.msi文件,按操作提示安装就可以了. 说明: 32 位版本的 MongoDB 只支持 2G 以下的数据库,只适用于测试及评估. 在 MongoDB 2.2 版本后已经不再支持 Windows XP 系统.最新版本也已经没有了 32 位系统的安装文件. 创建数据目录 安装完MongoDB以后,我们需要创建数据目录.注意,数据目录应该放在根目录下(如: C:\ 或

MongoDB基础教程系列--未完待续

最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作为目录篇,方便阅读,有问题大家一块交流哈.多谢大家关注,转载请注明出处,谢谢! MongoDB基础教程系列--第一篇 进入MongoDB世界 MongoDB基础教程系列--第二篇 MongoDB基本操作(一) MongoDB基础教程系列--第三篇 MongoDB基本操作(二) MongoDB基础教程

MongoDB基础教程系列--第七篇 MongoDB 聚合管道

在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下 MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最大值.最小值.平均值,求和等操作.聚合操作还能够对记录进行复杂的操作,主要用于数理统计和数据挖掘.在 MongoDB 中,聚合操作的输入是集合中的文档,输出可以是一个文档,也可以是多条文档. MongoDB 提供了非常强大的聚合操作,有三种方式: 聚合管道(Aggregation Pipeline)

MongoDB基础教程系列--第五篇 MongoDB 映射与限制记录

上一篇提到的 find() 的方法,细心的伙伴会发现查询的结果都是显示了集合中全部的字段,实际应用中,显然是不够用的.那么有没有办法指定特定的字段显示出文档呢?答案是肯定的,MongoDB 中用映射实现这种功能. 1.映射 MongoDB 中限制字段的显示,可以利用 0 或 1 来设置字段列表.1 用于显示字段,0 用于隐藏字段. 格式 db.COLLECTION_NAME.find({},{KEY:1}) 范例 查询文档时,只显示文档中的 name.首先查询出 user 集合中的所有文档,然后

MongoDB基础教程系列--第三篇 MongoDB基本操作(二)

1.集合操作 1.1.创建集合 MongoDB 用 db.createCollection(name, options) 方法创建集合. 格式 db.createCollection(name, options) 其中,name 是集合名称,是一个字符串:options 是可选项,是一个文档,指定内存大小和索引等选项,具体参数说明如下表: 字段 类型 说明 capped 布尔         (可选)如果为 true,表示为固定集合.固定集合是指具有固定存储空间的集合.当该值为 true 时,必

基础教程系列之装系统篇

[科普]基础教程系列之装系统篇 鉴于每天有很多新人询问安装系统问题,我决定花一些时间来系统性的整理一下安装系统的步骤,带领新人一步步来安装好系统. 目录 0.前言 1.物质准备 2.制作启动盘 3.选择自己需要的系统 4.其他准备工作 5.进入win pe 6.举例进入win pe 7-1.确保正确安装系统的准备工作 7-2.确保正确安装系统的准备工作 8-1.使用原版镜像安装系统 8-2使用ghost安装系统 8-3使用nt6 hdd installer安装系统 9.重启进入操作系统 10.安

Thrift 基础教程(二)编码篇

上接Thrift 基础教程(一)安装篇,今天来介绍下Thrift的编码过程,首先通过命令行生成框架代码. 命令格式如下: thrift -gen language xxx.thrift 1.首先介绍下那个xxx.thrift文件,我们需要先创建myserver.thrift文件,这个接口主要定义服务接口和数据格式. 介绍一下thrift文件的语法格式,以我写的myserver.thrift说明. /** * thrift中的数据类型 * bool 布尔类型 * byte 同java里的byte

AxureRP7.0基础教程系列 部件详解水平线和垂直线 HORIZONTAL & VERTICAL LINES

原型库网站-讲师金乌原创发布,可自由转载,请注明出处! Axure中文官网:www.AxureRP.cn   <AxureRP7.0部件详解> 水平线和垂直线 HORIZONTAL & VERTICAL LINES 使用案例 将页面区块化 最常见的用法是将内容分解成几个部分,比如,讲页面分为 header 和 body. 编辑线条 添加箭头 线条可以通过工具栏中的箭头样式转换为箭头:选中线条,点击箭头样式,在下拉列表中选择箭头样式. 线宽.颜色和样式 线条可以添加颜色.设置宽度和添加样

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称