1.安装MongoDB
当前机器通过rpm形式安装MongoDB。
jxd@jxd:/var/log/mongodb$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
上述为主机信息。
sudo apt-get install gnupg curl
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
--dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
sudo systemctl status mongod
查看mongo状态,可知其配置文件位于/etc/mongod.conf,日志位于/var/log/mongodb。
2. 文件系统
当前主机,文件系统如下所示:
查看mongod启动日志,可发现如下提示:
MongoDB更加推荐XFS文件系统,而非当前主机的ext4文件系统。在本人的《移动云重新挂载云硬盘》一文中,有描述如何挂载XFS格式盘,且针对MongoDB的数据库特点定制了挂载参数,参考如下:
[root@mongo-02 by-uuid]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Feb 24 01:46:24 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=********-e8c2-44cf-8edf-************ / ext4 defaults 1 1
UUID=********-7ae4-4eb1-8546-************ /data/mongodb/shard1 xfs defaults,noatime 0 0
UUID=********-27e7-4eeb-8322-************ /data/mongodb/shard2 xfs defaults,noatime 0 0
UUID=********-8a0d-4ca1-88c2-************ /data/mongodb/shard3 xfs defaults,noatime 0 0
3. 关闭Transparent Huge Pages (THP)
目的是通过使用大页内存来取代传统的 4kb 内存页面, 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。但是在传统的数据库应用中,例如MySQL以及MongoDB,开启THP功能只会降低数据库的吞吐效率,因此建议将其进行关闭。
jxd@jxd:/var/log/mongodb$ cat /sys/kernel/mm/transparent_hugepage/defrag
always defer defer+madvise [madvise] never
jxd@jxd:/var/log/mongodb$ cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
可以通过如上命令检查当前宿主机是否开启了THP,如果是always状态的话,那么就需要手动修改THP状态。
这里我通过添加systemd服务的方式,实现关闭THP功能。首先,创建/etc/systemd/system/disable-transparent-huge-pages.service
文件,输入如下内容:
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target
需要注意的是,在红帽的Linux发行版中,THP设置路径可能是:/sys/kernel/mm/redhat_transparent_hugepage/enabled
,这个需要自行确定并酌情修改上述配置文件。
创建完文件后,执行上述命令:
jxd@jxd:/var/log/mongodb$ sudo systemctl start disable-transparent-huge-pages
jxd@jxd:/var/log/mongodb$ sudo systemctl enable disable-transparent-huge-pages
Created symlink /etc/systemd/system/basic.target.wants/disable-transparent-huge-pages.service → /etc/systemd/system/disable-transparent-huge-pages.service.
jxd@jxd:/var/log/mongodb$ sudo systemctl status disable-transparent-huge-pages
○ disable-transparent-huge-pages.service - Disable Transparent Huge Pages (THP)
Loaded: loaded (/etc/systemd/system/disable-transparent-huge-pages.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Sep 19 22:33:17 jxd systemd[1]: Starting Disable Transparent Huge Pages (THP)...
Sep 19 22:33:17 jxd systemd[1]: disable-transparent-huge-pages.service: Deactivated successfully.
Sep 19 22:33:17 jxd systemd[1]: Finished Disable Transparent Huge Pages (THP).
jxd@jxd:/var/log/mongodb$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
4.提升文件句柄等参数
在/etc/security/limits.conf文件末尾添加如下内容:
jxd soft nproc 65535
jxd hard nproc 65535
jxd soft nofile 65535
jxd hard nofile 65535
这里需要注意的是,用户按照宿主机的实际情况填写。
执行ulimit -a查看文件句柄等参数是否调整成功。
5. 提升vm.max_map_count
查看日志,发现提示当前宿主机的vm.max_map_count参数较小,推荐从当前的65535调整为102400,因此往/etc/sysctl.conf文件追加vm.max_map_count = 102400
,并执行sudo sysctl -p
使改动生效。
6. 关闭SELinux
在当前的宿主机上没有启用SELinux,因此不做展示。
当前初始化Linux机器,默认关闭SELinux(我知道SElinux有一定的意义,但是不想为这点意义付出较多的时间去排查莫名的问题)已经成为常态了。
7. 开启NTP
若需要构建Mongo集群,那么集群中的宿主机开启NTP保持时间同步就至关重要了。
在当前的版本中,我更加推荐开启chronyd,设置如下:
8. 关闭NUMA
官方建议关闭NUMA。
9.调整vm.swappiness
swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60。
jxd@jxd:~$ cat /proc/sys/vm/swappiness
60
内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。MongoDB对内存的依赖性较大,占用的内存比较大,如果内存被交换至SWAP分区,将极大的降低运行效率。然而如果关闭swappiness(设置为0),在内存不足的情况下,就很有可能导致mongo服务被kill掉,因此建议修改swappiness数值为1,尽量降低交换的可能性。
在/etc/sysctl.conf
中添加vm.swappiness = 1
,并执行sudo sysctl -p
使其生效。
10. 磁盘调度器
可以通过如下命令查询磁盘的调度器:
[root@mongo-01 ~]# cat /sys/block/sda/queue/scheduler
[none] mq-deadline kyber bfq
可以看到当前选择的数据盘sda的调度器为none。
调优建议:
若部署于云主机上,或者采用的磁盘是云磁盘,那么推荐使用None调度器,将磁盘的调度彻底交给底层的宿主机;
若部署于裸金属等机器上,那么建议将磁盘调度器调整为deadline(当前磁盘支持mq-deadline);