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 副本集的分片上了,我们这里只用了一个分片,大家可以启动多个分片,看看数据是怎么分割的。
业精于勤,荒于嬉;行成于思,毁于随。
如果你觉得这篇文章不错或者对你有所帮助,可以通过右侧【打赏】功能,给予博主一点点鼓励和支持
MongoDB基础教程系列--第九篇 MongoDB 分片的更多相关文章
- MongoDB基础教程系列--第二篇 MongoDB基本操作(一)
1.安装环境 在官网上下载MongoDB的最新版本,根据自身Windows版本下载正确的MongoDB版本.下载后,双击32位或者64位.msi文件,按操作提示安装就可以了. 说明: 32 位版本的 ...
- MongoDB基础教程系列--第一篇 进入MongoDB世界
1.什么是MongoDB MongoDB是跨平台的.一个基于分布式文件存储的数据库.由C++语言编写.用它创建的数据库具备性能高.可用性强.易于扩展等特点.MongoDB将数据存储为一个文档,数据结构 ...
- MongoDB基础教程系列--未完待续
最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...
- MongoDB基础教程系列--目录结构
最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...
- MongoDB基础教程系列--第三篇 MongoDB基本操作(二)
1.集合操作 1.1.创建集合 MongoDB 用 db.createCollection(name, options) 方法创建集合. 格式 db.createCollection(name, op ...
- MongoDB基础教程系列--第四篇 MongoDB 查询文档
查询文档 查询文档可以用 find() 方法查询全部文档,可以用 findOne() 查询第一个文档,当然还可以根据 条件操作符 和 $type操作符 查询满足条件的文档. find() 和 find ...
- MongoDB基础教程系列--第五篇 MongoDB 映射与限制记录
上一篇提到的 find() 的方法,细心的伙伴会发现查询的结果都是显示了集合中全部的字段,实际应用中,显然是不够用的.那么有没有办法指定特定的字段显示出文档呢?答案是肯定的,MongoDB 中用映射实 ...
- MongoDB基础教程系列--第六篇 MongoDB 索引
使用索引可以大大提高文档的查询效率.如果没有索引,会遍历集合中所有文档,才能找到匹配查询语句的文档.这样遍历集合中整个文档的方式是非常耗时的,特别是处理大数据时,耗时几十秒甚至几分钟都是有可能的. 创 ...
- MongoDB基础教程系列--第七篇 MongoDB 聚合管道
在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下 MongoDB 的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最 ...
随机推荐
- swift -- 构造/析构函数
一.构造函数 //当一个类实例化一个对象时候,第一个调用的方法 class Student { //属性 var name = "ser" let age : Int //1.重 ...
- python 接口自动化测试(二)
代码实现 1.XlsEngine.py # -*- coding:utf-8 -*- __author__ = 'yanghaitao' import xlrd import xlwt class X ...
- 分享一些自己写的前端库,并骗骗 star(库都是在实际项目中大量运用过的)
最近一两年在一些项目上,通过实际需求出发,编写了一些库在项目中使用,现在将这些项目都稍微整理了一下开源了出来,也许也有刚好能够你也用得上的,顺便也骗一下star.均在项目的README中加了相关的说明 ...
- 【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- 适用MySQL Migration Toolkit 1.0 将oracle迁移到mysql中遇到的问题
这里主要说一下我在适用中碰到的问题,主要过程参考 http://www.cnblogs.com/duwenlei/p/3520759.html. 首先启动MySQLMigrationTool.exe ...
- ICC_lab总结——ICC_lab6:版图完成
ICC_workshop的最后一个实验了.在这次的实验中,由于我使用ICC的版本与workshop的lab不是同一个版本,因此在后面的实验过程不是很顺利,主要是在LVS的过程中,最后的LVS没有通过. ...
- JSP九大内置对象的作用和用法总结(转)
SP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1.r ...
- 老李分享:《Linux Shell脚本攻略》 要点(七)
老李分享:<Linux Shell脚本攻略> 要点(七) 1.显示给定文件夹下的文件的磁盘适用情况 [root@localhost program_test]# du -a -h ./ ...
- MyBatis 源码分析——动态SQL语句
有几年开发经验的程序员应该都有暗骂过原生的SQL语句吧.因为他们不能一句就搞定一个业务,往往还要通过代码来拼接相关的SQL语句.相信大家会理解SQL里面的永真(1=1),永假(1=2)的意义吧.所以m ...
- Hexo + Github Pages 搭建个人博客
之前一直想搭建自己的博客,由于自己的懒惰拖到现在.好了,废话不多说!直接上干货! 安装Node.js 安装Git Github Pages配置 安装Hexo及主题设置 进阶篇-高级定制 其它实用功能 ...