On this page
对分片群集进行故障排除
在本页面
本页介绍了对sharded cluster部署进行故障排除的常见策略。
应用服务器或 mongos 实例不可用
一个单一的 mongod 在碎片中变得不可用
Replica sets提供high availability用于分片。如果不可用的mongod是primary,则副本集将elect一个新的主副本。如果不可用的mongod是secondary,并且断开连接,则主服务器和辅助服务器将 continue 保存所有数据。在三成员副本集中,即使集合中的单个成员发生灾难性故障,其他两个成员也具有数据的完整副本。 [1]
始终调查可用性中断和故障。如果系统是不可恢复的,请更换它并尽快创建副本集的新成员,以替换丢失的冗余。
[1] | 如果不可用的辅助服务器在仍具有当前操作日志条目的同时变为可用,则可以使用常规replication process赶上该集合的最新状态。否则,它必须执行initial sync。 |
分片的所有成员均不可用
在分片群集中,mongod和mongos实例监视分片群集中的副本集(例如,分片副本集,配置服务器副本集)。
配置服务器副本集成员不可用
在版本 3.2 中进行了更改:从 MongoDB 3.2 开始,可将分片群集的配置服务器部署为replica set。副本集配置服务器必须运行WiredTiger 存储引擎。 MongoDB 3.2 不赞成将三个镜像mongod实例用于配置服务器。
Replica sets为配置服务器提供high availability。如果不可用的配置服务器是primary,则副本集将elect一个新的主服务器。
如果副本集配置服务器丢失其主服务器并且无法选择主服务器,则群集的元数据将变为只读。您仍然可以从分片读取和写入数据,但是只有主数据库可用之前,不会发生chunk migration或chunk splits。
Note
在两个数据中心之间分布副本集成员可提供优于单个数据中心的好处。在两个数据中心分布中,
如果其中一个数据中心发生故障,则与单个数据中心分发不同,该数据仍可读取。
如果具有少数成员的数据中心发生故障,则副本集仍然可以同时执行写操作和读操作。
但是,如果具有大多数成员的数据中心发生故障,则副本集将变为只读。
如果可能,请在至少三个数据中心中分配成员。对于配置服务器副本集(CSRS),最佳实践是分布在三个(或更多,取决于成员的数量)中心中。如果第三个数据中心的成本过高,则一种分配可能性是在公司 Policy 允许的情况下,在两个数据中心之间平均分配数据承载成员,并将其余成员存储在云中。
MongoDB 3.2
在分片群集中,mongod和mongos实例监视分片群集中的副本集(例如,分片副本集,配置服务器副本集)。
如果mongos实例或分片成员无法访问配置服务器副本集的成员,请执行以下操作:
对于 MongoDB 3.2.0-3.2.9,
- 如果连续失败尝试的次数超过replMonitorMaxFailedChecks参数值,则mongod或mongos实例将副本集设置为不可用,并且监视mongos或mongod实例将变得不可用,直到重新启动实例为止。
但是,在这种情况下,可以通过在启动以下实例时将replMonitorMaxFailedChecks设置为值2147483647
来避免重新启动mongos或分片副本集成员mongod:
Important
重新启动后参数设置不会保留。
db.adminCommand( { setParameter: 1, 'replMonitorMaxFailedChecks': 2147483647 } )
对于 MongoDB 3.2.10 或更高版本的 3.2 系列,
- 默认情况下,除非timeOutMonitoringReplicaSets设置为
true
,否则无需重新启动。
- 默认情况下,除非timeOutMonitoringReplicaSets设置为
光标由于配置数据过旧而失败
当一个或多个mongos实例尚未从config database更新集群元数据的缓存时,查询将返回以下警告:
could not initialize cursor across all shards because : stale config detected
该警告不应传播回您的应用程序。该警告将一直重复,直到所有mongos实例刷新其缓存为止。要强制实例刷新其缓存,请运行flushRouterConfig命令。
分片键和群集可用性
选择shard key时,最重要的注意事项是:
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 Community或MongoDB Support解决此问题。