MongoDB之分片
本文介绍分片的思想和MongoDB中的实现方法。
首先须要介绍一些主要的概念。
分片
分片。也叫做分区。是一种经常使用的数据库优化技术。其含义就是将数据拆分,将数据分散到不同机器上的过程。这样就能够使得系统能够存储很多其它的数据,处于更大的负载。
差点儿全部的数据库软件都能够进行手动分片,通过应用程序管理不同server上的不同数据,查询也须要寻找正确的server。这样尽管能够减轻负载,可是却难以维护,比方我们向集群加入节点或者删除节点。都须要相应的调整数据的分布。
MongoDB在这一点上做得不错,它支持自己主动分片,集群能够自己主动切分数据,达到负载均衡,从而使管理人员能够摆脱手动分片。
分片原理
以下说说分片的原理。MongoDB分片的基本思想就是将集合切分成小块,这些块分散到若干片里面。每一个片仅仅负责总数据的一部分。
应用程序不须要知道哪些片相应哪些数据,也不须要知道数据是否已经拆分。
MongoDB通过另外一个独立的路由进程mongos来实现这个功能。
mongos路由进程知道全部数据的存放位置,所以应用能够连接它来正常发送请求。而对于应用来说。自己仅仅知道连接了一个普通的mongod。
也就是说,mongos相应用隐藏了分片的细节。
为什么要隐藏了?事实上就是为了拓展的时候,不必改动应用程序的代码。
应用场景
说完了原理。那什么时候须要用到分片呢?有以下几种情况:
1. 机器的磁盘不够用了
2. 单个mongodb已经不再满足性能须要
3. 想将大量数据放入内存提高性能
一般来说,先从不分片開始。然后在须要的时候将其转换成分片。
片键
设置分片时,须要从集合里面选一个键,用该键的值作为数据拆分的根据。这个键成为片键。
假设有个文档集合表示的是人员,假设选择名字”name”做为片键,第一篇可能会存放名字以A-F开头的文档;第二片存G-P开头的文档;第三篇存Q-Z的文档。
随着添加或删除片,MongoDB会又一次平衡数据,使得每片的流量比較均衡,数据量也在合理范围内。
那么我们应该怎样选择片键呢?
假设我们选择了时间属性的键作为片键。那么随着时间增长。全部的文档都会以最后一片插入。这就不适合写入操作负载非常高的情况,可是查询起来就比較方便。
假设我们选择了分布均匀的片键,就会提高写入操作的负载能力,可是就会影响查询的性能。
我们也能够选择复合片键,将两个属性键结合为一个片键。
事实上和索引的原理类似,事实上,片键也是最经常使用的索引。
说了半天的概率,也累了,以下看看实际操作吧。
建立分片
建立分片有两步:启动server,然后决定怎么切分数据。
分片一般由三个部分组成:
1. 片
片就是保存子集合数据的容器。片能够是单个mongodserver。也能够是副本集。
2. mongos
路由进程,它接收全部的请求。然后将结果聚合,它本身并不存储数据或者配置信息,可是会缓存配置server的信息。
3. 配置server
存储集群的配置信息:数据和片的相应关系。
配置server是帮mongos存放分片的配置信息的,mongos自己不存放数据。直接同步配置server中数据就可以。
以下介绍具体过程:
首先要启动配置server和mongos。
配置server须要先启动,由于mongos会用到其上的配置信息。
第一步,启动配置server
配置server的启动就像普通的mongod一样:
mongod – config d:\mongodb\mongo.config --port 20000
第二步,建立mongos进程
建立mongos进程。以供应用程序连接。这样的路由server连接数据文件夹都不须要,但一定要指明配置server的位置:
mongos --port 30000 --configdb 127.0.0.1:20000
分片管理一般是通过mongos完毕的,完毕后效果例如以下:
第三步,加入片
加入片。片就是普通的mongod:
连接刚才启动的mongos,为集群加入一个片。
启动shell,连接mongos:
确定连接的是mongos而不是mongod,通过addshard命令加入片:
>mongo 127.0.0.1:30000
mongos> use admin
switched to db admin
mongos> db.runCommand(
... {
... "addshard":"127.0.0.1:10000",
... "allowLocal":1
... }
... )
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand(
... {
... "addshard":"127.0.0.1:10001",
... "allowLocal":1
... }
... )
{ "shardAdded" : "shard0001", "ok" : 1 }
当在本机执行片的时候,得设定allowLocal键为true。MongoDB尽量避免由于错误的配置,将集群配置到本地,所以得让它知道这仅仅是开发,并且我们非常清楚自己在做什么。
假设是生产环境中,则要将其部署在不同的机器上。
想加入片的时候,就执行addshard,MongoDB会负责将片集成到集群。
第四步,切分数据
MongoDB不会将存储的每一条数据都直接公布,得先在数据库和集合的级别将分片功能打开。
假设是连接配置server,
E:\mongo\bin>mongo 127.0.0.1:20000
MongoDB shell version: 2.0.6
connecting to: 127.0.0.1:20000/test
> use admin
switched to db admin
> db.runCommand({"enablesharding":"test"})
{
"errmsg" : "no such cmd: enablesharding",
"bad cmd" : {
"enablesharding" : "test"
},
"ok" : 0
}
应该是连接路由server,
db.runCommand({"enablesharding":"test"})//将test数据库启用分片功能.
对数据库分片后,其内部的集合便会存储到不同的片上,同一时候也是对这些集合分片的前置条件。
在数据库级别启用了分片以后,就能够使用shardcollection命令堆积和进行分片:
db.runCommand({"shardcollection":"test.refactor","key":{"name":1}})//对test数据库的lf集合进行分片,片键是name
假设如今对lf集合加入数据,就会根据”name”的值自己主动分散到各个片上。
这样分片就建立完毕啦!
管理分片
分片建立完毕后,怎样管理分片呢?
分片信息主要存放在config数据库上,这样就能被不论什么连接到mongos的进程訪问到了。
在shell中连接了mongos,并使用了use config数据库。
查看分片
通过db.shards.find()方法:
查看状态
db.printShardingStatus()
删除分片
db.runCommand({"removeshard":"127.0.0.1:10001"})
MongoDB之分片的更多相关文章
- mongodb(分片)
分片(即sharding)是将数据拆分至不同数据节点的方式. 1.在mongoDB中提供了自动分片的方式,它会根据数据块(chunk)大小的设定,对片键进行拆分: 2.mongoDB配置分片,要配置三 ...
- 【MongoDB】在windows平台下mongodb的分片集群(五)
本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建. 在分片集群中也照样能够创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选 ...
- MongoDB之分片集群(Sharding)
MongoDB之分片集群(Sharding) 一.基本概念 分片(sharding)是一个通过多台机器分配数据的方法.MongoDB使用分片支持大数据集和高吞吐量的操作.大数据集和高吞吐量的数据库系统 ...
- mongodb的分片(2)
在上一片博客,详细说明了mongodb的分片搭建的详细过程:分片搭建 在这里会说一些分片的维护与操作! 在集群搭建完,我们使用了sh.status()查看分片之后的数据,如下: #连接的是mongos ...
- mongodb的分片
分片是把大型数据集合进行分区成更小的可管理的片的过程. 副本集的每一个成员(仲裁节点除外)都一份数据的完整拷贝! 分片的目的:在节省硬件成本的基础上,提高系统的整体性能.但是却增加了管理和性能的开销. ...
- MongoDB 自动分片 auto sharding
MongoDB部署实验系列文章 MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情.MongoDB也在集群,分片,复制上也 ...
- OpenStack Ceilometer -- 后台数据存储优化之MongoDB的分片存储设置
https://xiaofandh12.github.io/Mongo-Shard 关于MongoDB MongoDB中的概念与关系型数据库之间的对应: Database --> Databas ...
- 转】MongoDB 自动分片 auto sharding
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! MongoDB 自动分片 auto shard ...
- MongoDB的分片(9)
什么是分片 分片是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载.基本思想就是将集合切成小块,这些块分散到若干片里, ...
- MongoDB 搭建分片集群
在MongoDB(版本 3.2.9)中,分片是指将collection分散存储到不同的Server中,每个Server只存储collection的一部分,服务分片的所有服务器组成分片集群.分片集群(S ...
随机推荐
- 奇葩属性:layout_weight 的解释及使用
在Android的控件布局中,有一个奇葩的 layout_weight 属性,定义如下: layout_weight : 用于指定剩余空闲空间的分割比例.用法: 01 <LinearLayout ...
- SVN 使用学习记录
一.基本SVN操作 安装了SVN之后,在本机上点击右键,就能够看到如下信息: 1.建立SVN Repository 下面来建立一个SVN Repository.这个文件夹是同步用的,你可以放在本机的任 ...
- Python len() 方法
描述 Python len() 方法返回对象(字符串.列表.元组.字典等)长度或项目个数. 语法 len() 方法语法: len(obj) 参数 obj -- 对象(字符串.列表.元组.字典等). 返 ...
- 做一个新产品需求,体验的分析文档?(例:喜马拉雅FM)
2.1 战略层 2.11 产品定位: 一款产品覆盖面广,收听节目种类齐全,资源丰富的电台APP. 以PGC为主流,通过合作方式吸纳专业的电台人,节目人,行业名人分享内容. 融合UGC,满足人们在空闲时 ...
- python标准库介绍——21 UserDict 模块详解
==UserDict 模块== ``UserDict`` 模块包含了一个可继承的字典类 (事实上是对内建字典类型的 Python 封装). [Example 2-15 #eg-2-15] 展示了一个增 ...
- redis 基本概览
1 redis 支持5种数据类型.redis 的值是字节数组,所以他不关心具体存储的是什么. redis 的键可以是 数值 strings lists sets hashes Redis 支持诸如列表 ...
- Flume入门
1.Flume是什么? ○ Flume是由cloudera开发的实时日志收集系统 ○ 核心概念是由一个叫做Agent(代理节点)的java进程运行在日志收集节点 ○ Flume在0.94. ...
- MFC程序开始的执行过程详述
1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程 ...
- 解决Linux(ubuntu),windows双系统重装后恢复开机选单
1 重装ubuntu后恢复开机选单十分简单.直接更新grub就能够了: sudo update-grub 2 重装windows后显得麻烦一点.需用u盘写入ubuntu镜像重新启动使电脑从u盘启动, ...
- java.net.DatagramPacket/java.net.DatagramSocket-UDP Socket编程
UDP 的 Java 支持 UDP 协议提供的服务不同于 TCP 协议的端到端服务,它是面向非连接的,属不可靠协议,UDP 套接字在使用前不需要进行连接.实际上,UDP 协议只实现了两个功能: 在 I ...