sharding是一种将海量数据水平扩展的集群系统,数据分表存储在sharding的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式mongodb集群. sharding不是某个特定数据库软件附属的功能,而是具体技术细节上的抽象处理,是水平扩展(横向扩展或向外扩展)的解决方案,主要目的是突破单个数据库服务的I/O能力限制,最终解决数据库扩展性问题.sharding也有其不适合的场景,比如处理事务的应用就会非常复杂.对于跨DB的事务来说,很难保证完整性.

数据库sharding主要有以下优点:

提高了近似线性扩展的架构,可以随着应用的增长线性地增加更多的服务器

提高了数据库的可用性。如果只有一个数据库,一旦当掉,对其提供的service影响是100%,如果拆成10台那么,每台当掉的影响就为10%

小型数据库的压力比较小,风险小,性能更好.

MongoDB将数据分块称为chunk,每个chunk都是collection中一段连续的数据记录,通常最大尺寸是200MB,超出则生成新的数据块.

MongoDB的Sharding架构

构建一个mongoDB Sharding Cluster需要三种角色:shard服务器(Shard Server)、配置服务器(config Server)、路由进程(Route Process)

Shard服务器

shard服务器即存储实际数据的分片,每个shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Sets.为了实现每个Shard内部的故障自动转换,MongoDB官方建议每个shard为一组Replica Sets.

配置服务器

为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,决定该条记录属于哪个chunk.配置服务器可以存储以下信息.

每个shard节点的配置信息

每个chunk的shard key范围

chunk在各shard的分布情况

集群中所有DB和collection的sharding配置信息.

路由进程

它是一个前段路由,客户端由此接入,首先询问配置服务器需要到哪个shard上查询或保存记录,然后连接相应的shard执行操作,最后将结果返回给客户端,客户端只需要将原本发给mongod的查询或更新请求原封不动地发给路由进程,而不必关心所操作的记录存储在哪个shard上.

构建一个简单的Sharding Cluster

复制集是由一系列物理机器组成的,用一个机器作为主库,其他的机器作为从库,为了演示方便,在同一台物理机器上构建一个简单的sharding cluster.包括启动和配置服务器,路由进程等方法.

创建对应的文件夹

数据存放目录:
D:\program files\mongo\data\shard\sv0
D:\program files\mongo\data\shard\sv1
D:\program files\mongo\data\shard\config
日志存放目录:
D:\program files\mongo\logs\shard\sv0.log
D:\program files\mongo\logs\shard\sv1.log
D:\program files\mongo\logs\shard\config.log
D:\program files\mongo\logs\shard\route.log

启动shardserver[启动2个窗口]

mongod --shardsvr --port 8888 --dbpath=../data/shard/sv0 --logpath=../logs/shard/sv0.log --directoryperdb
mongod --shardsvr --port 8889 --dbpath=../data/shard/sv1 --logpath=../logs/shard/sv1.log --directoryperdb

如下图:


另起一个窗口

启动Config Server(新建窗口)

mongod --configsvr --port 6000 --dbpath=../data/shard/config --logpath=../logs/shard/config.log --directoryperdb

如图:

启动RouteProcess(新建窗口)

mongos --port 8000 --configdb localhost:6000 --logpath=../logs/shard/route.log --chunkSize 1

参数说明:

chunkSize用来指定chunk的大小(单位:MB),默认值为200

配置Sharding

使用mongo客户端登录路由控制器添加shard节点.

D:\program files\mongo\bin>mongo admin --port 8000
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:8000/admin
> db.runCommand({ addshard:"localhost:8888" })
{ "shardAdded" : "shard0000", "ok" : 1 }
> db.runCommand({ addshard:"localhost:8889" })
{ "shardAdded" : "shard0001", "ok" : 1 }
> db.runCommand({ enablesharding:"test" })
{ "ok" : 1 }
> db.runCommand({ shardcollection:"test.users", key:{ _id:1 }})
{ "collectionsharded" : "test.users", "ok" : 1 }
>
说明:
mongo admin --port 8000 表示连接到路由控制器的admin数据库.
db.runCommand({ addshard:"localhost:8888" }) 表示添加本地端口8888的shard server实例.
db.runCommand({ enablesharding:"test" })表示要在test数据库上执行分片,其中的test代表要分片的数据库.
db.runCommand({ shardcollection:"test.users", key:{ _id:1 }}) 设置要在test数据库的users表上分片,同时指明shard key是id这一列.

