返回

线上mongo频繁被OOM的解决过程

后端

前言
近期线上平台出现了一次故障,mongo数据库被oom了。由于是高可用架构,重新选举了主节点后,继续工作,没想到刚选举完又被oom,mongo重启达到了分钟级别,多个节点被oom后,不能很快的拉起来。

经过排查,发现问题出在长连接上。由于业务量激增,导致mongo的连接数急剧上升,超过了mongo的默认连接数限制。当连接数超过限制时,mongo就会被oom。

解决办法也很简单,就是增加mongo的连接数限制。但是,增加连接数限制也可能会导致其他问题,比如性能下降。因此,在增加连接数限制时,需要权衡利弊。

最终,我们通过增加mongo的连接数限制和优化业务代码,解决了线上mongo频繁被oom的问题。

在这次故障中,我们吸取了很多教训。首先,我们要重视线上服务的监控。及时发现问题,才能及时解决问题。其次,我们要优化业务代码,减少对数据库的压力。最后,我们要对线上服务的架构进行优化,提高服务的可靠性。

mongo的连接数限制

mongo的连接数限制默认是10000。这个限制可以通过修改mongo的配置文件来改变。在配置文件中,找到“net.maxConnections”这一项,然后将它修改为所需的值。

# net.maxConnections sets the maximum number of concurrent connections for this
# mongod or mongos instance. For mongos, this is the maximum number of
# connections all mongos instances can have to a given shard.
net.maxConnections: 10000

增加mongo的连接数限制可能带来的问题

增加mongo的连接数限制可能会导致以下问题:

  • 性能下降:当连接数过多时,mongo的性能可能会下降。这是因为mongo需要更多的资源来处理更多的连接。
  • 内存使用量增加:当连接数过多时,mongo使用的内存也会增加。这是因为mongo需要为每个连接分配内存。
  • 稳定性下降:当连接数过多时,mongo的稳定性可能会下降。这是因为mongo更容易受到攻击。

优化业务代码,减少对数据库的压力

我们可以通过以下方法来优化业务代码,减少对数据库的压力:

  • 减少不必要的查询:只查询需要的字段,避免查询整个表。
  • 使用索引:索引可以帮助mongo更快地找到数据。
  • 避免使用大查询:大查询会占用更多的资源,导致mongo的性能下降。
  • 使用连接池:连接池可以减少创建和销毁连接的开销。

对线上服务的架构进行优化,提高服务的可靠性

我们可以通过以下方法来对线上服务的架构进行优化,提高服务的可靠性:

  • 使用高可用架构:高可用架构可以防止单点故障。
  • 使用负载均衡器:负载均衡器可以将请求分发到不同的服务器上,避免单台服务器过载。
  • 使用监控系统:监控系统可以帮助我们及时发现问题。
  • 定期进行演练:演练可以帮助我们发现架构中的问题,并制定相应的解决方案。

通过上述方法,我们可以解决mongo频繁被oom的问题,并提高线上服务的可靠性。