从运维浅谈MongoDB性能优化

Posted 咪咕音乐技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从运维浅谈MongoDB性能优化相关的知识,希望对你有一定的参考价值。


MongoDB是一个可扩展的高性能基于文档的NoSQL数据库,内置GridFS,Sharding,具备复制集自动故障恢复等特点对于运维和开发相当便捷和简单。

在我司也越来越多地使用MongoDB,但随着使用量增加,业务压力增加,一些问题也逐渐浮出水面:涉及硬件、系统、mongodb自身配置、应用设计等,本文从运维角度总结一下前三点,希望能抛砖引玉。



01
硬件配置

01

确保内存>索引容量+高频访问数据容量


大多数情况下,MongoDB热数据(索引和最频繁访问的数据)全部缓存在RAM中时,性能最好;

相对于其它优化,扩大内存的效果尤为显著;如果热数据超过了单个服务器的RAM,此时往往需要考虑扩大内存或者分片


02

使用SSD磁盘

写操作负载高的应用采用SSD:SSD提供强大随机读取性能,大部分情况下符合MongoDB的数据访问模式;


03

使用RAID

出于安全和性能考虑,可采用合适的RAID模式,推荐RAID-10。


04

选用多核和更快的cpu

MongoDB在更快的CPU上提供更好的性能,且WiredTiger存储引擎能够充分利用多核处理器资源(并发线程数和cpu核心数量相等)



02
系统配置

01

开启NTP时间同步

使用复制集或者分片集群需要开启NTP时间同步,这对于mongodb正常运行尤为重要


02

禁用NUMA

MongoDB运行在NUMA系统上会导致性能下降,因此需关闭NUMA配置


03

禁用Transparent Huge Pages

数据库往往具有稀疏而不是连续的内存访问模式。应该在Linux机器上禁用THP以确保使用MongoDB获得最佳性能。


04

设置readahead

预读值是文件操作系统的一个优化手段,程序请求读取一个页面的时候,文件系统会同时读取下面的几个页面并返回。

设置合理的readahead值有利于提高MongoDB性能,使用MMAPv1 引擎推荐设置为32或16,对于WiredTiger无论何种存储介质都建议设置为0


05

设置合适的磁盘调度策略

磁盘调度策略应当根据应用类型和硬件配置进行设置,对于mongodb,推荐使用noop 


06

文件系统选择

MongoDB在WiredTiger存储引擎下建议使用XFS文件系统。


07

关闭数据库文件的 atime

操作系统会维护文件最后的访问时间metadata,对于数据库意味着每次文件系统每访问一个页就会提交一个写操作,这将降低整个数据库的性能,禁止系统对文件的访问时间更新会有效提高文件读取的性能。


08

设置合理的系统内核参数

系统为防止单个用户/进程占用大量资源(比如线程,文件等),在内核参数上进行了限制,这些限制默认值较低,这会导致MongoDB运行可能遭遇一些不必要的问题,因此应当根据实际情况对内核参数进行适当调整。


03
MongoDB配置

01

尽量避免使用单机


02

每台服务承载一个mongodb实例

为获得最佳性能,每个服务器只部署一个mongodb实例,降低资源争夺;如一台服务器上需要运行多个mongodb实例,应当为每个实例分配合理的内存,避免内存争夺导致oom


03

分片使用多路查询路由

在不同服务器上使用多个mongos,最好将mongos部署在应用服务器上。


04

存储引擎配置数据压缩

MongoDB在使用WiredTiger和encrypted 引擎时默认开启了压缩,压缩比约为70%--80%;

MongoDB WiredTiger默认使用Snappy,该选项消耗较低的cpu资源获得较高的压缩率,此外提供zlib选项,该选项比Snappy拥有更高的压缩率,但会消耗更多的cpu资源


05

设置合理的Path

如条件允许,将数据和索引目录分开,每个目录挂在不同的硬盘设备,将数据和目录存放到不同的物理设备

启用directoryPerDB,每个数据库不同目录,每个目录挂在不同的设备


06

设置合理的oplogsize

设置足够的oplog大小,确保足够的同步/维护时间窗口,避免因oplogsize太小导致同步中断


07

启用安全认证

启用安全认证会降低mongodb性能,出于安全考虑,任然建议开启安全认证,除非MongoDB运行在安全的网络环境之内


08

选择合适的片键

片键的选择对于分片集群的性能至关重要,合理的片键可以提高mongodb整体性能,糟糕的片键可能会让你的mongodb集群不如单机mongodb

好的片键应当具有以下特征:

a. 将插入数据均匀分布到各个分片上

b. 保证CRUD操作能够利用局部性

c.有足够的粒度进行块拆分

片键上必须有索引,因此选择业务会用到的索引字段分片, 好处是可以避免索引浪费,减少空间和性能损失


09

善用索引

如果没有索引MongoDB需要把所有的Document从盘上读到内存,这会对MongoDB服务器造成较大的压力并影响到其他请求的执行。

同时,应当根据业务选择合适的索引属性,比如可以利用TTL自动删除过期的数据


10

避免索引滥用

不依赖于每个字段的独立索引,合适的组合索引相比于每个字段创建索引占用存储空间更小且同样能提升效率,但需要注意组合索引字段顺序及排序问题


11

监控profile

开启mongodb的profile对该实例的操作进行监控,为性能优化提供依据;


12

启用Log Rotation

MongoDB默认情况下不会自动的切换日志的,这将会导致日志逐渐增大,在繁忙的业务下,日志增长快。查看某一时段的日志极不方便。需要对mongodb 日志文件进行切换,根据实际需求保留若干天


13

程序合理配置驱动

程序应根据MongoDB架构和业务需求配置驱动程序,从而实现读写分离,故障转移等



以上是关于从运维浅谈MongoDB性能优化的主要内容,如果未能解决你的问题,请参考以下文章

自动化运维浅谈

近期业务需要所引发的性能优化问题,浅谈线程池性能优化

App性能优化浅谈

浅谈Solr和ElasticSearch建索引性能优化策略

cnblogs——从主题开发浅谈前端性能优化

iOS中 性能优化之浅谈load与initialize