MongoDB 生产环境笔记

MongoDB 生产环境笔记

在生产环境中,我们配置MongoDB需要注意点有很多,而不是一安装就可以使用。我们需要配置一些内核和系统参数。因为这些参数是会影响到我们 MongoDB 的性能的。
如果你的MongoDB 实例所在的服务器还有其它业务和应用,那么修改下面的参数需要注意是否会影响其它应用的性能和运行状态。

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

需要配置的点有:

一、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

tunedktune是Red Hat和CentOS上可用的动态内核调优工具,可以禁用 THP 。

要在 tunedktune 中禁用 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

八、同步时间

如果我们部署的是副本集群,我们需要配置脚本,让这几台节点的的时间同步。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读552次。com.mongodb.MongoQueryException: Query failed with error code 292 and error message 'Executor error during find command :: caused by :: Sort exceeded memory limit of 104857600 bytes, but did not opt in to external sorting.' on server 11.51.141.63:27017 _mongodb 大文件 下载失败
文章浏览阅读635次,点赞9次,收藏8次。MongoDB 是一种 NoSQL 数据库,它将每个数据存储为一个文档,这里的文档类似于 JSON/BSON 对象,具体数据结构由键值(key/value)对组成。
文章浏览阅读2.1k次。和。_mongodb 日期类型
文章浏览阅读1.7k次。Scalestack等客户期待使用MongoDB Atlas Vector Search和Amazon Bedrock构建下一代应用程序
文章浏览阅读970次。SpringBoot整合中间件mongodb、ES_springboot3 elasticsearch json数据
文章浏览阅读673次。MongoDB 简介_尚医通sql
文章浏览阅读1k次,点赞8次,收藏9次。官网下载MongoDB安装包后进行解压(因了解并不深入,故暂不进行详细说明,自行查找其他安装方法,后期了解深入后将进行该教程的完善)在bin目录下使用命令启动:./mongod --config …/mongodb.conf。该文章任然处于完善中,如果存在错误遗漏的地方,欢迎私信联系。安装相关的nuget包后即可通过以下方法连接数据。YX9010_0@的第二十篇文章。
文章浏览阅读1.2k次,点赞17次,收藏26次。社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日
文章浏览阅读686次。您可以使用 update_one() 方法来更新 MongoDB 中调用的记录或文档。update_one() 方法的第一个参数是 query 对象,用于定义要更新的文档。注释:如果查询找到多个记录,则仅更新第一个匹配项。第二个参数是定义文档新值的对象。_python 更新 mongodb 数据
文章浏览阅读1.3k次。首先来学习一下nosql这里安装就不进行介绍 只记录一下让自己了解mongodb。_nosql注入
文章浏览阅读4.1k次,点赞8次,收藏7次。在data的目录下,创建一个db文件。因为启动MongoDB服务之前必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功。第一步:安装时,Custom是指可以自定义安装路径,然后傻瓜式安装即可(注意:先不要安装图形化工具,否则安装时间会特别长):如果要想连接成功,必须要开服务,即mongod -dbpath C:MongoDBdatadb的cmd要一直开着。然后回车,ctrl+F输入port找到端口号,一般为:27017。打开命令行,然后找到bin文件地址,并输入。_mongodb windows安装
文章浏览阅读5.1k次,点赞3次,收藏43次。详细介绍MongoDB数据库的基本知识,安装方法,基本操作,_mongodb数据库
文章浏览阅读3.2k次。安装教程翻看以往文章。_navicat 连接mongodb
文章浏览阅读426次,点赞9次,收藏12次。win10开放端口:https://blog.csdn.net/m0_43605481/article/details/119255256。我的是阿里云服务器,所以直接在安全组中加入规则,端口范围:27017,授权对象:0.0.0.0。windows在mongodb安装文件夹的bin文件夹中的mongod.cfg。数据库名字是test,打算创建一个用户,账号aaa,密码bbb,权限readWrite。因为该用户是创建在test数据库的,所以在最后要加上test。O了,然后恢复了test的数据。
文章浏览阅读1.1k次。聚合操作主要用于处理数据并返回计算结果。聚合操作将来自多个文档的值组合在一起,按条件分组后,再进行一系列操作(如求和、平均值、最大值、最小值)以返回单个结果。MongoDB的聚合查询​聚合是MongoDB的高级查询语言,它允许我们通过转化合并由多个文档的数据来生成新的在单个文档里不存在的文档信息。MongoDB中聚合(aggregate)主要用于处理数据(例如分组统计平均值、求和、最大值等),并返回计算后的数据结果,有点类似sql语句中的count(*)、groupby。..._如何将几个db的数据统整在一起做查询
文章浏览阅读680次,点赞7次,收藏8次。(2)application.properties配置文件。(4)UserService类。(5)测试和测试结果。
文章浏览阅读1k次,点赞17次,收藏25次。Studio 3T 2023.9 (macOS, Linux, Windows) - MongoDB 的专业 GUI、IDE 和 客户端,支持自然语言查询_mongodb客户端
文章浏览阅读1.1k次,点赞32次,收藏27次。插件式的存储引擎架构可以实现 Server 层和存储引擎层的解耦,可以支持多种存储引擎,如 MySQL 既可以支持 B-Tree 结构的 InnoDB 存储引擎,还可以支持 LSM 结构的 RocksDB 存储引擎。MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。的简称,是 JSON 文档的二进制表示,支持将文档和数组嵌入到其他文档和数组中,还包含允许表示不属于 JSON 规范的数据类型的扩展。
文章浏览阅读5.1k次,点赞6次,收藏96次。本文设计了一种基于智能室内温度控制的自动调速风扇。以STM32系列单片机为核心主控板,通过程序代码驱动和使用温度传感器模块实现对环境温度的实时监测,并可以实时显示环境温度。同时,可以设置温度检测的上下警告值,根据需求自行调节。_stm32 温控风扇
文章浏览阅读898次,点赞13次,收藏21次。在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样。_pymongo find_one