MongoDB分片集群——集群组件概述

分片集群组件

首先需要记住,分片集群的组件包括:mongos、分片(shard)、config server。

生产环境配置(Production Configuration)

在生产集群中,确保数据是冗余的并且系统具有高可用性。对于生产分片集群部署,可以考虑以下的方式:

  • 将配置服务器(config server)部署为三成员副本集
  • 将每一个分片部署为三成员副本集
  • 部署一个或者多个mongos 路由

分散部署副本集

如果可能,请考虑在适合作为灾难恢复位置的站点中部署每个副本集的一个成员。

备注

跨两个数据中心分布副本集成员比单个数据中心更有优势。在两个数据中心分布中:

  • 如果其中一个数据中心出现故障,则数据仍可用于读取,这与单个数据中心分布不同。
  • 如果具有少数成员的数据中心出现故障,副本集仍然可以提供写操作和读操作。
  • 然而,如果具有多数成员的数据中心出现故障,则副本集变为只读。

如果有可能,将成员分布在至少三个数据中心上。对于配置服务器副本集(config server replica sets CSRS),最佳实践是分布在三个(或更多个,取决于成员数量)中心。如果第三个数据中心的成本过高,一种分配可能性是在两个数据中心之间平均分配数据承载成员,如果你的公司政策允许,可以将剩余成员存储在云中。

分片数目(number of shards)

分片(sharding)需要至少两个分片(shards)来分发分片数据。如果你计划在不久的将来启用分片,单分片分片集群可能很有用,但在部署时不需要。

mongos的数量和分布

部署多个mongos路由器支持高可用性和可扩展性。一种常见的模式是在每个应用程序服务器上放置一个mongos。在每个应用服务器上部署一个mmongos路由器可以减少应用程序和路由器之间的网络延迟。

或者,你可以在专用主机上放置一个mongos路由器。大型部署受益于这种方法,因为它将客户端应用程序服务器的数量和mongos实例的数量分离。这可以更好地控制mongod实例服务的连接数。

在它们自己的主机上安装mongos实例可以让这些实例使用更多的内存。内存不会和mongod实例共享。可以使用主分片来托管mongos路由器,但请注意,内存争用可能会成为大型部署的问题。

部署中可以拥有的mongos路由器的数量没有限制。然而,由于mongos路由器经常与你的配置服务器(config server)通信,因此随着路由器数量增加,请密切监视配置服务器的性能。如果你发现配置服务器的性能下降,限制部署中mongos路由器的数量可能是有益的。

下面是一个在生产环境中常见的分片集群架构示意图:

开发环境配置(development configuration)

对于开发和测试,你可以部署具有最少组件的分片集群,这些分片集群具有以下组件:

  • 具有一个成员的副本集配置服务器
  • 至少一个分片作为单成员副本集
  • 一个mongos实例

分片

分片包含分片集群的分片数据子集,集群的分片一起保存集群的整个数据集。

自V3.6,必须将分片部署为副本集以提供冗余和高可用性。

用户、客户端或应用程序只能直接连接到分片以执行本地管理和维护操作。

对单个分片执行查询仅返回数据子集。连接到mongos以执行集群级别的操作,包括读取或写入操作。

主分片(Primary Shard)

分片集群中的每个数据库都有一个主分片,其中包含该数据库的所有非分片集合。每一个数据库都有它子集的主分片,这个主分片和副本集的主分片没有关系。

mongos在创建新数据库时通过选择集群中数量最少的分片来选择主分片。mongos使用 listDatabases 命令返回的 totalSize 字段作为选择标准的一部分。

要更改数据库的主分片,使用 movePrimary 命令。迁移主分片的过程可能需要很长时间才能完成,并且在完成之前不应访问与该数据库关联的集合。根据要迁移的数据量,迁移可能会影响整个集群操作。在尝试更改主分片之前,请考虑对集群操作和网络负载的影响。

当您使用以前用作副本集的分片部署新的分片集群时,所有现有数据库将继续驻留在其原始副本集上。随后创建的数据库可以驻留在集群中的任何分片上。

分片状态(Shard Status)

