题主的两个问题可以理解成高并发下对MongoDB的技术优化需求,可以从两个层面出发考虑:

一、服务器配置优化

首先我们知道几个概念:

MongoDB是NoSQL面向文档型存储数据库,属于重内存的类型,特别是在MongoDB 3.2默认的 WiredTiger引擎下,默认会占用大量的内存来保证自身性能。

因此MongoDB所需要的服务器,以题主使用的云主机为例,选型思路主要是重存储型云主机,为了保证Mongo集群的读写性能,需要以SSD云盘前提下尽可能大内存的主机,同时vCPU也不能太低会影响压缩存储效率。

如果技术储备不够,在参数调优、版本升级、数据迁移中有问题怕踩坑,可以采用一些成熟的云服务提供商的基于容器的云原生Mongo Operator产品,这样可以少踩许多坑。

参考网易轻舟这类商业化中间件

二、软件层优化

简单介绍下我在MongoDB优化中的思路:

MongoDB主要包括mongod和mongo两个进程。

mongod是处理MongoDB系统的主要进程。它处理数据请求,管理数据存储,和执行后台管理操作。当我们运行mongod命令意味着正在启动MongoDB进程,并且在后台运行。

mongo则是一个命令行工具用于连接一个特定的mongod实例。当我们没有带参数运行mongo命令它将使用默认的端口号和localhost连接

1、参数调优

操作系统OS层面连接数优化

要提供高并发的响应能力,首先要考虑提升MongoDB本身的服务能力,mongod进程的连接数主要是受到操作系统的默认文件描述符和进程/线程数限制。

以centos为例,需要通过ulimit -a 查看open files是否够大,如果太小可以通过以下命令设置用户/进程允许打开的文件句柄数。

ulimit -n 1048576

ulimit -u 524288

2、更换MongoDB存储引擎

更新MongoDB版本更换存储引擎: 将 MMAPv1 替换为3.2官方推荐的 WiredTrigger,根据官方数据,WT引擎在写性能上提高7-10倍,经过我的实际使用中在内存占用以及存储数据占用空间上来说都有很大的优化。

3、读写分离,合理使用Mongo副本集和分片

很多人线上环境还是用单机版,虽然部署快但是很多mongo自然提供的功能都没有用到像自动故障转移、读写分离,这些对后续系统扩容及性能优化太重要了。我想会使用mongo的应该是数据量达到一定级别,查询性能会非常重要,所以强烈建议上线时直接使用副本集高可用。

另外增加读写性能MongoDB官方推荐的做法是分片shard,可以有效的将写入分配到多台服务器提高写入速度,使系统实现水平扩容。

四、云原生的Mongo PaaS中间件

如果技术储备不够,在参数调优、版本升级、数据迁移中有问题怕踩坑,可以采用一些成熟的云服务提供商的基于容器的云原生Mongo Operator产品,这样可以少踩许多坑。