一、软件包选择
确保使用最新的稳定版本,确保生产环境总是使用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 工作。