在mongo shell使用命令 sh.status() 来查看集群的概览。该报告包括哪个分片是数据库的主要分片以及跨分片的块分布。

分片集群的安全性(Shard Cluster Security)

使用 *内部/成员身份验证(Internal/Membership Authtication)*来强制执行集群内安全性并防止未经授权的集群组件访问集群。 你必须使用适当的安全设置启动集群中的每个 mongod ,以强制执行内部身份验证。

分片本地用户(Shard Local Users)

每个分片都支持基于角色的访问控制(Role-Based Access Control,RBAC),以限制对分片数据和操作的未经授权的访问。使用 --auth 选项启动副本集中的每个 mongod 以强制执行 RBAC,或者,为集群内安全实施 内部/成员身份验证 还可以通过 RBAC 启用用户访问控制。

每一个分片都有自己的分片本地用户(shard-local users),这些用户不能用于其他分片,也不能用于通过mongos连接到集群。

配置服务器(Config Server)

配置服务器存储了分片集群的元数据。元数据反映了分片集群中所有数据和组件的状态和组织。元数据包括每个分片上的块列表以及定义块的范围。

mongos 实例缓存这些数据并借助这些数据来路由读写操作至正确的分片。当集群的元数据发生修改时,例如块拆分(Chunk Split)或者添加分片,mongos 会更新缓存数据。分片也通过配置服务器读块的元数据。

配置服务器还存储身份验证配置信息,例如基于角色的访问控制或集群的内部身份验证设置。

MongoDB还使用配置服务器来管理分布式锁。

每一个分片集群都必须有自己的配置服务器。不要为不同的分片集群使用相同的配置服务器。

警告

在配置服务器上执行的管理操作可能会对分片集群的性能和可用性产生重大影响。根据受影响的配置服务器的数量,集群可能会在一段时间内处于只读状态或离线状态。

副本集配置服务器(Replica Set Config Servers)

自MongoDB v3.2,分片集群的配置服务器可以部署为副本集(CSRS),而不是三个镜像配置服务器(SCCC)。为配置服务器使用副本集可以提高配置服务器之间的一致性,因为MongoDB可以利用标准副本集读取和写入配置数据协议。此外,为配置服务器使用副本集允许分片集群拥有超过3个配置服务器,因为副本集最多可以有50个成员。要将配置服务器部署为副本集,配置服务器必须运行WiredTiger存储引擎。

在V3.4,MongoDB移除了对镜像配置服务器(SCCC)的支持。

