文档菜单
文档首页
/
MongoDB 手册
/ /

故障排除分片集群

在本页

本页描述了常见的故障排除策略分片集群 部署。

从MongoDB 8.0开始,您可以使用 directShardOperations 角色执行需要对分片直接执行命令的维护操作。

警告

使用 directShardOperations 角色运行命令可能导致您的集群无法正常工作并可能造成数据损坏。仅将 directShardOperations 角色用于维护目的或在MongoDB支持的指导下使用。完成维护操作后,停止使用 directShardOperations 角色。

如果每个应用服务器都有自己的 mongos 实例,其他应用服务器可以继续访问数据库。此外,mongos 实例不维护持久状态,它们可以在不丢失任何状态或数据的情况下重启并变得不可用。当一个 mongos 实例启动时,它检索配置数据库的副本并可以开始路由查询。

副本集 为分片提供 高可用性。如果不可用的 mongod 是一个 主节点,那么副本集将 选举 一个新的主节点。如果不可用的 mongod 是一个 副节点,并且它断开了连接,主节点和副节点将继续保留所有数据。在一个三成员的副本集中,即使集合中的一个成员发生灾难性故障,其他两个成员也有数据的完整副本。[1]

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

[1] 如果不可用的副节点在仍有当前操作日志条目的情况下变得可用,它可以使用正常的 复制过程 追赶到集合的最新状态;否则,它必须执行 初始同步

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

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

副本集为配置服务器提供高可用性。如果不可用的配置服务器是主节点,则副本集将选举一个新的主节点。

如果副本集配置服务器丢失其主节点且无法选举新的主节点,则集群的元数据变为只读。您仍然可以从分片读取和写入数据,但在主节点可用之前,不会发生任何数据块迁移数据块分裂

注意

将副本集成员分散在两个数据中心比单个数据中心更有优势。在两个数据中心的分布中,

  • 如果其中一个数据中心发生故障,数据仍然可用于读取,这与单个数据中心分布不同。

  • 如果拥有少数成员的数据中心发生故障,副本集仍然可以处理读写操作。

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

如果可能,至少将成员分散在三个数据中心。对于配置服务器副本集(CSRS),最佳做法是分散在三个(或更多,具体取决于成员数量)数据中心。如果第三个数据中心的成本过高,一种可能的分布方式是将数据承载成员均匀分布在两个数据中心,如果公司政策允许,将剩余成员存储在云端。

注意

当您首次启动分片集群时,所有配置服务器都必须运行并可用。

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

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

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

要解决分片键问题,请参阅 解决分片键问题。

为确保集群可用性

  • 每个分片应该是一个 副本集,如果特定的 mongod 实例失败,副本集成员将选举另一个成为 主节点 并继续运行。然而,如果整个分片不可达或由于某种原因失败,该数据将不可用。

  • 分片键应允许 mongos 将大多数操作隔离到一个单一的分片上。如果操作可以由单个分片处理,则单个分片故障只会导致 某些 数据不可用。如果操作需要查询所有分片,则单个分片故障将使整个集群不可用。

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

在使用早期版本的 MongoDB 分片集群,该集群使用三个镜像的 mongod 实例作为配置服务器时,分片集群中的 mongos 实例必须指定相同的 configDB 字符串。

使用 CNAME 来识别集群中的配置服务器,这样您可以在不停机的情况下重命名和重新编号配置服务器。

在块迁移结束后,分片必须连接到块迁移的配置数据库,以更新集群元数据中的块记录。如果分片无法连接到配置数据库,MongoDB将报告以下错误

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

在这种情况下,分片副本集的主节点将终止以保护数据一致性。如果副节点可以访问配置数据库,则在选举之后,分片上的数据将再次可访问。

用户需要独立解决块迁移失败问题。如果您遇到此问题,请联系MongoDB 社区MongoDB 支持以解决这个问题。

从 MongoDB 7.0 开始,可用checkMetadataConsistency命令来检查分片元数据中的不一致性和损坏,这些不一致性和损坏可能由 MongoDB 早期版本中的错误引起。

分片元数据的不一致性可能源于以下情况:

  • 从 MongoDB 5.0 之前的版本升级的集群可能包含过去 DDL 操作损坏的数据。

  • 手动干预,例如操作配置数据库或绕过 mongos 直接写入分片。

  • 维护操作,例如升级或降级程序。

这些不一致性可能导致查询结果不正确或数据丢失。

要检查分片元数据中的不一致性,请运行checkMetadataConsistency命令

db.runCommand( { checkMetadataConsistency: 1 } )
{
cursor: {
id: Long("0"),
ns: "test.$cmd.aggregate",
firstBatch: [
{
type: "MisplacedCollection",
description: "Unsharded collection found on shard different from database primary shard",
details: {
namespace: "test.authors",
shard: "shard02",
localUUID: new UUID("1ad56770-61e2-48e9-83c6-8ecefe73cfc4")
}
}
],
},
ok: 1
}

checkMetadataConsistency命令返回的文档指示 MongoDB 在集群的分片元数据中识别的不一致性。

有关 checkMetadataConsistency命令返回的不一致性文档的信息,请参阅不一致性类型

返回上一页

操作限制