• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >MongoDB > 深入理解MongoDB分片的管理

深入理解MongoDB分片的管理

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了mongodb分片,mongodb 分片原理,mongodb分片集群,mongodb 分片配置,mongodb如何分片等相关知识,希望本文的分享对您有所帮助

前言

在MongoDB(版本 3.2.9)中,分片集群(sharded cluster)是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片(shard)上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集。分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量。

数据集被拆分成数据块(chunk),每个数据块包含多个doc,数据块分布式存储在分片集群中。MongoDB负责追踪数据块在shard上的分布信息,每个分片存储哪些数据块,叫做分片的元数据,保存在config server上的数据库 config中,一般使用3台config server,所有config server中的config数据库必须完全相同。通过mongos能够直接访问数据库config,查看分片的元数据;mongo shell 提供 sh 辅助函数,能够安全地查看分片集群的元数据信息。

对任何一个shard进行查询,只会获取collection在当前分片上的数据子集,不是整个数据集。Application 只需要连接到mongos,对其进行的读写操作,mongos自动将读写请求路由到相应的shard。MongoDB通过mongos将分片的底层实现对Application透明,在Application看来,访问的是整个数据集。

一,主分片

在分片集群中,不是每个集合都会分布式存储,只有使用sh.shardCollection()显式将collection分片后,该集合才会分布式存储在不同的shard中。对于非分片集合(un-sharded collection),其数据只会存储在主分片(Primary shard)中,默认情况下,主分片是指数据库最初创建的shard,用于存储该数据库中非分片集合的数据。每个数据库都有一个主分片。

Each database in a sharded cluster has a primary shard that holds all the un-sharded collections for that database. Each database has its own primary shard.

例如,一个分片集群有三个分片:shard1,shard2,shard3,在分片shard1创建一个数据库blog。如果将数据库bolg分片,那么MongoDB会自动在shard2,shard3上创建一个结构相同的数据库blog,数据库blog的Primary Shard是Shard1。

图示,Collection2的主分片是ShardA。

使用 movePrimary命令变更数据库默认的Primary shard,非分片集合将会从当前shard移动到新的主分片。

db.runCommand( { movePrimary : "test", to : "shard0001" } )
</div>

在使用movePrimary命令变更数据库的主分片之后,config server中的配置信息是最新的,mongos缓存的配置信息变得过时了。MongoDB提供命令:flushRouterConfig 强制mongos从config server获取最新的配置信息,刷新mongos的缓存。

db.adminCommand({"flushRouterConfig":1})
</div>

二,分片的元数据

不要直接到config server上查看分片集群的元数据信息,这些数据非常重要,安全的方式是通过mongos连接到config数据查看,或者使用sh辅助函数查看。

使用sh辅助函数查看

sh.status()
</div>

连接到mongos查看config数据库中的集合

mongos> use config
</div>

1,shards 集合保存分片信息

db.shards.find()
</div>

shard的数据存储在host指定的 replica set 或 standalone mongod中。

{
 "_id" : "shard_name",
 "host" : "replica_set_name/host:port",
 "tag":[shard_tag1,shard_tag2] 
}
</div>

2,databases集合保存分片集群中所有数据库的信息,不管数据库是否分片

db.databases.find()
</div>

如果在数据库上执行sh.enableSharding(“db_name”) ,那么字段partitioned字段值就是true;primary 字段指定数据库的主分片(primary shard)。

{
 "_id" : "test",
 "primary" : "rs0",
 "partitioned" : true
}
</div>

3,collections集合保存所有已分片集合的信息,不包括非分片集合(un-sharded collections)

key是:分片的片键

db.collections.find()

{
 "_id" : "test.foo",
 "lastmodEpoch" : ObjectId("57dcd4899bd7f7111ec15f16"),
 "lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
 "dropped" : false,
 "key" : {
  "_id" : 1
 },
 "unique" : true
}
</div>

4,chunks 集合保存数据块信息,

ns:分片的集合,结构是:db_name.collection_name

min 和 max: 片键的最小值和最大值

shard:块所在的分片

db.chunks.find()