当用于配置服务器时,以下限制适用于副本集配置:

  • 必须有零个仲裁者;
  • 必须不存在延迟成员;
  • 必须建立索引(即,任何成员都不应该将 members[n]。buildIndexes 设置为false

配置服务器上的读写操作

adminconfig 数据库存在于配置服务器上。

写入配置服务器(writes to config server)

admin 数据库包含与身份验证和授权相关的集合以及其他 system.* 供内部使用的集合。

config 数据库包含了存储有分片集群元数据的集合。当元数据发生修改时,例如块迁移(chunk migration)或者 块拆分(chunk split)时,MongoDB向 config 数据库写入。

用户在正常运维过程中应避免直接写入配置数据库。

当向配置服务器写入时,MongoDB使用 majority 写关注。

从配置服务器读取(reads from config server)

MongoDB从 admin 数据库中读取身份验证和授权数据以及其他内部用途。

MongoDB在 mongos 启动或元数据发生更改之后(例如在块迁移之后)从配置数据库中读取。分片还从配置服务器读取块元数据。

当从副本集得配置服务器读取时,MongoDB使用 majority 等级得读关注。

配置服务器得可用性(Config Server Avalibility)

如果配置服务器得副本集失去了主节点且不能选举出一个主节点,那么配置服务器副本集元数据将变为只读状态。你仍然可以从分片读写数据,但是在副本集选出主节点之前,不能进行块迁移或者块拆分。

在分片集群中,mongod 和 mongos 实例监控分片集群中得副本集(例如,分片副本集、配置服务器副本集)。

如果所有配置服务器都不可用,则集群可能无法运行。为确保配置服务器保持可用和完好无损,配置服务器得备份至关重要。config server上得数据与集群中存储得数据相比是很小的,并且config server的活动负载相对较低。

对于V 3.2分片集群,如果连续尝试监控config server副本集不成功的次数超过 replMonitorMaxFailedChecks 参数值,则起监控作用的mongos和mongod实例将无法使用,直到你重新启动实例。

分片集群元数据(Sharded Cluster Metadata)

配置服务器在 Config 数据库存储元数据。

通常,你永远不应该直接编辑配置数据的内容,配置数据库包含以下集合:

  • changelog
  • chunks
  • collections
  • databases
  • lockpings
  • locks
  • mongos
  • settings
  • shards
  • version

分片集群安全(Shard Cluster Security)

使用 内部/成员身份验证来强制执行集群内安全性并防止未经授权的集群组件访问集群。你必须使用适当的安全设置启动集群中的每个mongod,以强制执行内部身份验证。

mongos

MongoDB的mongos实例将查询和写入操作路由到分片集群中的分片。从应用程序的角度来说,mongos为分片集群提供了唯一的接口。应用程序从不直接与分片连接或通信。

mongos通过缓存来自配置服务器的元数据来跟踪哪些数据在哪个分片上。mongos使用元数据将操作从应用程序和客户端路由到mongod实例。mongos没有持久化状态,消耗最少的系统资源。

最常见的做法是在与应用程序相同的系统上运行momngos实例,但您可以在分片或其他专用资源上维护mongos实例。

路由和结果过程(Routing & Results Process)

mongos实例通过以下方式将查询路由到集群:

  • 确定必须接受查询的分片列表;
  • 在所有目标分片上建立游标。

然后mongos合并来自每个目标分片的数据并返回结果文档。在mongos检索结果之前,对每个分片执行某些查询修饰符,例如排序。

自V3.6进行了改变,对于发生在多分片的聚合操作,如果操作不需要在数据库的分片上运行,这些操作可能会将结果路由回mongos,然后合并结果。

有两种情况下聚合管道不能在mongos上运行:

第一种情况是在拆分管道(split pipleline)的聚合部分包含必须在主分片上运行的阶段时,例如,如果 $lookup 需要访问与运行聚合的分片集合相同的数据库中的非分片集合,则合并必须在主分片上运行。

第二种情况是拆分管道的聚合部分包含可能将临时数据写入磁盘的阶段,例如 $group ,并且客户端已经指定 allowDiskUse : true 。在这种情况下,假设合并管道中没有其他阶段需要主分片,则合并将在聚合所针对的分片集中随机选择的分片上运行。

有关聚合工作如何在分片集群的组件之间拆分的更多信息,使用 eaplain:true作为aggregate的参数调用,返回的数据包含3个json对象。mergeType 显示合并阶段发生的置(``primaryShard anyShard mongos)。 splitPipeline显示管道上的哪些操作已在各个分片上运行。shards` 显示每个分片所做的工作。

在某些情况下,当分片键或分片键的前缀是查询的一部分时,mongos会执行有针对性的操作,将查询路由到集群中的分片子集。

mongos对不包含分片键的查询执行广播操作(broadcast operation),将查询路由到集群中的所有分片。某些包含分片键的查询仍然可能导致广播操作,具体取决于集群中数据的分布和查询的选择性。

自V4.4版本,mongos可以支持对冲读取以最小化延迟。

mongos如何处理查询修饰符(How mongos handles query modifiers)

Sorting

如果查询结果未排序,则mongos实例会打开一个结果游标,该游标"循环"来自分片上的所有游标。

Limits

如果查询使用 limit() 游标方法限制结果集的大小,则mongos实例将该限制(limit)传给分片,然后在将结果返回给客户端之前将限制重新应用于结果。

Skips

如果查询使用 skip() 游标方法指定要跳过的记录数,则mongos无法将跳过的条目数(skip)传递给分片,而是从分片中检索未跳过的结果并在组装完成结果时跳过适当数量的文档。

当和 limit() 结合使用时,mongos会将 limit 加上 skip() 的值传递给分片以提高这些操作的效率。

相关推荐
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
科技小花7 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸7 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain7 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希8 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神8 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员8 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java8 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿9 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴9 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存