一、概述

分片是一种在多台机器上分配数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作。有两种解决系统增长的方法:垂直扩展和水平扩展。

垂直扩展涉及增加单个服务器的容量,例如使用更强大的CPU,增加更多RAM或增加存储空间量等。介于硬件成本和硬件性能单机器能支持的并发访问和存储容量是有限的。因此,垂直扩展是存在最大上限的。

水平扩展包括将系统数据集和负载分配到多个服务器上,添加额外的服务器以根据需要增加容量。尽管单台机器的整体速度或容量可能并不高,但每台机器可处理整个工作负载的一部分,效率可能会高于单台高速大容量服务器。而且很多时候可以选择成本很低的普通PC电脑;与单台机器的高端硬件相比,总成本可能会更低,但是增加了维护的复杂性。

MongoDB版本:3.6

二、分片集群架构

1).分片

分片的含义是指将数据拆分,将其分散存放在不同的机器上的过程,MongoDB的分片机制允许你创建一个包含许多台机器的集群,将数据子集分散在集群中,每一个分片维护着一个数据集合的子集。与单机服务器和副本集相比,使用分片集群架构可以使应用程序具有更大的数据处理能力。

备注:每一个分片都是由一个副本集组成。从MongoDB 3.6版本之后,分片必须是副本集。

2).配置服务器

配置服务器是整个集群的大脑,保存着集群和分片的元数据库,比如:分片信息、群集数据库信息、分片集合信息、块信息、平衡器信息、版本信息、群集操作日志、相关设置信息等。因此配置服务器数据必须保存在非易失性驱动器上。每个配置服务器都应该位于单独的物理机器上,最好是异地分布,同时还需要启用日志功能。

备注:在Mongos3.4版本之后,配置服务器也必须是副本集。

3).Mongos进程

Mongos提供客户端应用程序和分片群集之间的接口。

部署多个mongos支持高可用性和可伸缩性;常见的模式是mongos在每个应用程序服务器上部署一个 ,在每个应用程序服务器上部署一个 可减少应用程序和之间的网络延迟。或者您可以专用的服务器上部署mongos。大型部署一般使用此方法,因为它将客户端应用程序服务器与mongos分离 这可以更好地控制mongod实例的连接数量。

可以在主分片上部署mongos,mongos不会与mongod实例共享内存。需要注意内存争用可能导致的问题。

理论上可以部署无数个mongos路由。但是由于mongos路由经常与配置服务器进行通信,所以在增加mongos数量时应该密切监视配置服务器的性能。如果您看到性能下降,应该现在mongos的数量

三、部署分片

1).环境

192.168.137.10:rs-a-1:27010;rs-a-2:27011;rs-a-3:27012

192.168.137.20:rs-b-1:28010;rs-b-2:28011;rs-b-3:28012

192.168.137.30:config-1:29010,config-2:29011;config-3:29012;mongos:30000

rs-a分片副本集配置

  1. --------------rs-a-1配置-------------------------
  2. pidfilepath = /rs-a-/mongod.pid
  3. logpath = /rs-a-/data/log/mongod.log
  4. dbpath = /rs-a-/data/db
  5. logappend = true
  6. port =
  7. fork = true
  8. auth = true
  9. replSet = rs-a
  10. shardsvr = true
  11. keyFile = /rs-a-/autokey
  12.  
  13. --------------rs-a-2配置-------------------------
  14. pidfilepath = /rs-a-/mongod.pid
  15. logpath = /rs-a-/data/log/mongod.log
  16. dbpath = /rs-a-/data/db
  17. logappend = true
  18. port =
  19. fork = true
  20. auth = true
  21. replSet = rs-a
  22. shardsvr = true
  23. keyFile = /rs-a-/autokey
  24.  
  25. --------------rs-a-3配置-------------------------
  26. logpath = /rs-a-/data/log/mongod.log
  27. dbpath = /rs-a-/data/db
  28. logappend = true
  29. port =
  30. fork = true
  31. auth = true
  32. replSet = rs-a
  33. shardsvr = true
  34. keyFile = /rs-a-/autokey