如图:

至此,一个完整的sharding环境部署完毕.

验证sharding

循环向test.users表中插入20万条数据,然后使用命令test.users.stats()查看表的分片情况.

> use test
switched to db test
> for(var i=1; i<200000; i++) db.users.insert({name:"user"+i, age:i, email:"dennisit@163.com" })
> db.users.stats()

如图:

新增Shard Server

启动一个新Shard Server进程,如下面代码所示.

D:\program files\mongo\data\shard\sv2

mongod --shardsvr --port 8887 --dbpath=../data/shard/sv2 --logpath=../logs/shard/sv2.log

配置新shard server.

D:\program files\mongo\bin>mongo admin --port 8000
MongoDB shell version: 1.8.1
connecting to: 127.0.0.1:8000/admin
> db.runCommand({ addshard:"localhost:8887"})
{ "shardAdded" : "shard0002", "ok" : 1 }

如图:


接下来看分片表状态,以验证新的shard server已生效.

> use test
switched to db test
> db.users.stats()
{"sharded" : true,"ns" : "test.users","count" : 599998,"size" : 50399116,"avgObjSize" : 83.99880666268888,"storageSize" : 102398720,"nindexes" : 1,"nchunks" : 42,"shards" : {"shard0000" : {"ns" : "test.users","count" : 233266,"size" : 19594344,"avgObjSize" : 84,"storageSize" : 47822848,"numExtents" : 9,"nindexes" : 1,"lastExtentSize" : 14495232,"paddingFactor" : 1,"flags" : 1,"totalIndexSize" : 9723904,"indexSizes" : {"_id_" : 9723904},"ok" : 1},"shard0001" : {"ns" : "test.users","count" : 230087,"size" : 19327336,"avgObjSize" : 84.00012169309869,"storageSize" : 33327616,"numExtents" : 8,"nindexes" : 1,"lastExtentSize" : 12079360,"paddingFactor" : 1,"flags" : 1,"totalIndexSize" : 9592832,"indexSizes" : {"_id_" : 9592832},"ok" : 1},"shard0002" : {"ns" : "test.users","count" : 136645,"size" : 11477436,"avgObjSize" : 83.99455523436643,"storageSize" : 21248256,"numExtents" : 7,"nindexes" : 1,"lastExtentSize" : 10066176,"paddingFactor" : 1,"flags" : 1,"totalIndexSize" : 7684096,"indexSizes" : {"_id_" : 7684096},"ok" : 1}},"ok" : 1
}
>

查看Sharding信息

printShardingStatus()

如图:

移除Shard Server

移除Shard Server,系统首先会将即将移除的Shard Server上的数据平均分配到其他Shard Server上,然后将这个Shard Server踢下线.

注意:移除Shard Server的操作对客户端完全是透明的,不影响用户正常使用,也不需要待机进行.

例如要移除8889端口的shard Server, 需要不停地调用以下命令来观察这个移除操作执行到哪里了.

