在整个调整过程中,经历了多次压测,下面展示部分测试数据:

服务器ip+信息采集时间组合分片测试数据
上表为最终的片键改造方案下的部分压测数据,可以看出,调整前后性能提升较大。
三、心得
我们整理一下mongodb在咪咕的运维心得,希望能抛砖引玉。
运维流程机制
- 务必建立完善的运维管理流程,故障处理机制等;
- 规范化、模板化:对日常运维务必做到规范化,比如安装规范,避免人为原因重复踩坑。
硬件配置
确保内存设置能满足性能需求:确保内存>索引容量+高频访问数据容量
- 大多数情况下,MongoDB热数据(索引和最频繁访问的数据)全部缓存在RAM中时性能最好;
- 相对于其它优化,扩大内存的效果尤为显著;如果热数据超过了单个服务器的RAM,此时往往需要考虑扩大内存或者分片。
使用SSD磁盘
- 写操作负载高的应用采用SSD:SSD提供强大随机读取性能,大部分情况下符合MongoDB的数据访问模式。
使用RAID
- 出于安全和性能考虑,可采用合适的RAID模式,推荐RAID-10。
选用多核和更快的CPU
- MongoDB在更快的CPU上提供更好的性能,且WiredTiger存储引擎能够充分利用多核处理器资源(并发线程数和cpu核心数量相等)。
系统配置
开启NTP时间同步
- 使用复制集或者分片集群需要开启NTP时间同步,这对于MongoDB正常运行尤为重要。
禁用NUMA
- MongoDB运行在NUMA系统上会导致性能下降,因此需关闭NUMA配置。
- linux6 修改/boot/grub/grub.conf中kernel,添加numa=off
- linux7 修改/etc/grub2.cfg中linux16部分添加numa=off
禁用Transparent Huge Pages
- 数据库往往具有稀疏而不是连续的内存访问模式。应该在Linux机器上禁用THP以确保使用MongoDB获得最佳性能。
- kernel 参数添加transparent_hugepage=never
设置readahead
- 预读值是文件操作系统的一个优化手段,程序请求读取一个页面的时候,文件系统会同时读取下面的几个页面并返回。
- 设置合理的readahead值有利于提高MongoDB性能,使用MMAPv1引擎推荐设置为32或16,对于WiredTiger无论何种存储介质都建议设置为0。
- blockdev --report
- blockdev --setra 0 /dev/sda
设置合适的磁盘调度策略
- 磁盘调度策略应当根据应用类型和硬件配置进行设置,对于MongoDB,推荐使用noop。
- sed -i '/vmlinuz-/s/$/ elevator=deadline/' /boot/grub/grub.conf
文件系统选择
- MongoDB在WiredTiger存储引擎下建议使用XFS文件系统。
关闭数据库文件的atime
- 操作系统会维护文件最后的访问时间metadata,对于数据库意味着每次文件系统每访问一个页就会提交一个写操作,这将降低整个数据库的性能,禁止系统对文件的访问时间更新会有效提高文件读取的性能。
- /dev/xvdb /data xfs noatime,nodiratime 0 0
设置合理的系统内核参数
系统为防止单个用户/进程占用大量资源(比如线程、文件等),在内核参数上进行了限制,这些限制默认值较低,这会导致MongoDB运行可能遭遇一些不必要的问题。因此应当根据实际情况对内核参数进行适当调整。
- mongo soft nofile 64000
- mongo hard nofile 64000
- mongo soft nproc 32000
- mongo hard nproc 32000
- fs.file-max=98000
- kernel.pid_max=64000
- kernel.threads-max=64000
- vm.max_map_count=128000
MongoDB配置
尽量避免使用单机
- 单机不具备容错能力,生产中应当尽量避免使用,如处于某些限制只能使用单机,那么需要确保拥有完善的备份机制和故障恢复机制。
每台服务承载一个MongoDB实例
- 为获得最佳性能,每个服务器只部署一个MongoDB实例,降低资源争夺;如一台服务器上需要运行多个MongoDB实例,应当为每个实例分配合理的内存,避免内存争夺导致oom。
分片使用多路查询路由
- 在不同服务器上部署mongos,最好将mongos部署在应用服务器上,应用连接本机的mongos。
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|