MongoDB:分片(简介 & 自动分片 & 片键)
分片(增加服务器,水平扩展)是MongoDB的扩展方式,通过分片能过增加更多的机器来应对不断增加的负载和数据,还不影响应用。
【简介】
分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。在关系型数据库中,当一个表太大(超过几亿行数据)时,我们也有分表的做法,和这里的分片是类似的概念。
手动分片:当我们应用的瓶颈出现在数据库系统时,如果我们使用的是关系型数据库,我们通常要进行手动分片。即通过我们的应用层代码去维护与若干个数据库系统的连接,并且每个连接都是独立的。我们应用层代码负责屏蔽底层的多个数据库实例,查询时导向到特定的实例上进行,这种方式有个缺点,就是维护起来太麻烦!比如向底层数据库集群添加或删除节点,调整数据分布和负载模式等,都是对我们这层应用层代码提出不小的挑战!
MongoDB从设计时考虑的就是横向扩展,其支持自动分片!我们可以很轻松的向一个MongoDB数据库服务器集群添加或删除机器,集群会自动切分数据、进行负载均衡!
【自动分片】
“片”是一个独立的MongoDB服务(即mongod服务进程,在开发测试环境中)或一个副本集(在生产环境中)。将数据分片,其思想就是将一个大的集合拆成一个一个小的部分,然后放置在不同的“片”上。每一个“片”只是负责总数据的一部分。自动分片就是:应用层根本不知道数据已被分片,也全然不会知道具体哪些数据在哪个特定的“片”上。在MongoDB中,提供了一个路由服务mongos,在分片之前需要先运行这个服务,这个路由服务具体知道数据和“片”的关系。应用程序和这个路由服务通信即可,路由服务会将请求转发给特定的“片”,得到响应后,路由会收集响应数据,返回给应用层程序。下面两幅图展示了不使用分片和使用分片,用户发送请求的处理路径:
分片前:
分片后:
那我们该何时给我们的老系统(上图)改进为分片后的新系统(下图),通常有如下原则:
1》 机器的磁盘不够用了,数据量太大
2》 单个mongod已经无法满足写数据的性能需要了(这里复习一下,如果想要增加读性能,较好的方案是采用搭建主从结构,且让从节点可以响应查询请求)
3》 想将大量的数据放到内存中提高性能,一台机器的内存大小永远有极限(这就是纵向扩展和横向扩展的区别)
【片键】
设置分片时,需要从集合中选取一个键,用该键作为数据拆分的依据。这个键就称为“片键”。我们可以提供一个简单的例子,对于一个存储人员信息的集合users,我们要将其分片,选择的片键是人员姓名name,则最后分片的结果就可能为:第一片中存放的人员名称是A-F开头的,第二片中是G-P开头的,第三篇中是Q-Z开头的。当用户提交的查询是:db.users.find({"name" : "jimmy"}),该查询请求会分配给第二片进行处理;当用户提交的查询是:db.users.find({"name" : {"$lt" : "j"}},则这个查询请求会被分配给第一片和第二片进行处理;当用户提交的查询并不包含片键的信息,则这个查询会被发送到所有片上进行处理。对于插入操作,路由服务会根据插入文档的键name对应的值将这个请求发送到特定片上进行!这就是片键的作用。
随着数据的增减,可能会出现某一片负载很大,另一片负载轻松的情况,对于这种情况,MongoDB也会自动平衡数据和负载,是最后每片的流量基本相同!
对于选择哪个键作为片键?有个原则就是,片键应该有较多变化的值,如果片键设定为性别,只有“男”和“女”两种值,则这个集合就最多被分为两片,如果集合太大,这种分片不会最终解决效率的问题!这里我们可以看出,片键的选择和创建索引时键的选择原则是相似的,实际使用中,通常片键就是创建索引使用的键!
这里先介绍一下分片的简介和原理等内容,下一篇我们会搭建自己的第一个分片出来!
MongoDB:分片(简介 & 自动分片 & 片键)的更多相关文章
- Mongodb 笔记07 分片、配置分片、选择片键、分片管理
分片 1. 分片(sharding)是指将数据拆分,将其分散存放在不同的机器上的过程.有时也用分区(partitioning)来表示这个概念.将数据分散到不同的机器上,不需要功能强大的大型计算机就可以 ...
- mongoDB——自动分片(转)
原文地址:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会 ...
- 13.MongoDB系列之分片简介
1. 分片概念 分片是指跨机器拆分数据的过程,有时也会用术语分区.MongoDB既可以手工分片,也支持自动分片 2. 理解集群组件 分片的目标之一是由多个分片组成的集群对应用程序来说就像是一台服务器. ...
- MongoDB 自动分片 auto sharding
MongoDB部署实验系列文章 MongoDB做为NoSQL数据库,最近几年持续升温,越来越多的企业都开始尝试用MongoDB代替原有Database做一些事情.MongoDB也在集群,分片,复制上也 ...
- 转】MongoDB 自动分片 auto sharding
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! MongoDB 自动分片 auto shard ...
- 测试MongoDB的自动分片
MongoDB的自动分片: test库分片配置: db.shards.find(){ "_id" : "shard0000", "host" ...
- MongoDB集群之分片
原文:点击打开链接 MongoDB分片 分片(sharding)是将数据拆分,将其分散在不同的机器上的过程.MongoDB支持自动分片 片键(shard key)设置分片时,需要从集合里面选一个键,用 ...
- Mongodb主从复制/ 副本集/分片集群介绍
前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集). Mong ...
- MongoDB Sharding(二) -- 搭建分片集群
在上一篇文章中,我们基本了解了分片的概念,本文将着手实践,进行分片集群的搭建 首先我们再来了解一下分片集群的架构,分片集群由三部分构成: mongos:查询路由,在客户端程序和分片之间提供接口.本次实 ...
随机推荐
- HDU 6447
YJJ's Salesman Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- Head First HTML5 Programming笔记--chapter2 介绍Javascript和DOM
你已经了解了HTML标记(也称为结构),而且知道了CSS样式(也称为表示),剩下的就是Javascript(也称为行为). JavaScript的工作方式 1. 编写 你创建HTML标记和JavaSc ...
- sequence有关问题
sequence问题比如主键是 1,3,5,7,9,11 中间跳号了...用什么方法可以把主键重新排列为 1,2,3,4,5 ------解决方案--------------------update ...
- Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. k is a positive integer and is less than or equal to the length of the linked list. If the number of
class Solution { public: ListNode *reverseKGroup(ListNode *head, int k) { if (!head || !(head->ne ...
- [uiautomator篇][python] wifi接口学习网址
https://wifi.readthedocs.io/en/latest/wifi_command.html#usage
- 【Luogu】P3758可乐(矩阵优化DP)
题目链接 一开始想到这可能能用矩阵优化,但以为暴力就能卡过……T成二十分 首先我们回顾一下我们的暴力转移方程 用f[i][j][0/1]表示在i时刻,j点,1不爆炸,0已爆炸的方案数,那么f[i][j ...
- 【bzoj3545】[ONTAK2010]Peaks 线段树合并
[bzoj3545][ONTAK2010]Peaks 2014年8月26日3,1512 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路 ...
- Failed building wheel for Twisted
在安装scrapy框架的过程中,pip install scrapy 出现报错信息: building 'twisted.test.raiser' extension error: Microsoft ...
- Explosion at Cafebazaar
Explosion at Cafebazaar 时间限制: 1 Sec 内存限制: 128 MB 题目描述 You are an engineer at Cafebazaar and your sp ...
- MongoDB_语法命令
可以通过MongoDB shell 来连接MongoDB服务: ./mongo 进入交互 数据库-->集合-->文档 几个文档就组成了集合,可以设置固定大小的集合,集合就会有过期机制, ...