【发布时间】:2020-07-06 08:04:25
【问题描述】:
在使用多文档事务时,我遇到了 MongoDB 集群的问题。
我有 5 个 mongodb 副本集服务器,分为三个数据中心。其中两个在第一个数据中心,两个在第二个数据中心,一个在第三个数据中心(仲裁器)。有一次,其中一个服务器是主服务器,第三个服务器是从属副本。 我使用 Spring Boot 在 java 中编写了一个应用程序,并在 mongo 中大量使用了多文档事务。
当所有数据库服务器都启动时,一切正常。但是当我想通过消除其中一个数据中心来测试高可用性时,我遇到了奇怪的问题。我的应用程序开始在每个事务上挂起(我需要等待大约一分钟,然后我从数据库中获得超时),但是在不使用事务时仍然可以正常工作:-(。
以下是我在应用程序中遇到的异常:
2020-07-06 16:58:51.748 ERROR 6 --- [0.0-5555-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mongodb.MongoTransactionException: Query failed with error code 251 and error message 'Encountered non-retryable error during query :: caused by :: Transaction 4 has been aborted.' on server mongos-dc2.fake.domain.com:27017; nested exception is com.mongodb.MongoQueryException: Query failed with error code 251 and error message 'Encountered non-retryable error during query :: caused by :: Transaction 4 has been aborted.' on server mongos-dc2.fake.domain.com27017]
这可能是什么原因?你能告诉我我应该怎么做才能解决这个问题吗?
【问题讨论】:
-
诊断究竟是什么“挂起”,在问题中添加细节。
-
我猜你没有正确使用交易,但你的问题仍然没有包含足够的信息来回答。
-
相信我,当您使用 spring boot 时,确实没有出错的余地。您只需声明 TransactionManager 并在某些方法上使用 @Transactional 注释即可。正如我所说,在本地单个数据库的本地开发过程中一切正常,当所有服务器都启动时,在目标服务器上也是如此。当我断开两个服务器时,问题就开始了。我希望有人有类似的问题,我认为没有理由投反对票
-
我投了反对票,因为我不相信这个问题是可以回答的。如果真的没有犯错的余地,您就不会遇到这个问题,对吗?尽可能减少你的代码,一旦它完全适合一个屏幕页面,就将它添加到问题中。
-
同时查看服务器日志。
标签: mongodb transactions high-availability acid