rs-b分片副本集配置

  1. --------------rs-b-1配置-------------------------
  2. pidfilepath = /rs-b-/mongod.pid
  3. logpath = /rs-b-/data/log/mongod.log
  4. dbpath = /rs-b-/data/db
  5. logappend = true
  6. port =
  7. fork = true
  8. auth = true
  9. replSet = rs-b
  10. shardsvr = true
  11. keyFile = /rs-b-/autokey
  12.  
  13. --------------rs-b-2配置-------------------------
  14. pidfilepath = /rs-b-/mongod.pid
  15. logpath = /rs-b-/data/log/mongod.log
  16. dbpath = /rs-b-/data/db
  17. logappend = true
  18. port =
  19. fork = true
  20. auth = true
  21. replSet = rs-b
  22. shardsvr = true
  23. keyFile = /rs-b-/autokey
  24.  
  25. --------------rs-b-3配置-------------------------
  26. pidfilepath = /rs-b-/mongod.pid
  27. logpath = /rs-b-/data/log/mongod.log
  28. dbpath = /rs-b-/data/db
  29. logappend = true
  30. port =
  31. fork = true
  32. auth = true
  33. replSet = rs-b
  34. shardsvr = true
  35. keyFile = /rs-b-/autokey

config配置服务器配置

  1. --------------config-1配置-------------------------
  2. pidfilepath = /config-/mongod.pid
  3. logpath = /config-/data/log/mongod.log
  4. dbpath = /config-/data/db
  5. logappend = true
  6. port =
  7. fork = true
  8. auth = true
  9. configsvr = true
  10. replSet = config
  11. keyFile = /config-/autokey
  12.  
  13. --------------config-2配置-------------------------
  14. pidfilepath = /config-/mongod.pid
  15. logpath = /config-/data/log/mongod.log
  16. dbpath = /config-/data/db
  17. logappend = true
  18. port =
  19. fork = true
  20. auth = true
  21. configsvr = true
  22. replSet = config
  23. keyFile = /config-/autokey
  24.  
  25. --------------config-3配置-------------------------
  26. logpath = /config-/data/log/mongod.log
  27. dbpath = /config-/data/db
  28. logappend = true
  29. port =
  30. fork = true
  31. auth = true
  32. configsvr = true
  33. replSet = config
  34. keyFile = /config-/autokey

Mongos路由配置

  1. configdb = config/192.168.137.30:,192.168.137.30:,192.168.137.30:
  2. port =
  3. logpath = /mongos/log/route.log
  4. bind_ip = 192.168.137.30,127.0.0.1
  5. logappend = true
  6. fork = true
  7. keyFile = /mongos/autokey
  8. maxConns=

备注:

1.当前为了便于理解所以节点的分布不合理,如果是真实的生成环境每个数据节点都应该分开。

2.注意分片的分片节点的配置文件中需要增加“shardsvr = true”,conf节点需要增加"configsvr = true"的启动配置参数;可以参考yaml格式:https://www.cnblogs.com/chenmh/p/9544346.html

2).分片配置

1.启动所有分片副本集(rs-a,rs-b)和配置服务器(config)

具体方法可以参考我前面写的搭建副本集的文章。

MongoDB 搭建可复制群集:http://www.cnblogs.com/chenmh/p/8484049.html

2.启动mongos路由

  1. mongos --config /mongos/mongos.conf

3.分片配置

登入验证

  1. mongo --port
  2. use admin
  3. db.auth("dba","dba")

添加分片

  1. sh.addShard("rs-a/192.168.137.10:27010,192.168.137.10:27011,192.168.137.10:27012");
  2. sh.addShard("rs-b/192.168.137.20:28010,192.168.137.20:28011,192.168.137.20:28012");

文档分片

  1. use admin
  2. sh.enableSharding("test");
  3. sh.shardCollection("test.person",{_id:});
  1. sh.enableSharding("news");
  2. sh.shardCollection("news.person",{"username":"hashed"});

备注:这里的分片方式有1,-1,hashed三种;

1.如果分片集合是空集合那么可以不需要提前创建索引,对集合分片默认会对分片字段创建索引。

2.如果分片集合是非空集合那么需要手动创建对应分片类型的索引。

3.如果分片集合存在唯一索引,那么分片必须是唯一索引上的键。

具体参考:https://docs.mongodb.com/manual/reference/method/sh.shardCollection/index.html

插入测试数据

  1. use test
  2. for(var i=;i<;i++){ db.person.insert({"_id":i,"username":"user"+i,"createdate":new Date()})}
  1. use news
  2. for(var i=;i<;i++){ db.person.insert({"_id":i,"username":"user"+i,"createdate":new Date()})}

3).查询

  1. sh.status();

备注:可以看到rs-a;rs-b两个分片上的数据库块都是一样的,分布的很均匀,接下来看一下增加一个新分片之后数据库块的分布情况。

4).添加新分片

备注:添加新的分片之后,mongos再一次移动了数据块,保证数据块在每一个分片上都均匀的分布。数据库的移动是异步的。

四、总结

