MongoDB 生产环境笔记
MongoDB 生产环境笔记
在生产环境中,我们配置MongoDB
需要注意点有很多,而不是一安装就可以使用。我们需要配置一些内核和系统参数。因为这些参数是会影响到我们 MongoDB
的性能的。
如果你的MongoDB
实例所在的服务器还有其它业务和应用,那么修改下面的参数需要注意是否会影响其它应用的性能和运行状态。
官方文档链接:https://docs.mongodb.com/manual/administration/production-notes/
需要配置的点有:
- [vm.zone_reclaim_mode](#一、vm.zone_reclaim_mode 参数)
- [添加swap分区](#二、添加 swap 分区)
- 设置 swappiness 参数
- 内核和文件系统版本
- [禁用 Transparent Huge Pages (THP)](#五、禁用 Transparent Huge Pages (THP))
- [ulimit 设置](#六、ulimit 设置)
- tcp_keepalive_time
- 同步时间
一、vm.zone_reclaim_mode 参数
设置内核参数 vm.zone_reclaim_mode
,该参数是设置当一个内存区域的内存耗尽的时候,是从内部回收,还是去下一个内存区域寻找,0为去下一个区域寻找,非0表示当前区域回收。
# 修改,重启后失效
sysctl -w vm.zone_reclaim_mode=0
# 永久修改
echo "vm.zone_reclaim_mode = 0" >> /etc/sysctl.conf
sysctl -p
# 查询当前参数配置
sysctl -a |grep vm.zone_reclaim_mode
二、添加 swap 分区
如果内存空间不是那么充足的话,我们可以为系统配置 swap 分区。具体配置见文章 linux系统添加swap(虚拟内存)分区。
对于 WiredTiger 储存引擎,在压力比较大的情况下,WiredTiger 会将数据放置在 swap 分区里。
三、设置 swappiness 参数
在 Linux 系统中,可以通过查看 /proc/sys/vm/swappiness 内容的值来确定系统对 SWAP 分区的使用原则。当swappiness 内容的值为 0 时,表示最大限度地使用物理内存,物理内存使用完毕后,才会使用 SWAP 分区。当swappiness 内容的值为 100 时,表示积极地使用 SWAP 分区,并且把内存中的数据及时地置换到 SWAP 分区。
默认值为 0,表示需要在物理内存使用完毕后才会使用 SWAP 分区,
如果我们运行的主机系统 RHEL / CentOS 的内核版本在 2.6.32-303 及以上,我们可以把该值设置为 1。
# 临时修改
sysctl -w vm.swappiness=1
# 永久修改
cat "vm.swappiness = 1" >> /etc/sysctl.conf
sysctl -p
# 查看配置参数
sysctl -a |grep vm.swappiness
四、内核和文件系统版本
在 Linux 系统上运行 MongoDB ,我们建议使用 Linux内核版本2.6.36或者更高版本,使用 XFS 或者是 EXT4 文件系统,强烈建议使用 XFS 文件系统。因为 EXT4 和 WiredTiger 一起使用会有可能出现性能问题。
MongoDB 需要使用 glibc 库,最好版本至少是 2.13 上。
五、禁用 Transparent Huge Pages (THP)
在启动的时候我们可以看到类似的日志:
2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten]
2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-04-12T10:11:26.665+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
上面的警告就是意味着我们需要设置 /sys/kernel/mm/transparent_hugepage/defrag
和/sys/kernel/mm/transparent_hugepage/enabled
两个参数设置为 never ,上面参数的设置就是代表着 Transparent Huge Pages(THP)
, 在了解 THP 前,我们需要先了解下 Huge Pages(标准页),Huge Pages是从Linux Kernel 2.6后被引入的。目的是使用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。而THP(Transparent Huge Pages) 是从RHEL6 开始引入的一个功能,THP 是一个抽象层, 可以自动创建、管理和使用传统大页的大多数方面。
Huge pages can be difficult to manage manually, and often require significant changes to code in order to be used effectively. As such, Red Hat Enterprise Linux 6 also implemented the use of transparent huge pages(THP). THP is an abstraction layer that automates most aspects of creating, managing, and using huge pages.
THP hides much of the complexity in using huge pages from system administrators and developers. As the goal of THP is improving performance, its developers (both from the community and Red Hat) have tested and optimized THP across a wide range of systems, configurations, applications, and workloads. This allows the default settings of THP to improve the performance of most system configurations. However, THP is not recommended for database workloads.
在官方文档中最后一行写到: THP is not recommended for database workloads.
也就是 THP 不适用于在数据库上。因为数据库是不连续的内存访问模式,我们需要禁用THP以确保使用MongoDB获得最佳性能。
详细的有关 Huge Pages 和Transparent Huge Pages的介绍见 :文章
查看 Transparent Huge Pages 状态
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
#如果输出结果为[always]表示 THP 启用了。[never]表示 THP 禁用、[madvise]表示(只在MADV_HUGEPAGE标志的VMA中使用THP
脚本禁用 THP
创建 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
chmod 755 /etc/init.d/disable-transparent-hugepages # 设置具有可执行权限
chkconfig --add disable-transparent-hugepages # 设置开机自启
上面的配置需要重启主机才能生效。
生效配置
/etc/init.d/disable-transparent-hugepages start
配置 tuned 和 ktune
tuned
和ktune
是Red Hat和CentOS上可用的动态内核调优工具,可以禁用 THP 。
要在 tuned
和ktune
中禁用 THP, 需要我们将配置文件的THP值设置为 never,否则 tuned 或者 ktune 会更改我们设置的值。
When RHEL 7 / CentOS 7 run in a virtual environment, the
tuned
tool automatically invokes a performance profile derived from performance throughput, which automatically sets the readahead settings to 4MB. This can negatively impact performance.
CentOS 6
cp -r /etc/tune-profiles/default /etc/tune-profiles/no-thp
echo "set_transparent_hugepages never" >>/etc/tune-profiles/no-thp/ktune.sh
tuned-adm profile no-thp
CentOS 7
mkdir /etc/tuned/no-thp
cat << EOF >>/etc/tuned/no-thp/tuned.conf
[main]
include=virtual-guest
[vm]
transparent_hugepages=never
EOF
tuned-adm profile no-thp
测试修改是否生效
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
生效配置:
always madvise [never]
六、ulimit 设置
通常系统默认给用户的最大进程数和最大可以打开的文件数是比较低的,所以在启动 MongoDB
的时候我们会看到以下警告。
WARNING: soft rlimits too low. rlimits set to 4096 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.
官网的推荐配置是:
# 推荐配置
-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited [1]
-l (locked-in-memory size): unlimited
-n (open files): 64000
-m (memory size): unlimited [1] [2]
-u (processes/threads): 64000
我们可以直接更改用户的默认配置,也可以通过配置 systemd
服务,并参数写入 Service
。
cat <<EOF >>/usr/lib/systemd/system/mongodb.service
[Unit]
Description= mongodb service manager
[Service]
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (locked-in-memory size)
LimitMEMLOCK=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000
Type=forking
User=mongodb
Group=mongodb
PIDFile=/opt/mongodb/logs/mongod.pid
ExecStart= /opt/mongodb/bin/mongod -f /opt/mongodb/mongodb.conf
ExecStop= /opt/mongodb/bin/mongod --shutdown --dbpath /opt/mongodb/data
Restart=always
[Install]
WantedBy=multi-user.target
EOF
七、tcp_keepalive_time
该参数用于 TCP 发送 keepalive 探测消息的间隔时间(秒),用于确认 TCP 连接是否有效。
查看系统的默认值:
# 通过sysctl 查看
sysctl net.ipv4.tcp_keepalive_time
# 通过查看文件的值
cat /proc/sys/net/ipv4/tcp_keepalive_time
# 一般系统的默认值是 7200
Mongodb 官网建议将该值设置为 300 。
临时更改
systemctl -w net.ipv4.tcp_keepalive_time=300
永久更改,
echo "net.ipv4.tcp_keepalive_time = 300" >> /etc/sysctl.conf
sysctl -p
八、同步时间
如果我们部署的是副本集群,我们需要配置脚本,让这几台节点的的时间同步。
MongoDB 生产环境笔记的更多相关文章
- [译]MongoDb生产环境注意事项
译注: 本文是翻译MongoDB Manuel中的MongoDB Production Notes一节内容.这节内容重点关注生产环境中影响性能和可靠性的各种注意事项,值得正在部署MongoDB的工作者 ...
- mongodb生产环境(副本集模式)集群搭建配置
mongodb副本集模式由如下几部分组成: 1.路由实例mongos 2.配置实例configsvr 3.副本集集群replset(一主多从) tips: 1.以上实例都是mongod守护进程 2.以 ...
- java mongodb连接配置实践——生产环境最优
之前百度,google了很多,发现并没有介绍mongodb生产环境如何配置的文章, 当时想参考下都不行, 所以写篇文章,大家可以一块讨论下. 1. MongoClientOptions中的连接池配置: ...
- 一次生产环境下MongoDB备份还原数据
最近开发一个版本的功能当中用到了MongoDB分页,懒于造数据,于是就研究了下从生产环境上导出数据到本地来进行测试. 研究了一下,发现MongoDB的备份还原和MySQL语法还挺类似,下面请看详细介绍 ...
- prometheus+grafana 监控生产环境机器的系统信息、redis、mongodb以及jmx
介绍: 为了更好的对生产环境的一些中间件和操作系统的运行情况进行可视化的展示,近期了解了下prometheus加上grafana来实现这种效果,由于prometheus是新出来的开源项目,所以,监控的 ...
- 20190418 CentOS7实用技能综合:系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/RocketMQ/RabbitMQ编译安装 + ...各类常用生产环境软件的编译安装
系统安装 + WinScp客户端连接 + 防火墙端口号iptables + Nginx编译安装 + MySQL编译安装 + Redis编译安装 + MongoDB编译安装 + ActiveMQ/Roc ...
- Webpack4 学习笔记八 开发环境和生产环境配置
webpack resolve属性 webpack 区分开发环境和生产环境 webpack resolve属性 该选项的作用是设置模块如何被解析. resolve.alias: 设置别名, 在vue中 ...
- 【五】MongoDB管理之生产环境说明
下面详细说明影响mongodb的系统配置,尤其在生产环境上. 1.生产环境推荐的平台 Amazon Linux Debian 7.1 Red Hat / CentOS 6.2+ SLES 11+ Ub ...
- hbase centOS生产环境配置笔记 (1 NameNode, 1 ResourceManager, 3 DataNode)
本次是第一次在生产环境部署HBase,本文若有配置上的不妥之处还请高手指正. hadoop版本:hadoop-2.4.1 HBase版本:hbase-0.98.6.1-hadoop2 Zookeepe ...
随机推荐
- MySql添加远程超级管理员用户
可以通过发出GRANT语句增加新用户:首先在数据库本机上用ROOT用户登录上MySql,然后运行命令: mysql>GRANT ALL PRIVILEGES ON *.* TO admin'@' ...
- centos7 防火墙相关命令
启动:systemctl start firewalld禁用:systemctl stop firewalld重新载入规则:firewall-cmd --reload查看所有打开的端口:firewal ...
- Photoshop功能组成色彩快捷键
功能 专业测评 Photoshop的专长在于图像处理,而不是图形创作.图像处理是对已有的位图图像进行编辑加工处理以及运用一些特殊效果,其重点在于对图像的处理加工:图形创作软件是按照自己的构思创意,使用 ...
- rails应用的部署
简单部署 RAILS_ENV=production rake secret /etc/profile export SECRET_KEY_BASE=刚才生成的密钥 source /etc/profil ...
- Windows的奇巧淫技(为什么GIF显示不出来??)
谁的电脑里没点小秘密?东藏西藏到最后自己都找不到了有木有?今天教大家个隐藏文件的高招: 将任意文件隐藏到图片中!怎么样?再也不用建什么「马列主义哲学」的文件夹啦!
- 我的C++ 学习心得
创建这个博客已经是我大一下学期的暑假了,这一年里,我学习了人生第一门编程语言C++ . C++是一门当前仍然活跃于开发前沿的编程语言.在还未开始正式学习它时,早就听到我们的学长抱怨C++难学.起初,我 ...
- .Net持续集成 —— Jenkins+Git+WebDeploy
由于某些历史问题,最近终于可以从java中解脱出来,继续耕耘.Net了,第一步就是把之前的java项目翻成.net.之前已经实现过一次,翻起来还是比较快的(当然基础架构/实体模型已经重新思考并改进), ...
- 如何用kaldi做孤立词识别二
基本模型没有变化,主要是调参,配置: %WER 65% 下降到了 15% 后面再继续优化... Graph compilation finish!steps/decode.sh -- ...
- python异常报错详解
异常BaseException所有内置异常的基类.它不是直接由用户定义的类继承(为此使用Exception).如果 str()或者unicode()是在这个类的一个实例上被调用,返回实例的参数表示形式 ...
- 吴恩达机器学习笔记48-降维目标:数据压缩与可视化(Motivation of Dimensionality Reduction : Data Compression & Visualization)
目标一:数据压缩 除了聚类,还有第二种类型的无监督学习问题称为降维.有几个不同的的原因使你可能想要做降维.一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,而且它也让我们 ...