生产环境部署MongoDB集群——性能优化

一、软件包选择

确保使用最新的稳定版本,确保生产环境总是使用64位版本。

二、操作系统选择

MongoDB支持Windows,Linux,MacOS和Solaris,建议生产环境部署在linux操作系统上。

三、日志功能

MongoDB使用提前写日志记录到磁盘上的日志方式来确保MongoDB可以快速的从系统奔溃或其他严重事故中恢复写操作。64位版本默认开启日志功能,32位没有开启。生产环境建议开启日志功能。

详细操作可以参考http://docs.mongodb.org/manual/core/journaling/

四、网络方面

 

总是在一个可受信任的环境中运行MongoDB,设置网络访问规则,不允许不明确的主机,系统或网络访问MongoDB服务器。正如其他依赖于网络访问的敏感系统一样,部署MongoDB的时候,也需要设定有哪些特定系统允许访问。如设定WEB服务器可以访问MongoDB服务器,监控服务器可以访问MongoDB服务器。默认情况下auth功能没有开启,MongoDB假定当前运行的环境是一个安全的环境。根据需要可以开启auth功能。

http://docs.mongodb.org/manual/tutorial/configure-linux-iptables-firewall/ 配置iptables。

五、连接池

为了避免单个MongoDB实例或Mongos实例负载的连接资源负载过高,确保所有客户端需要维护一个合理的连接池大小。

六、硬件考虑

 

1.分配给MongoDB服务器足够的CPU和内存

MongoDB和其他软件一样,分配越多的内存和越快的CPU都可以提升性能。从线上运行情况来看,    MongoDB确实很吃内存,它会尽量先吃光内存。

2.分配swap

 需要给运行MongoDB的系统分配swap分区,避免在内存竞争激烈的情况下,OOM Killer杀掉MongoDB进程。MongoDB通过映射内存文件到内存的方式确保操作系统不会存储MongoDB数据到swap分区。

3.RAID相关

 大多数情况下,部署MongoDB都应该考虑使用RAID10。

4.尽量使用固态硬盘Solid State Disks

  在条件允许的情况下,尽量使用SSD,因为SSD对大量随机读写有很高的性能。从线上使用的情况    来看,使用IOPS值越高的磁盘,MongoDB获取的性能越好。

5.不要使用远程文件系统(NFS)

  不建议网络文件系统NFS用于MongoDB部署,这样容易产生性能问题。当数据文件和日志文件都存    储在NFS上时,MongoDB就会产生很多性能问题,将日志文件存储在本地或iscsi卷组上,可以获    得好一点的性能。如果非要使用NFS,则在/etc/fstab中需要加上bg,noclock,noatime。

6.将数据分开存储

  为了获得更大的性能,可以将数据文件,系统日志文件和访问日志文件分别存储到不同的存储设   备上。但是这样会影响快照方式备份数据。

七、MongoDB和NUMA硬件

 

在一个NUMA(Non-Uniform Access Memory)的系统上运行MongoDB会产生许多运维相关问题,包括间断性的慢查询和系统进程高负载使用。在一个NUMA硬件上部署MongoDB时,需要配置内存interleave策略。MongoDB 2.0以上版本在启动时会检测NUMA设置,并提示警告信息。

在Linux上部署MongoDB时,配置方法如下:

1.安装numactl

yum install -y numactl

2.使用如下两个命令中的任意一个在sysctl设置中关闭zone reclaim

echo 0 | sudo tee /proc/sys/vm/zone_reclaim_mode
sudo sysctl -w vm.zone_reclaim_mode=0

3.使用numactl命令来启动mongod实例(包括config servers,mongos)

numactl --interleave=all <path> <options>

举例:

numactl --interleave=all mongod -f /usr/local/mongodb/bin/rs3_member.conf

即分配所有的node供其使用,这也是官方推荐的用法。

八、在Linux上部署MongoDB