{
 "_id" : "test.foo-_id_MinKey",
 "lastmod" : Timestamp(1, 1),
 "lastmodEpoch" : ObjectId("57dcd4899bd7f7111ec15f16"),
 "ns" : "test.foo",
 "min" : {
  "_id" : 1
 },
 "max" : {
  "_id" : 3087
 },
 "shard" : "rs0"
}
</div>

5,changelog集合记录分片集群的操作,包括chunk的拆分和迁移操作,Shard的增加或删除操作

what 字段:表示操作的类型,例如:multi-split表示chunk的拆分,

"what" : "addShard",
"what" : "shardCollection.start",
"what" : "shardCollection.end", 
"what" : "multi-split",
</div>

6,tags 记录shard的tag和对应的片键范围

{
 "_id" : { "ns" : "records.users", "min" : { "zipcode" : "10001" } },
 "ns" : "records.users",
 "min" : { "zipcode" : "10001" },
 "max" : { "zipcode" : "10281" },
 "tag" : "NYC"
}
</div>

7,settings 集合记录均衡器状态和chunk的大小,默认的chunk size是64MB。

{ "_id" : "chunksize", "value" : 64 }
{ "_id" : "balancer", "stopped" : false }
</div>

8,locks 集合记录分布锁(distributed lock),保证只有一个mongos 实例能够在分片集群中执行管理任务。

mongos在担任balancer时,会获取一个分布锁,并向config.locks中插入一条doc。

The locks collection stores a distributed lock. This ensures that only one mongos instance can perform administrative tasks on the cluster at once. The mongos acting as balancer takes a lock by inserting a document resembling the following into the locks collection.

{
 "_id" : "balancer",
 "process" : "example.net:40000:1350402818:16807",
 "state" : 2,
 "ts" : ObjectId("507daeedf40e1879df62e5f3"),
 "when" : ISODate("2012-10-16T19:01:01.593Z"),
 "who" : "example.net:40000:1350402818:16807:Balancer:282475249",
 "why" : "doing balance round"
}
</div>

三,删除分片

删除分片时,必须确保该分片上的数据被移动到其他分片中,对于以分片的集合,使用均衡器来迁移数据块,对于非分片的集合,必须修改集合的主分片。

1,删除已分片的集合数据

step1,保证均衡器是开启的

sh.setBalancerState(true);
</div>

step2,将已分片的集合全部迁移到其他分片

use admin
db.adminCommand({"removeShard":"shard_name"})
</div>

removeShard命令会将数据块从当前分片上迁移到其他分片上去,如果分片上的数据块比较多,迁移过程可能耗时很长。

step3,检查数据块迁移的状态

use admin
db.runCommand( { removeShard: "shard_name" }
  


 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 深入理解MongoDB分片的管理
  • MongoDB的分片集群基本配置教程
  • MongoDB分片测试
  • Mongodb 删除添加分片与非分片表维护
  • MongoDB入门教程之分片技术详解

相关文章

  • 2017-05-11Windows下MongoDB配置用户权限实例
  • 2017-05-11MongoDB服务端JavaScript脚本使用方法
  • 2017-05-11mongodb设置后台运行的方法
  • 2017-09-02Mongo集群搭建
  • 2017-05-11mongodb添加arbiter节点的方法示例
  • 2017-05-11mongodb 3.2.5安装详细过程
  • 2017-05-11MongoDB教程之入门基础知识
  • 2017-05-11MongoDB在不同主机间复制数据库和集合的教程
  • 2017-05-11python实现爬虫数据存到 MongoDB
  • 2017-05-11MongoDB快速入门笔记(三)之MongoDB插入文档操作

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MongoDB的查询方法
    • 阿里云CentOS7安装Mongodb教程
    • MongoDB简介 MongoDB五大特色
    • MongoDB的聚合框架Aggregation Framework入门学习教程
    • MongoDB导出查询结果到文件例子
    • centos yum 安装 mongodb 以及php扩展
    • MongoDB各种查询操作详解
    • MongoDB中的一些坑(最好不要用)
    • MongoDB学习笔记—Linux下搭建MongoDB环境
    • MongoDB的mongo shell常用操作方法及操作脚本笔记

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有