分片是指数据拆分 将其分散在不同的机器上的过程,有时候也叫分区来表示这个概念.将数据分散到不同机器上 不需要功能强大的计算机就可以储存更多的数据,处理更大的负载.

       几乎所有的数据库都能手动分片 应用程序需要维护与若干不同数据库服务器的连接,每个连接都是独立的 应用程序给I案例不同服务器上不同数据的存储,还管理在合适的数据库上查询的工作,这种方法能够很好的工作,但是难以维护 不如想集群添加节点 或者从集群删除节点都很困难 调整数据分布和负载模式也不轻松.
       MongoDB支持自动分片,可以使用数据库架构对应用程序不可见,可以简化系统管理,对应用程序而言,就像连接的一台但是mongod服务器一样,MongoDB自动处理数据在分布上的分布.也更容易添加和删除分片.
       MongoDB的分片机制允许你创建一个包含许多台机器的集群,将数据的子集合分散在集群中,每个分片维护着一个数据集合的子集.与单机服务器和副本集相比,使用集群架构可以使应用程序具有更大的数据处理能力.

首先要准备三台 可以互相通信的的服务器  作为配置服务器   配置服务器是集群的大脑 保存着几区和发呢鬼片的元数据 即个分片包含哪些数据信息. 因此要首先建立配置服务器 鉴于他极端的重要性 必须启用日志功能 并确保其数据保存在非易失性去驱动器上

 
因为mongos需要从配置服务器获取配置信息  因此配置服务器应该先于任何mongos进程启动 配置服务器是独立的mongod进程 可以想见简单的mongod进程一样 启动
命令
mongod --configsvr -f conf/config.conf
config.conf 文件内容:
dbpath = /home/apps/mongoDB/data/configdb
logpath = /home/apps/mongoDB/logs/configdb.log
fork = true
--configsvr 的作用是把默认端口修改为27019  dbpath 修改为 data/configdb  建议使用这个参数 这样可以直白的告诉我们这个服务器的用处
配置服务器并不需要太多的空间和资源 因此可以将其部署在运行着其他程序的机器上  如应用服务器 分片的mongod服务器 或者mongos进程的服务器 
 
可以在三台配置服务器的任意一台上 启动mongos
mongodb-linux-i686-3.0.2/bin/mongos --configdb 192.168.1.111:27019,192.168.1.116:27019,192.168.1.117:27019 -f conf/mongos.conf
 mongos.conf文件内容:
logpath = /home/apps/mongoDB/logs/mongos.log
fork = true
默认情况下 mongos运行在27017端口  并不需要指定数据目录 mongos自身并不保存数据 他会在启动时从配置服务器加载数据 确保设置了logpath 以便将mongos日志保存到安全的地方 可以启动任意数量的mongos进程
生产情况下 一般mongos进程回合应用服务器运行在同一台服务器上
连接mongos 
mongodb-linux-i686-3.0.2/bin/mongo 127.0.0.1:27017/test
 
将副本集转换为分片
只要告知mongos副本集的名称和副本集成员类表
sh.addShard("spock/server-1:27017,server-2:27017,server-3:27017")
 
可以在参数中指定副本集的所有成员 但并非一定要这么做 mongos能够自动检测到没有包含在副本集成员表中的成员 如运行sh.status() 可发现mongoDB已经找到了其他的副本集成员 
副本集明朝spock被用作分片名称 如之后希望移除这个分片或是向这个分片迁移数据  可使用spock来表示这个分片 这比使用特定的服务器名称要好 因为副本集成员和状态是不断改变的,将副本集甜椒到分片后 就可以将应用程序连接到副本集改成连接mongos 
 
 
数据分片
除非明确指定规则 否则MongoDB不会自动对数据进行分片,如有必要 必须明确要告知数据和集合
假如我们希望对test数据库中的music集合按照name键进行分片 首先要对music数据库启动分片
首先我们连接mongos 想test.music 添加10000条数据
然后再连接mongo 对数据库test启动分片
在对集合启动分片之前 要在片键name上建立索引
 
现在就可以根据name对集合music 进行分片了
因为我们现在只有一个分片  所以数据 全部在spock这个副本集上 minkey-->>maxkey
增加集群容量
可通过增加分片来增加集群容量 为添加一个新的 空的分片 可先创建一个副本集,确保副本集的名字和其他分片不同 副本集初始化并拥有一个主节点后.可以在mongos上运行sh.addShard("test123/192.168.1.122:27017")   将副本集作为分片添加到集群中  
如果有现存的很多副本集  只要他们没有同名的数据库 就可以将他们作为新的分片全部添加到集群中.由于内存有限 我就能在做副本集了  演示当的mongod假如集群中 作为分片
因为本机存在一个test数据库  所以报上面图片的错误 所以我去本机删除 test数据库
继续添加分片
 