1.内核和文件系统的选择

 

官方建议使用Linux内核版本2.6.36以后的版本。如果内核版本比较低的话可以自行编译内核。

    MongoDB在使用数据库文件之前会预先分配数据库文件,通常会生成许多大文件。所以应该使用EXT4或XFS文件系统。

2.建议配置

关闭存储数据库文件的磁盘的atime,禁止系统对文件的访问时间更新会有效提高文件读取的性能。这个可以通过在/etc/fstab 文件中增加 noatime 参数来实现。例如:

#在存储数据库文件的磁盘卷设备上default后面加上noatime,nodiratime

/dev/mapper/centos-data    /data    xfs    default,noatime,nodiratime      0 0

修改完文件后重新mount就可以:

# mount -o remount /data

解除linux系统“文件句柄数和最大用户进程数限制”,即设置ulimit -n和ulimit -u的值大于20000。如果ulimit的值设置过低的话,当MongoDB处于频繁访问的状态下,将会产生错误,最终导致无法连接到MongoDB实例。设置方法如下(以CentOS7.1为例):

具体参考:https://blog.csdn.net/wangkai_123456/article/details/78481698

 

关闭THP(Transparent Huge Pages),简称“透明大页”,MongoDB在使用正常虚拟内存页面(4096bytes)性能更好。关闭THP方法(以CentOS7.1为例):

1、创建init.d脚本

在/etc/init.d/目录下创建文件disable-transparent-hugepages:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-transparent-hugepages
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    mongod mongodb-mms-automation-agent
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description:       Disable Linux transparent huge pages, to improve
#                    database performance.
### END INIT INFO


case $1 in
  start)
    if [ -d /sys/kernel/mm/transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/transparent_hugepage
    elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/redhat_transparent_hugepage
    else
      return 0
    fi


    echo 'never' > ${thp_path}/enabled
    echo 'never' > ${thp_path}/defrag


    re='^[0-1]+$'
    if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
    then
      # RHEL 7
      echo 0  > ${thp_path}/khugepaged/defrag
    else
      # RHEL 6
      echo 'no' > ${thp_path}/khugepaged/defrag
    fi


    unset re
    unset thp_path
    ;;
esac

 

2、使文件disable-transparent-hugepages有可执行权限:

sudo chmod 755 /etc/init.d/disable-transparent-hugepages

 

3、配置操作系统在启动时运行disable-transparent-hugepages

不同的linux发行版本,配置命令可能不同,如下

Ubuntu and Debian:
sudo update-rc.d disable-transparent-hugepages defaults
SUSE:
sudo insserv /etc/init.d/disable-transparent-hugepages
Red Hat, CentOS, Amazon Linux, and derivatives:
sudo chkconfig --add disable-transparent-hugepages

 

4、重写tuned和ktune,方法如下

执行如下两条命令

echo never >>  /sys/kernel/mm/transparent_hugepage/enabled
echo never >>  /sys/kernel/mm/transparent_hugepage/defrag
重启Linux后,以上设置会失效,为了能够永久关闭THP,进行如下操作:

 

sudo mkdir /etc/tuned/no-thp
编辑/etc/tuned/no-thp/tuned.conf,添加如下内容:
[main]
include=virtual-guest
[vm]
transparent_hugepages=never
保存,执行如下命令
sudo tuned-adm profile no-thp

 

 

 

查看变更是否生效,查询hugepage状态,第一种方式
cat /sys/kernel/mm/transparent_hugepage/enabled 
结果:always madvise [never]
cat /sys/kernel/mm/transparent_hugepage/defrag 
结果:always madvise [never]

 

八、MongoDB分片集群

如果生产环境部署的MongoDB分片集群,在集群提供服务的高峰期应该关闭Balancer,避免 chunk 迁移对线上服务造成影响,应当设置Balancer 时间窗口,如设置 Balancer 只在凌晨2:00 – 6:00 工作。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值