Mongos采取异步的方式将数据块移动到其它的分片,数据块不能设的太小否则对于密集写的系统所有的写操作会集中到一个分片上,最后异步移动数据块到其它的分片。

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

MongoDB 分片集群搭建的更多相关文章

  1. MongoDB分片集群搭建及扩容

    ### 实验:分片集群搭建及扩容#### 实验目标及流程 * 目标:学习如何搭建一个两分片的分片集群 * 环境:3台Linux虚拟机器,4Core 8GB * 步骤: * 配置域名解析 * 准备分片目 ...

  2. MongoDB 分片集群实战

    背景 在如今的互联网环境下,海量数据已随处可见并且还在不断增长,对于如何存储处理海量数据,比较常见的方法有两种: 垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU.更大的内存.更大容量的磁 ...

  3. 分布式文档存储数据库之MongoDB分片集群

    前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片 ...

  4. 搭建MongoDB分片集群

    在部门服务器搭建MongoDB分片集群,记录整个操作过程,朋友们也可以参考. 计划如下: 用5台机器搭建,IP分别为:192.168.58.5.192.168.58.6.192.168.58.8.19 ...

  5. Windows 搭建MongoDB分片集群(二)

    在本篇博客中我们主要讲描述分片集群的搭建过程.配置分片集群主要有两个步骤,第一启动所有需要的mongod和mongos进程.第二步就是启动一个mongos与集群通信.下面我们一步步来描述集群的搭建过程 ...

  6. Windows 搭建MongoDB分片集群(一)

    一.角色说明 要构建一个MongoDB分片集群,需要三个角色: shard server  即存储实际数据得分片,每个shard 可以是一个Mongod实例,也可以是一组mongod实例构成得Repl ...

  7. MongoDB分片集群原理、搭建及测试详解

    随着技术的发展,目前数据库系统对于海量数据的存储和高效访问海量数据要求越来越高,MongoDB分片机制就是为了解决海量数据的存储和高效海量数据访问而生. MongoDB分片集群由mongos路由进程( ...

  8. [ MongoDB ] 分片集群及测试

    分片 在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求. 当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量. ...

  9. 网易云MongoDB分片集群(Sharding)服务已上线

    此文已由作者温正湖授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. MongoDB sharding cluster(分片集群)是MongoDB提供的数据在线水平扩展方案,包括 ...

随机推荐

  1. Python 中 Iterator(迭代器)和Iterable(迭代对象)的区别

    直接可以用作for循环的数据类型有以下几种: tuple.list.dict.str等, 上述数据类型可以用作for循环的叫做可迭代对象Iterable.可以使用isinstance判断一个对象是否是 ...

  2. 云计算--网络原理与应用--20171120--VLAN与三层交换机配置

    什么是VLAN及其配置 Trunk的原理与配置 三层交换机的基本配置 实验:配置一个三层交换机 一 VLAN 的概念及优势 VLAN(virtual local area network)就是虚拟局域 ...

  3. Beta阶段报告

    Beta版测试报告 1. 在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? BUG名 修复的BUG 不能重现的BUG 非BUG 没能力修复的BUG 下个版本修复 url乱码 √ 手机端 ...

  4. 201621123062《java程序设计》第11周作业总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 思维导图: 2. 书面作业 本次PTA作业题集多线程 2.1. 源代码阅读:多线程程序BounceThread 2 ...

  5. Beta冲刺第一天

    一.昨天的困难 Beta阶段第一天,主要进行本阶段的计划和任务分配,主要问题是上阶段所做的测试工作较少,本阶段需要加强测试工作,并不断修复检测出来的BUG. 二.今天进度 所有成员写简单测试测试整体应 ...

  6. 学号:201621123032 《Java程序设计》第9周学习总结(

    1:本周学习总结 1.1:以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容 2:书面作业 2.1: List中指定元素的删除(题集题目) 2.1.1:实验总结.并回答:列举至少2种在List ...

  7. 201421123042 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 答: 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户 ...

  8. Flask 文件和流

    当我们要往客户端发送大量的数据比较好的方式是使用流,通过流的方式来将响应内容发送给客户端,实现文件的上传功能,以及如何获取上传后的文件. 响应流的生成 Flask响应流的实现原理就是通过Python的 ...

  9. Scala 操作符与提取器

    实际上Scala没有操作符, 只是以操作符的格式使用方法. 操作符的优先级取决于第一个字符(除了赋值操作符), 而结合性取决于最后一个字符 Scala的操作符命名更加灵活:) 操作符 中置操作符(In ...

  10. nyoj 矩形个数

    矩形的个数 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3 ...