`
shingo7
  • 浏览: 19358 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

MongoDB官方文档翻译系列之--- 分片集群下的查询路由

阅读更多

更多关于MongoDB的技术分享请关注我的公众号:mongodb_side

 

github版本 - 7a02f29211e96977765f2461253d3fa99b6a3def

根据2015-01-14官方文档快照翻译(v2.6.7 & v2.8.0-rc4

翻译 shingo(6623662005@163.com


 

在分片集群环境中,MongoDB通过 mongos实例来路由读写操作。从应用的角度来说,mongos 是访问集群的唯一入口,应用程序不能直接连接集群环境中的分片节点。

 

通过缓存config节点的元数据信息, mongos 可以跟踪到数据在哪个分片上。mongos利用这些元数据信息将应用和客户端的操作路由到具体的mongod实例。mongos 不提供持久化,并且只消耗很少的系统资源。

 

最常见的做法是将mongos 实例和应用服务器部署在同一环境下,当然你也可以将mongos 实例和分片节点放在一起,或者用专门的资源来运行它。

 

注意

 

2.1版更新。

 

一些使用aggregate 命令的聚合操作(即db.collection.aggregate()) ,会使得mongos 实例较之前的版本需要更多CPU资源。如果你的分片环境中大量使用了aggregation框架,那么你可能要更改部署架构来应对这部分性能上的调整。

 

路由过程

 

mongos如何决定由哪些分片来接收一个查询

 

mongos 路由一个查询到集群中有两步:

  1. 确定接收查询的 分片列表。

  2. 为所有目标分片建立一个游标。

     

在一些情况下,例如当 shard key 或shard key的某个前辍部分被当做查询条件的一部分时, mongos 会将查询路由到分片集的某个子集下,其它时候,mongos 将查询引向所有包含目标表数据的分片下。

 

(译者注:这里所说的shard key的某个前辍部分是指如果shard key是复合key,那么从第一个字段开始按序往后的子集,这个子集对查询时尽可能精确的定位分片有很大帮助,子集越大定位越准。)

 

示例:

有下面的shard key:

{ zipcode: 1, u_id: 1, c_date: 1 }

 

根据集群中具体的chunk分布情况,mongos 可能会将查询路由到一部分分片上,如果查询包括以下字段:

{ zipcode: 1 }

{ zipcode: 1, u_id: 1 }

{ zipcode: 1, u_id: 1, c_date: 1 }

 

Mongos如何处理查询修改器

 

如果查询结果不需要排序,mongos会开启一个结果游标,从各个目标分片的游标“轮循”结果。

 

2.0.5版更新:在2.0.5之前的版本中, mongos 一个接一个将游标从头滑到尾。

 

(译者注:2.0.5版之前mongos会循环所有目标分片返回的数据集,每一个数据库通过游标从头至尾;从2.0.5开始,mongos开启一个总的游标,每个数据集拿一条数据,循环往复。)

 

如果查询操作用sort()方法指定了排序规则, mongos将$orderby选项传递给各个目标分片。在通过mongos将结果集返回客户端之前,数据库的主shard会接收所有结果数据,确定后执行合并排序。

 

如果查询操作用limit()限制结果集的大小, mongos将这个限制传递给各个目标分片,在返回客户端之前再将整个结果集缩减到指定大小。

 

(译者注:如果数据够大,假设有n个目标分片,limit的参数为x,mongodb会至少扫描n*x条数据。 不过在现实的场景中,limit的需求一般为分页,或是专门被指定的一个有限集,这个数在多数情况下不会太大。)

 

如果查询操作用 skip()方法指定要忽略的结果个数,mongos 不会将这个忽略数传递给目标分片, 而是从各分片检索出符合查询条件的所有结果,在组装最终结果集时再忽略指定数目的数据。但是如果它和limit()方法联合使用, mongos将 limit 的值加上skip() 方法的值传递给目标分片,以此来提升这些操作的效率。

 

(译者注:limit+skip = 每个分片上最终limit值,这也是为了规避查询条件的不同,以及多种因为数据分布引发的结果数据不准确的可能性。 Mongodb的翻页查询随着skip数量的增加性能会越来越差,其实有很多办法可以规避这种查询,比如在主键,或者例用某个字段来精确定位某一页的值范围。)

 

检测连向mongos的连接

 

要检测你客户端连接的mongodb实例是否是mongos,可以使用isMaster 命令。当客户端连上 mongosisMaster 返回一个带有msg 字段的文档,且字段值为isdbgrid,类似下面这样:

 

{

"ismaster" : true,

"msg" : "isdbgrid",

"maxBsonObjectSize" : 16777216,

"ok" : 1

}

 

如果连接的是mongod实例,返回的文档不会包含isdbgrid 字符串。

 

广播操作和目标操作

 

一般来说,分片环境里的操作有以下两类:

  • 向集群内所有包含某个表数据的分片广播

  • 基于shard key,有目标的选定某一个分片或某一部分分片

 

为了获得最佳的性能,尽可能的使用目标操作。而对于一些需要广播到所有分片的操作,如果可以的话在条件里加上shard key让它转变为目标操作。

 

广播操作

mongos 会将查询广播到所有包含目标表数据的分片上,除非mongos 能搞清楚哪个或哪些分片上存储着目标数据。

 

批量更新操作属于广播操作。

remove()操作一般也是广播操作,除非条件中指定了完整的shard key。

 

目标操作

 

所有insert()操作会定位到具体的一个分片。

所有单个update() (包括upsert) 和 remove()也会定位到单独的分片。

 

重要

指定了justOne 或 multi:false属性的,针对单个分片的update()和 remove() 操作,查询条件中必须包含shard key或_id字段,否则方法会报错。

 

对于包含shard key或包含一部分shard key的查询, mongos 可以定位到具体的某个或多个分片上。这里提到的“一部分shard key”是指从shard key的第一个字段开始依次往后的前辍部分。举个例子,如果有下面的shard key:

{ a: 1, b: 1, c: 1 }

 

mongos 能够通过查询条件中完整的shard key或者下面两个条件来定位分片:

{ a: 1 }

{ a: 1, b: 1 }

 

 

由于数据分布的不同以及查询的多样性,mongos 可能仍然会连接到多个分片 [1]来完成查询。

 

[1]如果真的是因为数据分布上的原因,即使查询中包含shard key,mongos 也会将查询路由到所有分片。

 

分片的和未分片的数据

 

分片是基于collection级的,你可以在同一个数据库内对多个collection做分片,或者对多个数据库开库分片功能。[2]但是在生产环境中,一般会有一些数据库和collection使用了分片功能,而其它未开启分片的数据库和collection会存储在单个分片上。

 

不管你的分片集群环境的数据架构如何,一定要确保所有操作都通过mongos路由到分片上。即使你的操作针对的是未分片的数据,影响不了分片数据,也要通过mongos 来路由。

 

 

[2] 当配置分片功能时,需要使用enableSharding命令为数据库开启分片功能。这个操作也仅仅是为了让该数据库下的collection在分片时能执行shardCollection命令。

分享到:
评论

相关推荐

    mongodb-driver-core-4.2.3-API文档-中文版.zip

    包含翻译后的API文档:mongodb-driver-core-4.2.3-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.mongodb:mongodb-driver-core:4.2.3; 标签:mongodb、driver、core、中文文档、jar包、java; 使用方法:解压...

    mongodb-driver-sync-4.2.3-API文档-中英对照版.zip

    包含翻译后的API文档:mongodb-driver-sync-4.2.3-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.mongodb:mongodb-driver-sync:4.2.3; 标签:mongodb、driver、sync、中英对照文档、jar包、java; ...

    MongoDB Community(mongodb-org-server-5.0.8-1.el7.x86_64.rpm)

    MongoDB Community Server(mongodb-org-server-5.0.8-1.el7.x86_64.rpm)适用于RedHat / CentOS 7.0 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。...

    mongodb-linux-aarch64-ubuntu1804-4.2.5.tgz

    1. **下载安装包**:访问MongoDB官网或通过wget命令从官方镜像站点下载`mongodb-linux-aarch64-ubuntu1804-4.2.5.tgz`到你的服务器。 2. **解压文件**:使用tar命令解压下载的tgz文件: ``` tar -zxvf mongodb-...

    spring-data-mongodb-3.1.8.jar中文-英文对照文档.zip

    ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ...

    mongodb-driver-sync-4.2.3-API文档-中文版.zip

    包含翻译后的API文档:mongodb-driver-sync-4.2.3-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.mongodb:mongodb-driver-sync:4.2.3; 标签:mongodb、driver、sync、中文文档、jar包、java; 使用方法:解压...

    mongodb分片集群增加acl

    在大数据时代背景下,为了提高数据库的性能和可用性,采用分片技术是一种常见...当然,在实践中还需要注意错误处理、监控和性能调优等其他重要方面,这些知识可以通过继续深入学习MongoDB的官方文档和社区资源来获得。

    centos7下mongodb4.0.6分片集群搭建-单体升级成绩群方案.pdf

    3. **路由服务(Mongos)**:作为客户端与分片之间的代理,负责数据路由和查询分发,根据分片键将请求转发到正确的分片。 4. **配置服务器(Config Server)**:存储关于分片集群的元数据,如分片信息、副本集状态...

    mongodb-linux-s390x-rhel72-4.2.0.tgz

    - 解压“mongodb-linux-s390x-rhel72-4.2.0.tgz”后,通常会得到一系列可执行文件和配置文件,需要根据MongoDB官方文档来正确配置环境变量,如`PATH`,并创建数据目录。 - MongoDB的启动和管理可以通过命令行工具...

    mongodb-driver-core-4.2.3-API文档-中英对照版.zip

    包含翻译后的API文档:mongodb-driver-core-4.2.3-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.mongodb:mongodb-driver-core:4.2.3; 标签:mongodb、driver、core、中英对照文档、jar包、java; ...

    mongodb-windows安装包: mongodb-compass-1.31.2-win32-x64.msi

    mongodb-windows安装包: mongodb-compass-1.31.2-win32-x64.msi 打开直接安装

    mongodb linux 32位安装包 mongodb-linux-i686-3.0.5

    MongoDB 是一个高性能、...由于MongoDB的版本更新较快,不同版本之间可能存在差异,因此在实际操作时,建议参照官方文档或最新的安装指南。同时,确保系统满足MongoDB的硬件和软件需求,例如内存、磁盘空间和依赖库。

    MongoDB(mongodb-org-server-5.0.4-1.el7.x86_64.rpm)

    MongoDB Community Server(mongodb-org-server-5.0.4-1.el7.x86_64.rpm)适用于RedHat / CentOS 7.0 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。...

    MongoDB Community(mongodb-linux-aarch64-ubuntu1804-5.0.8.tgz)

    MongoDB Community Server(mongodb-linux-aarch64-ubuntu1804-5.0.8.tgz)适用于Ubuntu 18.04 Arm芯片, MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决...

    mongodb-linux-i686-2.0.4

    2. 分布式架构:MongoDB支持水平扩展,可以通过复制集和分片集群实现高可用性和可扩展性。复制集确保数据冗余和故障恢复,而分片则将数据分布在多个服务器上以处理大量数据。 3. 自动Sharding:MongoDB的分片功能...

    mongodb-linux-i686-3.2.20(Linux 32位)

    在"mongodb-linux-i686-3.2.20"这个版本中,我们关注的是针对Linux 32位系统的MongoDB部署。 MongoDB在Linux平台上的安装和配置通常涉及以下步骤: 1. **下载与解压**:首先,你需要下载适合32位Linux系统的...

    mongoDB-CURD操作-----JAVA

    了解这些基础后,你可以进一步探索更多高级特性,如索引、副本集、分片等,以便在实际项目中更高效地利用MongoDB。记住,实践是学习的最佳途径,动手尝试这些示例,结合MongoDB_Demo中的代码,你会更快掌握MongoDB与...

    mongodb-windows-x86-64-6.0.5最新稳定版本

    此“mongodb-windows-x86-64-6.0.5”是针对Windows 64位操作系统的最新稳定版本,旨在为用户提供了高效且稳定的数据库服务。 1. MongoDB的特点: - 分布式:MongoDB支持分布式部署,可以构建多节点复制集和分片...

    mongodb-windows-64mongodb-windows-64mongodb-windows-64mongodb-wi

    mongodb-windows-64mongodb-windows-64mongodb-windows-64

    mongodb-linux-x86_64-4.0.8.tgz

    - **mongos**:在分片集群中作为路由服务,处理客户端请求并将它们转发到适当的分片。 - **mongodump/mongorestore**:数据备份和恢复工具,用于在不运行MongoDB实例的情况下迁移数据。 3. **MongoDB的数据模型**...

Global site tag (gtag.js) - Google Analytics