可以看见 108机器已经添加成 集群的分片之一了
MongoDB 会均衡的将集合数据分散到集群的分片上 这个过程不是瞬间完成的  对于比较大的集合  可能会话上几个小时才能完成
用mongoVUE 可以看到108分片的数据在增加   
  一秒后刷新  
副本集 spock的数据在减少
      
进过了漫长等待  108分片上的数据最后
spock副本集上数据停留在
 现在可以看出  数据通过mongos 添加到集群中,然后均衡器会自动帮你做数据均衡 .
MongoDB如何追踪集群数据
理论上说 MongoDB能够追踪到每个文档的位置,但当集合中包含成千上万的文档的时候,就会变得难以操作,因此mongodb将文档分组为快(chunk) 每个快由给定片键特定范围内的文档组成,一个快只能存在一个分片上,所以mongodb用一个比较小的表就能够维护块跟分片的映射
 
快范围
新分片的几个起初只有一个块,所有文档都位于这个块中,范围是负无穷到正无穷 shell用$minKey $maxKey表示
随着数据的不断增长 mongodb会自动将其分成两个块,范围就变成了 负无穷到 <some value> 和 <some value>到正无穷 两个块中的<some value>是相同的 范围较小的块包含比<some value>小的所有文档(但是不包含<some value>本身) 范围较大的块包含从<some value>一直到正无穷的所有文档(包含<some value>本身)
比如 我们按照age字段进行分片 所有的age的值为3~17的文档都包含在这一个块中:3<=age<17 该快拆分后,我们得到了两个较小的块 3<=age<12 和12<=age<17  这里的 12就叫做拆分点(split point0)
 
快拆分
mongos会记录在每个块中插入了多少数据  一旦到达阀值,就会检查是否需要对块进行拆分,如果快需要拆分 mongos就会在配置服务器上更新这个块的元信息.快拆分只需要更改快的元数据即可,而无需要进行数据移动,数据拆分时 配置服务器会创建新的块文档 同时会修改旧的快范围 拆分完成后 mongos会重置对原始快的追踪器 同时为新的块创建新的追踪器
拆分点的选取 
{"age":13,"username":"wad"} 
{"age":13,"username":"斯蒂芬"} 
//拆分点
{"age":14,"username":"wads"} 
{"age":14,"username":"wadf"} 
{"age":14,"username":"wadg"} 
//拆分点
{"age":15,"username":"wadh"} 
{"age":15"username":"wadm"} 
mongos无需在每个可用的拆分点对块进行拆分 但拆分时只能猜这些拆分点钟选择一个
上面例子来说 如果这是初中的学生的信息  那么在14岁的人将会很多 这样如果是用age作为片键就会出现很多大块 所以拥有不同的片键值是非常重要的
注意:集群的搭建必须保证配置服务器都必须可达 否则当mongos不断重复发起拆分请求去无法进行拆分 这个过程叫做拆分风暴 避免拆分风暴的唯一方法就是 尽可能的保证配置服务器的可用和健康.也可以重新启动mongos 重置写入计数器
频繁的让mongos上线和宕机 那么mongos在再次宕机之前可能永远无法收到足矣打到拆分阀值点的写请求 因此快回变得越来越大 所以减少mongos进程的波动,尽可能保证mongos进程可用,而不是需要时开启,不需要是关闭.
 
均衡器
负责数据的迁移 他会周期性的检查分片间是否存在不均衡 存在就迁移数据打到均衡 每个mongos有时候也会扮演均衡器的角色. 每隔几秒钟 mongos就会尝试变身为均衡器,如果没有其他均衡器可用,mongos就会对整个集群加锁,防止服务器对集群修改 然后做一次均衡,均衡不会影响mongos的正常路由操作 所以对客户端没有影响
不均衡是值:一个分片明显比其他分片拥有更多的快(集合越大越能承受不均衡状态) 如果检测到不均衡 均衡器就会开始对块进行在分布,使每个分片拥有数量相当的快.如果没有集合打到均衡阀值.mongos就不再充当均衡器的角色了

