MongoDB之分片集群(Sharding)
MongoDB之分片集群(Sharding)
一、基本概念
分片(sharding)是一个通过多台机器分配数据的方法。MongoDB使用分片支持大数据集和高吞吐量的操作。大数据集和高吞吐量的数据库系统挑战着单一服务的性能。例如:高查询率将耗尽CPU的性能。大于系统RAM的工作集将给磁盘的IO很大的压力。
应对系统的增长有两个方法:垂直扩展和水平扩展。
垂直扩展的方法是提升单一服务的性能,例如:使用一个更强的CPU,或更多的内存,或提升大量的存储空间。可用技术的局限性将限制单一服务的工作负载。另外基于云的提供者也有硬件配置的上限。所以,垂直扩展是有上限的。
水平扩展的方法是将系统的数据集分配到多个服务上,添加额外的服务可以提升系统的能力。一个单独机器的性能和速度可以不是很高,每台机器处理整个工作负载的一个子集,潜在地相比一个单一的高速度、高性能的服务,提供了更好的性能。扩展部署的能力仅仅需要添加额外的需要的服务,这比添加高档的硬件要便宜不少。
1.1分片集群
MongoDB 的分片集群由下面的几个组件组成:
- 分片(shard):每个分片包含了分片数据的一个子集,每个分片可以作为一个副本集部署。
- mongos:mongos扮演者查询路由的角色,提供着客户端应用和分片集群的接口。
- config servers:配置服务存储着集群的元数据和配置设置,MongoDB3.4以后,配置服务必须部署成副本集。
下图描述了分片集群中,各个组件的交互
mongodb在collection级别对数据进行分片,分配collection数据到集群中的每一个分片。
1.2分片主键(shard keys)
为了在集合中分配文档,MongoDB使用分片主键分割集合。分片主键由不重复的字段或者字段集合组成。
对一个集合分片时,你要选择分片主键,分片主键在分片以后不能修改。一个分片集合只有一个分片主键。
为了对非空的集合进行分片,集合必须有一个以分片主键开头的索引。对于空集合,如果集合对于分片主键没有一个合适的索引,MongoDB将创建索引。
分片主键的选择将影响分片集群的性能、效果和扩展能力。一个最佳的硬件和基础设施的集群的瓶颈取决于分片主键的选择。分片主键的选择将影响你的集群使用的分片策略。
1.3区块(chunks)
MongoDB分割分片数据到区块,每一个区块包含基于分片主键的左闭右开的区间范围。在分片集群中,MongoDB通过分片迁移区块,使用分片集群权衡器。权衡器视图完成一个公平的区块平衡,通过集群中所有的分片。
1.4分片的优点
MongoDB通过集群中的分片分配读和写的工作负载,允许每个分片处理集群中的一部分操作,读和写的工作负载可以通过添加分片进行横向扩展。包含分片主键或者组合主键前缀的查询,mongos可以定位这个查询到特定的分片或者分片子集上。这种定位操作比广播到所有分片要高效的多。
集群中的分片存储整个数据中的一部分,随着数据的增长,增加额外的分片可以增加集群的存储能力。
即使集群中的一个或多个分片不可用,集群也可以继续执行一部分读写操作。在宕机期间,不可用的分片上的数据是不能够处理的,可用分片上的读写操作是可以被成功处理的。在生产环境,每一个分片将被部署成副本集,提供可增长的冗余和高可用。
1.5 分片之前的考虑
分片集群的基础需求和复杂性需要小心的计划、执行和维护。谨慎地考虑分片主键是确保集群性能和效率所必须的。在分片之后,你不能改变分片的主键,也不能使集合不分片。如果查询不包含分片主键或者组合主键的前缀,mongos将执行广播操作,查询所有分片,这些查询将执行很长时间。
1.6分片和不分片集合
一个数据库可以有分片集合和不分片集合的混合,分片集合通过集群中的分片进行分割和分配,不分片集合将存储在基础分片中。每个数据库都有一个自己的基础分片。
1.7 连接分片集群
你必须连接mongos路由和集合中的集合进行交互。这包含分片和不分片的集合。客户端绝不可能连接一个单独的分片进行操作。你可以像连接mongod一样连接mongos,他们是一样的。
1.8分片策略
MongoDB支持两种分片策略进行数据分片。
Hash分片
Hash分片是计算一个分片主键的hash值,每一个区块将分配一个范围的hash值。
当分片主键中的一个范围被“关闭”,他们的hash值不可能在相同的区块中。基于hash值分布的数据促使了更多的数据分布,特别是分片主键单调变化的数据集。
Hash分布意味着基于分片主键的范围查询很少可能命中一个单一的分片,导致了更多的广播操作。
范围分片
范围分片是基于分片主键的值切分数据,每一个区块将会分配到一个范围。
分片主键的范围被“关闭”,他们也很有可能落在相同的区块中。这使得mongos可以路由操作到请求数据的分片上。范围分片的效率取决于分片主键的选择,欠考虑的分片主键将导致数据分布不均匀。这将取消一些分片的益处,还可以导致性能瓶颈。
二、分片集群的搭建
由于测试机有限,这里我们只展示最简单的分片搭建,即一个分片、一个配置服务、一个路由。
首先,我们启动配置服务,配置服务的mongodb的配置文件如下:
sharding:
clusterRole: configsvr
replication:
replSetName: "rs"
net:
bindIp: 192.168.2.233
clusterRole设置成configsvr,表名这个mongod是配置服务;副本集的名字叫做“rs”。
./bin/mongod --config conf/mongod.conf
然后,我们通过mongo shell连接这个mongod实例。
mongo --host 192.168.2.233 --port 27019
值得注意的是,配置服务启动时,默认的端口是27019,本人一开始并没有注意到,一直连接27017,连接不上,最后才发现端口不对。然后添加副本集。
rs.initiate()
返回如下:
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "192.168.2.233:27019",
"ok" : 1,
"operationTime" : Timestamp(1519283130, 1),
"$gleStats" : {
"lastOpTime" : Timestamp(1519283130, 1),
"electionId" : ObjectId("000000000000000000000000")
},
"$clusterTime" : {
"clusterTime" : Timestamp(1519283130, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
当出现ok=1时,说明添加成功了。
其次,我们启动shard实例。配置文件的内容如下:
sharding:
clusterRole: shardsvr
replication:
replSetName: "rs0"
net:
bindIp: 192.168.2.234
clusterRole配置shardsvr,说明这个实例是shard实例。副本集的名字我们叫做“rs0”,区别于配置服务的“rs”。启动mongod实例
./bin/mongod --config conf/mongod.conf
通过mongo shell连接这个实例
./bin/mongo --host 192.168.2.234 --port 27018
注意shard的实例启动时端口默认为27018。然后初始化副本集
rs.initiate()
返回结果如下:
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "192.168.2.234:27018",
"ok" : 1
}
最后启动mongos实例,配置文件内容如下:
sharding:
configDB: rs/192.168.2.233:27019
net:
bindIp: 192.168.2.235
configDB是配置服务副本集的名字,格式如下:副本集名称/ip:端口。启动mongos实例
./bin/mongos --config conf/mongod.conf
注意这里的命令是mongos,而不是之前的mongod。通过mongo shell连接这个实例
./bin/mongo --host 192.168.2.235 --port 27017
这里的端口是mongodb的默认端口27017。向集群中添加分片
sh.addShard( "rs0/192.168.2.234:27018")
分片的格式为:副本集名称/ip:端口。然后添加分片的数据库
sh.enableSharding("<database>")
配饰分片的集合和主键
sh.shardCollection("<database>.<collection>", { <key> : <direction> } )
<key>为主键字段的名字。
<direction>为以下3种:“1”:主键值正向遍历;
“-1”:主键值反向遍历;
“hashed”:主键hash值
至此,MongoDB的分片集群介绍完了。
MongoDB之分片集群(Sharding)的更多相关文章
- 【MongoDB】在windows平台下mongodb的分片集群(五)
本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建. 在分片集群中也照样能够创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选 ...
- MongoDB 搭建分片集群
在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(S ...
- MongoDB之分片集群与复制集
分片集群 1.1.概念 分片集群是将数据存储在多台机器上的操作,主要由查询路由mongos.分片.配置服务器组成. ●查询路由根据配置服务器上的元数据将请求分发到相应的分片上,本身不存储集群的元数据, ...
- MongoDB笔记: 分片集群
MongoDB分片集群由三个模块组成 shard: 分片(或者分区)模块, 每个分片分别存储一部分数据, 从MongoDB 3.6开始, 分片必须是replica set(副本集) mongos: m ...
- 【MongoDB】在windows平台下搭建mongodb的分片集群(二)
在上一片博客中我们讲了Mongodb数据库中分片集群的主要原理. 在本篇博客中我们主要讲描写叙述分片集群的搭建过程.配置分片集群主要有两个步骤.第一启动全部须要的mongod和mongos进程. 第二 ...
- 【MongoDB】在windows平台下mongodb的分片集群(六)
在本篇博客中我们主要讨论下博客的管理.因为已经在前面五篇中写了具体的实例,因此这里就不再举例说明. 一.监控 分片集群是整个体系中比較复杂的一块,因此更应该须要监控. 主要命令: serverstat ...
- MongoDB的分片集群搭建
MongoDB的最为自豪的一个特色之一,分片. 参考官方文档: https://docs.mongodb.com/manual/sharding/ 单机压力,高频查询CPU,IO 单表压力,百万千万 ...
- Mongodb分片集群技术+用户验证
随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,“分片”就用这个来解决这个问题. 从图中可以看到有四个组件:mongos.config server. ...
- MongoDB 分片集群技术
在了解分片集群之前,务必要先了解复制集技术! 1.1 MongoDB复制集简介 一组Mongodb复制集,就是一组mongod进程,这些进程维护同一个数据集合.复制集提供了数据冗余和高等级的可靠性,这 ...
随机推荐
- Java技术分享:如何编写servlet程序
身为计算机专业的我,从接触java至今,已经有七年之久,从最开始的小白到现在的大白,这是一个漫长而曲折的历程. 大学刚接触Java这个学科时,一点儿都不理解java是要干嘛的,只知道学起来肯定不容易, ...
- seaJS 模块加载过程分析
先看一个seajs的官方example, 以下以seajs.use('main')为例, 解析加载mod main的过程 //app.html seajs.use("main") ...
- Spark算子--SortByKey
转载请标明出处http://www.cnblogs.com/haozhengfei/p/076a31e7caab1316b07990c02ac65e9c.html SortByKey--Transf ...
- Html Mailto标签详细使用方法
http://www.360doc.com/content/09/0805/14/16915_4684377.shtml Html Mailto标签详细使用方法 Html中mailto标签是一个非常实 ...
- 微信小程序版2048
最近流行微信"跳一跳"小游戏,我也心血来潮写了一个微信小程序版2048,本篇文章主要分享实现2048的算法以及注意的点,一起来学习吧!(源码地址见文章末尾) 算法 1.生成4* ...
- <c:forEach 的常用整理
<c:forEach items="${images}" var="img" varStatus="status"> <d ...
- virtuoso装载大的rdf文件的方法
本文详细介绍了将一个比较大的rdf文件装载到virtuoso数据库的过程.参考virtuoso网站的文档说明,通过实践,将一个大约4.6G左右的nt文件装载到virtuoso数据库中,用了大概6个多小 ...
- intent详解(一)
摘录自:http://blog.csdn.net/harvic880925/article/details/38399723 前言:通过重新翻看Android入门书籍,才发现原来自己露掉了那么多基础知 ...
- 自学python Day01
What is Python 1. 面向对象的解释行语言 2. 非常丰富的库 3. 使用制表符作为语句缩进 (white space) 优点: 1. 免费.开源 2. 可扩展性.可嵌入性 3. 非常丰 ...
- 关于RegExp对象实例的lastIndex属性的一些整理
今天在做正则循环匹配,碰到一个怪问题,第一次可以匹配上,但循环第一次之后,就无法匹配上了.猛然想起,RegExp中lastIndex属性,于是上网搜索了一下,将一些资料整理归纳,以备今后自己查阅(记性 ...