我有一个带有 2 个数据节点和 1 个仲裁器的 mongodb 集群。我的所有 centos 虚拟机都使用 mongodb 4.0.7。
几天前,我的一台服务器(我们称之为 data-2)发生了致命的崩溃,并请求对数据进行完全重新同步。在 data-2 上重新启动 mongodb 后,重新同步开始。然而,紧接着 data-1(主要)上的 RAM 使用率开始飙升。
然而,在 data-2 上,内存消耗几乎是恒定的:
在正常使用时间内,重新同步期间内存消耗保持接近 data-2 的消耗。
几个小时后,最坏的情况发生了,最后剩下的数据持有者(data-1)在使用整个 ram + swap(~50GB)后被内核杀死了 OOM。我可以毫不费力地将 data-1 恢复为主,但我每次尝试开始重新同步时都会再次发生同样的情况。
此行为似乎与重新同步期间的实际数据库使用无关。(为了重新同步而关闭 prod db 绝对是不行的)。
总数据大小约 500GB,最大数据库 480GB,包含约 300 个集合。
现在我的问题:
- 什么在重新同步期间使用了这么多内存?
- 如何有效分析内存消耗?
- 如何防止主数据库因重新同步而关闭?
有这么多东西在resync期间使用内存,这里
Mr. SpiXel
明确定义了WiredTiger缓存设置只控制WiredTiger存储引擎直接使用的内存大小(不是mongod使用的总内存)。在 MongoDB/WiredTiger 配置中,许多其他东西可能会占用内存,例如:WiredTiger 将用于所有数据的内部缓存的最大大小。
在 3.4 版更改:值的范围可以从256MB到10TB,并且可以是浮点数。此外,默认值也发生了变化。
从 开始
3.4
,WiredTiger internal cache
默认情况下,将使用以下两者中较大的一个:例如,在总共有 4GB RAM 的系统上,WiredTiger 缓存将使用 1.5GB 的 RAM (0.5 * (4 GB - 1 GB) = 1.5 GB)。相反,总共有 1.25 GB RAM 的系统将分配 256 MB 给 WiredTiger 缓存,因为这是总 RAM 减去 1 GB 的一半以上 (0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB) .
根据这里的一些MongoDB 博客
@CASEY DUNHAM
,MongoDB 性能是一个巨大的话题,涵盖了系统活动的许多领域。默认情况下,MongoDB 将为50
WiredTiger 数据缓存保留可用内存的百分比。此缓存的大小对于确保 WiredTiger 充分执行非常重要。值得一看,看看你是否应该改变它的默认值。一个好的经验法则是缓存的大小应该足够大以容纳整个应用程序工作集。我们怎么知道是否要改变它?查看缓存使用统计信息:
这里有很多数据,但我们可以重点关注以下几个领域:
maximum bytes configured
.查看这些值,我们可以确定是否需要增加实例的缓存大小。此外,我们可以查看读入高速缓存的wiredTiger.cache.bytes值以用于读取繁重的应用程序。如果此值一直很高,则增加缓存大小可能会提高整体读取性能。
根据此处的 MongoDB 博客文档,可能存在主要无法访问的情况。当一个主节点不与集合中的其他成员通信超过
10 seconds
时,符合条件的辅助节点将举行选举以选举自己为新的主节点。举行选举并获得多数成员选票的第一个中学成为小学。尽管时间有所不同,但该failover
过程通常在一分钟内完成。例如,10-30 seconds
副本集的成员可能需要声明主节点不可访问。剩下的一个次要举行选举,将自己选为new primary
. 选举本身可能需要另一个10-30 seconds
. 在选举过程中,副本集没有主副本,无法接受写入,所有剩余成员都变为只读。为了进一步参考这里,这里和这里
因此,每当辅助成员变得陈旧并且远远落后于主要 oplog 和被覆盖的 oplog 条目时,mongod 将通过删除其数据并执行初始同步来完全重新同步过时的成员。
根据 MongoDB 文档,
在您的情况下,主要需要使用过度使用的 300 个集合。mongodb 还建议使用以下重新同步选项。