db.runCommand({ "removeshard":"localhost:8889" );

移除过程中会出现3种状态.

状态一如图,表示移除的动作是刚刚开始.

状态二如图,”ongoing”表示移除已经开始

状态三如图,”completed”表示移除完成


使用 printShardingStatus();查看Sharding信息

判断是否是Sharding

通过执行 db.runCommand({ isdbgrid:1 })命令查看当前实例是否在Sharding环境中.

列出所有Shard Server

转载请注明出处:[http://www.cnblogs.com/dennisit/archive/2013/02/18/2916159.html]

转载于:https://www.cnblogs.com/dennisit/archive/2013/02/18/2916159.html

mongodb的sharding架构搭建相关推荐

  1. mongodb副本集架构搭建

    高可用性通常描述一个系统经过专门的设计,从而减少停工时间.保存其服务的高度连续可用性,MongoDB提供的主从复制机制保证了多个数据库的数据同步,这对实现数据库的容灾.备份.恢复.负载均衡都是有极大的 ...

  2. Mongodb的Replica Sets + Sharding架构

    MongoDB的Sharding机制解决了海量存储和动态扩容的问题,但离生产环境的高可靠,高可用还有距离,Sharding在单点出现故障时就无能为力了.但是MongoDB的副本集却可以很轻松的处理单点 ...

  3. MongoDB 分片(sharding)+副本集(replSet)集群搭建

    文章目录 MongoDB安装 Windows平台安装 1.下载 2.安装 3.启动MongoDB服务 4.进入MongoDB后台 Linux平台安装MongoDB 1.下载 2.安装 3.创建数据库目 ...

  4. mongodb分布式集群搭建手记

    一.架构简介 目标 单机搭建mongodb分布式集群(副本集 + 分片集群),演示mongodb分布式集群的安装部署.简单操作. 说明 在同一个vm启动由两个分片组成的分布式集群,每个分片都是一个PS ...

  5. mongodb linux下集群搭建

    mongodb的集群结构如上图 网上有个mongo3.0的集群例子: mongodb分布式集群搭建手记 - 美码师 - 博客园一.架构简介 目标 单机搭建mongodb分布式集群(副本集 + 分片集群 ...

  6. Android组件化打造知乎日报系列(一)—— 项目架构搭建

    Android组件化打造第三方知乎日报系列(一)-- 项目架构搭建 本节完整代码可以前往github查看,项目地址:github.com/N0tExpectEr- Android组件化打造知乎日报系列 ...

  7. asp.net mvc4三层架构搭建

    asp.net mvc4三层架构搭建,有需要的朋友可以参考下. 1.建立解决方案: 2.建立一个asp.net mvc4的基本项目WebApp作为三层架构中的UI层(表现层): 2.1.表现层中控制器 ...

  8. 03-iOS蓝牙架构搭建

    蓝牙架构的搭建 前言:笔者认为,如果只是单纯的传授大家代码怎么敲,那么大家很有可能在实际开发中难以运用.刚好本人曾经参与过多款智能硬件开发的架构搭建,本小节本人就现场带领大家开发出一个通用的蓝牙工具类 ...

  9. 美团点评基于MGR的CMDB高可用架构搭建之路【转】

    王志朋 美团点评DBA 曾在京东金融担任DBA,目前就职于美团点评,主要负责金融业务线数据库及基础组件数据库的运维. MySQL Group Replication(以下简称MGR),于5.7.17版 ...

最新文章

  1. 【微软亚洲研究院MSRA】招聘多模态方向算法实习生
  2. 百度、长沙加码自动驾驶,湖南阿波罗智行科技公司成立...
  3. 【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )
  4. 【多线程学习笔记】sychronized关键字底层原理、sychronized与ReentrantLock、volatile和synchronized
  5. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1039:判断数正负
  6. NOIP2015 D1 解题报告
  7. iir matlab 系数,手把手教你用matlab生成STM32官方IIR滤波器的系数
  8. spring cloud中gateway存在的意义是什么?
  9. 如何运行项目或工程中的单独java文件---找不到或无法加载主类”错误的原因
  10. gcc编译器下载各版本下载
  11. 使用ipop搭建TFTP、FTP传输文件
  12. Java IO 和 NIO的区别
  13. 老路MBA商学课|第002课:比较优势|我做的比你好,就应该我做吗?
  14. 一般试卷的纸张大小是多少_试卷标准字体大小是多少 考试试卷标准字体格式...
  15. python 卡方分布函数_推断统计分析(二):python验证三大抽样分布
  16. VS中的debug和releasse版本的区别
  17. DEFCON 26 | 利用传真功能漏洞渗透进入企业内网(Faxploit)
  18. oracle回撤,Oracle使用排列组合计算最大回撤幅度
  19. jQuery获取元素上一个、下一个、父元素、子元素
  20. [问题已处理]-alertmanager报错550 Mailbox unavailable or access denied

热门文章

  1. linux安装nsenter工具,Docker 使用nsenter工具进入容器的操作
  2. python 串行线程终止后还会执行下一个吗_多线程笔记
  3. 人工智能AI、机器学习和深度学习的区别
  4. mvc html安全检测,Spring MVC和HtmlUnit测试
  5. 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...
  6. RuntimeWarning: coroutine ‘ClientResponse.text‘ was never awaited self._context.run(self._callback)
  7. daad转换器实验数据_实验十一DAAD转换器.doc
  8. 超准中医体质测试 源码_可能是史上“最准”的抑郁症测试,试试你有没有患上抑郁症...
  9. mysql数字辅助表_关于数字的经典SQL编程问题:数字辅助表
  10. win32_bios 的对象编辑器无法保存对象_技能编辑器设计文档