mongodb - MongoDB 副本节点变为“(不可访问/健康)”
问题描述
在我当前的项目中,我们有 3 个节点 MongoDB 副本集设置(1 个主节点和 2 个从节点)用于生产环境中的文档管理服务。由于设置已经存在,因此它运行正常。有一个 REST API 端点将文档上传到 mongo DB。由于我们需要对 mongodb 进行一些性能测试,因此我通过 JMeter 启动了负载测试,并创建了一个测试计划,通过模拟 5 个用户将数据直接插入 mongoDB。
对于短期测试,所有三个节点都已启动并运行,没有任何问题。但是当长时间运行负载测试时,一个节点变为“(不可访问/健康)”并在其他两个节点中选择新的 PRIMARY 并且负载测试运行没有任何问题并使用现有的两个节点插入数据。
在开发环境中,通过删除问题节点并将其添加为新节点确实可以正确同步数据并恢复为辅助节点。但是由于这些相同的配置存在于生产环境中,我们真的需要知道是什么原因导致一个节点变为“(不可访问/健康)”。
请注意,在当前系统中,我们没有启用安全性,所有三个节点都运行在具有不同端口号的同一服务器上,配置详细信息如下。
节点 mongodb01
mongod.conf - 对于其他两个具有自己的 dbpath、日志路径和端口的节点将是相同的
会员详情状态:
enter "members" : [
{
"_id" : 2,
"name" : "<host>:27018",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"optime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDurable" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2021-11-09T05:24:39.870Z"),
"lastHeartbeatRecv" : ISODate("2021-11-09T03:07:38.381Z"),
"pingMs" : NumberLong(300),
"lastHeartbeatMessage" : "Error connecting to <host>:27018 (10.103.58.45:27018) :: caused by :: Connection refused",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 21,
"configTerm" : 106
},
{
"_id" : 7,
"name" : "<host>:27019",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 498947,
"optime" : {
"ts" : Timestamp(1636435479, 10),
"t" : NumberLong(106)
},
"optimeDate" : ISODate("2021-11-09T05:24:39Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1636332442, 1),
"electionDate" : ISODate("2021-11-08T00:47:22Z"),
"configVersion" : 21,
"configTerm" : 106,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 8,
"name" : "<host>:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 99236,
"optime" : {
"ts" : Timestamp(1636435479, 5),
"t" : NumberLong(106)
},
"optimeDurable" : {
"ts" : Timestamp(1636435479, 5),
"t" : NumberLong(106)
},
"optimeDate" : ISODate("2021-11-09T05:24:39Z"),
"optimeDurableDate" : ISODate("2021-11-09T05:24:39Z"),
"lastHeartbeat" : ISODate("2021-11-09T05:24:39.371Z"),
"lastHeartbeatRecv" : ISODate("2021-11-09T05:24:39.371Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "<host>:27019",
"syncSourceId" : 7,
"infoMessage" : "",
"configVersion" : 21,
"configTerm" : 106
}
],here
解决方案
all three nodes runs in the same server
- 非常有趣的设置,你想在这里实现什么?复制和主/从设置的整个点是绕过单点故障约束,在您的情况下,您不会获得任何好处,而只会消耗底层操作系统资源,正确调整和优化的单个实例将更快地工作
看着:
- MongoDB日志文件,尤其是对于失败的实例
- 操作系统日志文件
- 操作系统性能指标(即 CPU、RAM、磁盘、网络使用情况等),可以使用JMeter PerfMon 插件来完成,因为您的 Mongo 实例之一可能开始消耗大量资源并已被终止OOMKiller
推荐阅读
- java - 基本Java数组编码,查找数组中的最大数
- list - 在跳过列表中抛硬币 - 可视化和查找长度和宽度
- php - Composer 问题:“您的要求无法解析为一组可安装的软件包”
- c - Why are objects with automatic storage not zeroed when static objects are?
- angular - Angular Rest 调用立即失败但不进行调用
- javascript -
转换 HTML 时修复行标记到电子邮件
- laravel-5.7 - 在 Router.php 第 366 行:传递给 Illuminate\Routing\Router::group() 的参数 1 必须是数组类型,
- javascript - 嵌套承诺是一种好习惯吗?
- c# - 仅当值存在于预定义列表中时,如何编写 LINQ 以返回结果
- java - How do I count the occurence of an integer in a list and output it correctly?