mongodb模拟生产环境的分片集群的更多相关文章

  1. MongoDB DBA 实践6-----MongoDB的分片集群部署

    一.分片 MongoDB使用分片技术来支持大数据集和高吞吐量操作. 1.分片目的 对于单台数据库服务器,庞大的数据量及高吞吐量的应用程序对它而言无疑是个巨大的挑战.频繁的CRUD操作能够耗尽服务器的C ...

  2. 生产环境MySQL数据库集群MHA上线实施方案

    生产环境MySQL数据库集群MHA上线实施方案 一.不停库操作 1.在所有节点安装MHAnode所需的perl模块(需要有安装epel源) yum install perl-DBD-MySQL -y ...

  3. MongoDB DBA 实践7-----MongoDB的分片集群操

    一.使用Ranged Sharding对集合进行分片 从mongo连接到的shell中mongos,使用该sh.shardCollection()方法对集合进行分片. 注意: 必须已为集合所在的数据库 ...

  4. 正式生产环境下hadoop集群的DNS+NFS+ssh免password登陆配置

    博客地址:http://www.loveweir.com/ 环境虚拟机centos6.5 主机名h1  IP 192.168.137.11  作为DNS FNS的server 主机名h2  IP 19 ...

  5. kubernetes实战之部署一个接近生产环境的consul集群

    系列目录 前面我们介绍了如何在windows单机以及如何基于docker部署consul集群,看起来也不是很复杂,然而如果想要把consul部署到kubernetes集群中并充分利用kubernete ...

  6. 【七】MongoDB管理之分片集群介绍

    分片是横跨多台主机存储数据记录的过程,它是MongoDB针对日益增长的数据需求而采用的解决方案.随着数据的快速增长,单台服务器已经无法满足读写高吞吐量的需求.分片通过水平扩展的方式解决了这个问题.通过 ...

  7. Mongodb副本集+分片集群环境部署记录

    前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...

  8. Mongodb副本集+分片集群环境部署

    前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...

  9. 分布式mongodb分片集群

    本博客先简单介绍mongodb入门以及单实例以及mongodb的主从(主从官网是不提倡用的,原因后续介绍),副本集,分片. 第一:nosql介绍: 数据库分为关系型数据库与非关系型数据库,及具代表性的 ...

随机推荐

  1. selenium webdriver——鼠标事件

    Web产品中提供了丰富的鼠标交互方式,例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能,在WebDriver中,将这些关于鼠标操作的方法 封装在ActionChains类中: ActionChains类 ...

  2. [SPOJ839]Optimal Marks

    [SPOJ839]Optimal Marks 试题描述 You are given an undirected graph \(G(V, E)\). Each vertex has a mark wh ...

  3. git repo gerrit 的关系

    Git作为一个版本控制工具,功能很强大,新建分支,切换分支都很快,小团队用Git就能很好地管理好了,但如果是Android系统如此庞大的工程呢,我们知道全套Android源码是很大很大的,目录结构也很 ...

  4. 初识laytpl

    laytpl-精致巧妙的JavaScript模板引擎 这两天在做一个mui项目,列表需要循环很多的数据.在公司同事的指引下认识了这个新的模板--laytpl.我只想说,很好用们很巧妙. 废话不多说,直 ...

  5. UOJ Goodbye Bingshen

    在叶子童鞋的推荐下打了这场比赛... 感觉被虐爆了... 怎么这么多构造题... 我还没写过呢... 交互题是毛线...看了好久没看懂...就放弃了...(我语文好差QAQ...) 最后只会T1... ...

  6. Select语句执行顺序《转》

    原文发布时间为:2010-10-12 -- 来源于本人的百度文章 [由搬家工具导入] 目的在于理解如何Select 【搜索所得】: 标准的 SQL 的解析顺序为:(1).FROM 子句, 组装来自不同 ...

  7. JavaScript效果下载网站!

    原文发布时间为:2009-07-16 -- 来源于本人的百度文章 [由搬家工具导入] http://myjs.chinaz.com/

  8. 老郭带你学数据结构(C语言系列)1-线性表之静态顺序表

    在学习之前,先说下我的软件情况,操作系统是manjaro linux 今天刚刚升级的,编辑器是vim8.0.55,编译器是gcc 6.2.1,调试器是gdb 7.12,版本再低点也可以,只要gcc版本 ...

  9. 用Python和Pygame写游戏-从入门到精通(py2exe篇)

    这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用, ...

  10. 【linux高级程序设计】(第八章)进程管理与程序开发 5

    守候进程 启动方式: 在系统启动时由/etc/rd.d目录下的启动脚本启动 利用inetd超级服务器启动 有cron命令定时启动,以及在终端用nohup命令启动 守护进程编程要点 (1)屏蔽有关控制终 ...