此页面介绍了对分片群集部署进行故障排除的常见策略
。
如果每个应用程序服务器都有其自己的mongos
实例,则其他应用程序服务器可以继续访问数据库。此外,
mongos
实例不保持持久状态,并且它们可以重新启动并变得不可用而不会丢失任何状态或数据。当一个mongos
实例启动时,它检索的副本
配置数据库,可以开始路由查询。
分片副本集中单个成员不可用
副本集为分片提供了高可用性。如果不可用mongod
是主要数据库,则副本集将选择一个新的主要数据库。如果不可用mongod
是
辅助服务器,并且断开了连接,那么辅助服务器将继续保存所有数据。在三成员副本集中,即使集合中的单个成员发生灾难性故障,其他两个成员也具有数据的完整副本。
始终调查可用性中断和故障。如果系统是不可恢复的,请更换它并尽快创建副本集的新成员,以替换丢失的冗余。
[1] | 如果不可用的辅助服务器在仍具有当前操作日志条目的同时变得可用,则可以使用常规复制过程来赶上该集合的最新状态。否则,它必须执行初始sync。 |
分片的所有成员均不可用
在分片簇,mongod
和mongos
实例监视分片集群中的副本集(例如碎片副本集,配置服务器副本集)。
如果副本集分片的所有成员均不可用,则该分片中保存的所有数据均不可用。但是,所有其他分片上的数据将保持可用,并且可以将数据读取和写入其他分片。但是,您的应用程序必须能够处理部分结果,并且您应该调查中断的原因并尝试尽快恢复碎片。
配置服务器副本集成员不可用
副本集为配置服务器提供了高可用性。如果不可用的配置服务器是主服务器
,则副本集将
选择一个新的主服务器。
如果副本集配置服务器丢失其主服务器并且无法选择主服务器,则集群的元数据将变为只读。您仍然可以从分片中读取和写入数据,但是直到主数据库可用之前,都不会发生块迁移或块拆分。
注意
在两个数据中心之间分布副本集成员可提供优于单个数据中心的好处。在两个数据中心分布中,
- 如果其中一个数据中心发生故障,则与单个数据中心分发不同,该数据仍可读取。
- 如果具有少数成员的数据中心发生故障,则副本集仍然可以同时执行写操作和读操作。
- 但是,如果拥有大多数成员的数据中心发生故障,则副本集将变为只读。
如果可能,请在至少三个数据中心中分配成员。对于配置服务器副本集(CSRS),最佳实践是分布在三个(或更多,取决于成员的数量)中心中。如果第三个数据中心的成本过高,则一种分配可能性是,在公司政策允许的情况下,在两个数据中心之间平均分配数据承载成员,并将剩余成员存储在云中。
注意
首次启动分片群集时,所有配置服务器必须正在运行并且可用。
[2] | 从MongoDB 3.4开始,mongod 不再支持使用三个镜像
实例(SCCC)作为配置服务器。 |
分片键和群集可用性
选择分片密钥时,最重要的考虑因素
是:
- 确保MongoDB能够在各个分片之间平均分配数据,以及
- 在整个集群上扩展写入,以及
- 以确保
mongos
可以将大多数查询隔离到特定的
mongod
。
此外:
- 每个分片应为一个副本集,如果特定
mongod
实例失败,则副本集成员将选择另一个作为主要副本并继续操作。但是,如果整个分片无法访问或由于某种原因而失败,则该数据将不可用。
- 如果分片键允许
mongos
将大多数操作隔离到单个分片,则单个分片的故障只会使某些数据不可用。
- 如果您的分片密钥在整个集群中分配了每个操作所需的数据,那么整个分片的故障将使整个集群不可用。
本质上,对可靠性的关注只是强调了选择将查询操作隔离到单个分片的分片键的重要性。
配置数据库字符串错误
从MongoDB 3.2开始,配置服务器可以部署为副本集。分片mongos
群集的实例必须指定相同的配置服务器副本集名称,但可以指定副本集不同成员的主机名和端口。
从3.4开始,mongod
不再支持将已弃用的镜像实例用作配置服务器(SCCC)。在将分片群集升级到3.4之前,必须将配置服务器从SCCC转换为CSRS。
要将配置服务器从SCCC转换为CSRS,请参阅MongoDB 3.4手册“将配置服务器升级到副本集”。
对于将三个镜像mongod
实例的拓扑用于配置服务器
的MongoDB分片群集的早期版本,分片群集中的mongos
实例必须指定相同的
configDB
字符串。
移动配置服务器时避免停机
使用CNAME来识别群集中的配置服务器,以便您可以重命名和重新编号配置服务器而不会造成停机。
moveChunk commit failed
错误
在结束块迁移,该
碎片必须连接到配置数据库更新块的集群元数据记录。如果碎片无法连接到配置数据库,MongoDB的报告以下错误:
发生这种情况时,分片副本集的主要成员将终止以保护数据一致性。如果辅助
成员可以访问配置数据库,则在选举后可以再次访问分片上的数据。
用户将需要独立解决组块迁移失败。如果遇到此问题,请请求MongoDB社区或
MongoDB支持以解决此问题。