MongoDB 生产环境笔记

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: MongoDB 生产环境笔记目录MongoDB 生产环境笔记一、vm.zone_reclaim_mode 参数二、添加 swap 分区三、设置 swappiness 参数四、内核和文件系统版本五、禁用 Transparent Huge Pages (THP)六、ulimit 设置七、tcp_keepalive_time八、同步时间MongoDB 生产环境笔记在生产环境中,我们配置MongoDB需要注意点有很多,而不是一安装就可以使用。

MongoDB 生产环境笔记
目录

MongoDB 生产环境笔记
一、vm.zone_reclaim_mode 参数
二、添加 swap 分区
三、设置 swappiness 参数
四、内核和文件系统版本
五、禁用 Transparent Huge Pages (THP)
六、ulimit 设置
七、tcp_keepalive_time
八、同步时间
MongoDB 生产环境笔记
在生产环境中,我们配置MongoDB需要注意点有很多,而不是一安装就可以使用。我们需要配置一些内核和系统参数。因为这些参数是会影响到我们 MongoDB 的性能的。
如果你的MongoDB 实例所在的服务器还有其它业务和应用,那么修改下面的参数需要注意是否会影响其它应用的性能和运行状态。

官方文档链接:https://docs.mongodb.com/manual/administration/production-notes/

需要配置的点有:

vm.zone_reclaim_mode
添加swap分区
设置 swappiness 参数
内核和文件系统版本
禁用 Transparent Huge Pages (THP)
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 <>/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
八、同步时间
如果我们部署的是副本集群,我们需要配置脚本,让这几台节点的的时间同步。

作者:理想三旬
    
出处:https://www.cnblogs.com/operationhome/

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
7月前
|
存储 NoSQL 关系型数据库
【MongoDB系列笔记】索引
索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
57 1
|
7月前
|
存储 JSON NoSQL
【MongoDB系列相关笔记】常用命令
本文主要介绍了常见的MongoDB命令操作;结合某个案例需求,将数据库操作,集合操作,文档基本的CURD以及分页查询等命令进行详细说明。
217 0
|
7月前
|
NoSQL JavaScript Linux
【MongoDB系列相关笔记】单机部署
本文主要介绍了Windows和Linux系统中安装和启动MongoDB的步骤。
178 0
|
7月前
|
存储 NoSQL 关系型数据库
【MongoDB系列笔记】MongoDB相关概念
MongoDB 是一个开源、高性能、无模式的文档型数据库,常用于处理高并发、海量数据的场景,尤其适合社交、游戏、物流、物联网和视频直播等领域。与传统的关系型数据库相比,MongoDB 更适合存储结构较为灵活、数据量大且事务性要求不高的数据。当面临高读写需求、大规模数据存储和高可扩展性需求时,可以选择 MongoDB。MongoDB 支持类似于 JSON 的 BSON 数据格式,具有丰富的数据模型,如文档、集合和数据库,以及强大的查询和索引功能。此外,MongoDB 提供复制集以实现高可用性和水平扩展性,以适应业务发展和数据增长。
175 0
|
7月前
|
NoSQL Java MongoDB
MongoDB笔记
MongoDB笔记
54 0
|
运维 NoSQL MongoDB
[慕课笔记]mongodb入门篇
[慕课笔记]mongodb入门篇
68 1
|
前端开发 JavaScript NoSQL
[慕课笔记] node+mongodb建站攻略
[慕课笔记] node+mongodb建站攻略
59 0
|
NoSQL JavaScript MongoDB
MongoDB随手笔记(二)
MongoDB随手笔记(二)
MongoDB随手笔记(二)
|
SQL 存储 JSON
MongoDB随手笔记(一)
MongoDB随手笔记(一)
MongoDB随手笔记(一)
|
存储 JSON NoSQL
mongodb笔记
mongodb笔记
425 0