对分片群集进行故障排除

在本页面

本页介绍了对sharded cluster部署进行故障排除的常见策略。

应用服务器或 mongos 实例不可用

如果每个应用程序服务器都有自己的mongos实例,则其他应用程序服务器可以 continue 访问数据库。此外,mongos个实例不保持持久状态,并且它们可以重新启动并变为不可用状态而不会丢失任何状态或数据。 mongos实例启动时,它将检索config database的副本并可以开始路由查询。

一个单一的 mongod 在碎片中变得不可用

Replica sets提供high availability用于分片。如果不可用的mongodprimary,则副本集将elect一个新的主副本。如果不可用的mongodsecondary,并且断开连接,则主服务器和辅助服务器将 continue 保存所有数据。在三成员副本集中,即使集合中的单个成员发生灾难性故障,其他两个成员也具有数据的完整副本。 [1]

始终调查可用性中断和故障。如果系统是不可恢复的,请更换它并尽快创建副本集的新成员,以替换丢失的冗余。

[1]如果不可用的辅助服务器在仍具有当前操作日志条目的同时变为可用,则可以使用常规replication process赶上该集合的最新状态。否则,它必须执行initial sync

分片的所有成员均不可用

在分片群集中,mongodmongos实例监视分片群集中的副本集(例如,分片副本集,配置服务器副本集)。

如果副本集分片的所有成员均不可用,则该分片中保存的所有数据均不可用。但是,所有其他分片上的数据将保持可用,并且可以对其他分片进行数据读写。但是,您的应用程序必须能够处理部分结果,并且您应该调查中断的原因并尝试尽快恢复碎片。

配置服务器副本集成员不可用

在版本 3.2 中进行了更改:从 MongoDB 3.2 开始,可将分片群集的配置服务器部署为replica set。副本集配置服务器必须运行WiredTiger 存储引擎。 MongoDB 3.2 不赞成将三个镜像mongod实例用于配置服务器。

Replica sets为配置服务器提供high availability。如果不可用的配置服务器是primary,则副本集将elect一个新的主服务器。

如果副本集配置服务器丢失其主服务器并且无法选择主服务器,则群集的元数据将变为只读。您仍然可以从分片读取和写入数据,但是只有主数据库可用之前,不会发生chunk migrationchunk splits

Note

在两个数据中心之间分布副本集成员可提供优于单个数据中心的好处。在两个数据中心分布中,

  • 如果其中一个数据中心发生故障,则与单个数据中心分发不同,该数据仍可读取。

  • 如果具有少数成员的数据中心发生故障,则副本集仍然可以同时执行写操作和读操作。

  • 但是,如果具有大多数成员的数据中心发生故障,则副本集将变为只读。

如果可能,请在至少三个数据中心中分配成员。对于配置服务器副本集(CSRS),最佳实践是分布在三个(或更多,取决于成员的数量)中心中。如果第三个数据中心的成本过高,则一种分配可能性是在公司 Policy 允许的情况下,在两个数据中心之间平均分配数据承载成员,并将其余成员存储在云中。

Note

首次启动sharded cluster时,所有配置服务器必须正在运行且可用。

MongoDB 3.2

在分片群集中,mongodmongos实例监视分片群集中的副本集(例如,分片副本集,配置服务器副本集)。

如果mongos实例或分片成员无法访问配置服务器副本集的成员,请执行以下操作:

  • 对于 MongoDB 3.2.0-3.2.9,

但是,在这种情况下,可以通过在启动以下实例时将replMonitorMaxFailedChecks设置为值2147483647来避免重新启动mongos或分片副本集成员mongod

Important

重新启动后参数设置不会保留。

db.adminCommand( { setParameter: 1, 'replMonitorMaxFailedChecks': 2147483647 } )
  • 对于 MongoDB 3.2.10 或更高版本的 3.2 系列,

光标由于配置数据过旧而失败

当一个或多个mongos实例尚未从config database更新集群元数据的缓存时,查询将返回以下警告:

could not initialize cursor across all shards because : stale config detected

该警告不应传播回您的应用程序。该警告将一直重复,直到所有mongos实例刷新其缓存为止。要强制实例刷新其缓存,请运行flushRouterConfig命令。

分片键和群集可用性

选择shard key时,最重要的注意事项是:

  • 确保 MongoDB 能够在各个分片之间平均分配数据,并且

  • 在整个集群上扩展写入,以及

  • 以确保mongos可以将大多数查询隔离到特定的mongod

Furthermore:

  • 每个分片应为replica set,如果特定的mongod实例失败,则副本集成员将选择另一个为primary并 continue 操作。但是,如果整个分片无法访问或由于某种原因而失败,则该数据将不可用。

  • 如果分片键允许mongos将大多数操作隔离到单个分片,则单个分片的故障只会使某些数据不可用。

  • 如果您的分片密钥在整个集群中分配了每个操作所需的数据,那么整个分片的故障将使整个集群不可用。

本质上,对可靠性的关注只是强调了选择将查询操作隔离到单个分片的分片键的重要性。

配置数据库字符串错误

在版本 3.2 中更改。

从 MongoDB 3.2 开始,配置服务器可以部署为副本集。分片群集的mongos实例必须指定相同的配置服务器副本集名称,但可以指定副本集不同成员的主机名和端口。

从 3.4 开始,不再支持将已弃用的镜像mongod实例用作配置服务器(SCCC)。在将分片群集升级到 3.4 之前,必须将配置服务器从 SCCC 转换为 CSRS。

要将配置服务器从 SCCC 转换为 CSRS,请参见 MongoDB 3.4 手册将配置服务器升级到副本集

对于将三个镜像mongod实例的拓扑用于配置服务器的 MongoDB 分片群集的早期版本,分片群集中的mongos实例必须指定相同的configDB字符串。

避免在移动配置服务器时出现停机

使用 CNAME 可以识别群集中的配置服务器,以便您可以重命名和重新编号配置服务器而不会造成停机。

moveChunk 提交失败错误

chunk migration的末尾,shard必须连接到config database才能更新集群元数据中的块记录。如果shard无法连接到config database,则 MongoDB 报告以下错误:

ERROR: moveChunk commit failed: version is at <n>|<nn> instead of
<N>|<NN>" and "ERROR: TERMINATING"

发生这种情况时,分片副本集的primary成员将终止以保护数据一致性。如果secondary成员可以访问配置数据库,则在选举后可以再次访问分片上的数据。

用户将需要独立解决组块迁移失败。如果您遇到此问题,请MongoDB CommunityMongoDB Support解决此问题。