MongoDB安装部署

Linux配置

Limit配置

操作系统默认的limit限制非常小,在实际生产运行过程中容易出现文件描述符不足或线程数不足问题,因此可以手动设置一个较大的值

1
2
3
4
5
cat /etc/security/limits.conf
mongodb soft nofile 65535
mongodb hard nofile 65535
mongodb soft nproc 65535
mongodb hard nproc 65535

关闭selinux

selinux是一个安全配置,开启可能导致数据库连接失败,建议关闭

1
2
3
[root@t-luhx01-v-szzb ~]# setenforce 0
[root@t-luhx01-v-szzb ~]# vi /etc/sysconfig/selinux
SELINUX=disabled

禁用transparent_hugepage

Transparent Huge Pages(THP)是Linux的一种内存管理优化手段,通过使用更大的内存页来减少Translation Lookaside Buffer(TLB)的额外开销,但针对数据库随机读写的场景不是特别合适,建议关闭 创建服务脚本`/etc/init.d/disable-transparent-hugepages

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/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

添加服务

1
2
sudo chmod 755 /etc/init.d/disable-transparent-hugepages
sudo chkconfig --add disable-transparent-hugepages

执行脚本并查看

1
2
3
[root@t-luhx01-v-szzb ~]# sudo /etc/init.d/disable-transparent-hugepages start
[root@t-luhx01-v-szzb ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[root@t-luhx01-v-szzb ~]# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

禁用NUMA

NUMA:Non-Uniform Memory Access是一种内存管理技术,将多核处理器的操作系统上的资源分为多个NODE,每个进程会分配到一个NODE上,当NODE的内存不足时,会利用SWAP进行缓存,导致数据库性能下降。建议在进程启动时将其关闭或在内核中全局关闭

1
numactl --interleave=all /usr/local/mongodb/bin/mongod ......

设置readhead

MongoDB为随机IO,readhead应该设置为一个较小的值来减少内存占用,通常考虑设置为8~32

1
2
3
4
5
6
7
[root@t-luhx01-v-szzb ~]# blockdev --report
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw  8192   512  4096          0     42949672960   /dev/sda
rw  8192   512  1024       2048       419430400   /dev/sda1
rw  8192   512  4096     821248     42529193984   /dev/sda2

[root@t-luhx01-v-szzb ~]# blockdev --setra 16 /dev/mapper/dbvg-dblv

设置磁盘调度策略

磁盘调度策略建议在虚拟化或SSD的环境中采用noop,也可以使用deadline

1
2
3
[root@t-luhx01-v-szzb ~]# dmesg | grep -i scheduler
[root@t-luhx01-v-szzb ~]# cat /sys/block/nvme1n1/queue/scheduler 
[root@t-luhx01-v-szzb ~]# grubby --update-kernel=ALL --args="elevator=noop"

内核参数设置

1
2
3
4
5
6
7
8
cat >> /etc/sysctl.conf << EOF
fs.file-max=98000
kernel.pid_max=64000
kernel.threads-max=64000
vm.max_map_count=128000
vm.zone_reclaim_mode=0
net.ipv4.tcp_keepalive_time=300
EOF

文件系统

MongoDB数据磁盘建议采用RAID10+SSD来保障数据安全及性能,文件系统格式官方建议采用XFS。

针对文件系统设置,可以考虑进一步禁用atime,避免频繁更新文件的访问时间,提升文件读取性能。

Reference

production-notes production-checklist-operations

MongoDB实例安装

下载介质

MongoDB Community Download | MongoDB

解压安装包

1
2
[root@t-luhx01-v-szzb ~]# mkdir /usr/local/mongodb
[root@t-luhx01-v-szzb ~]# tar -xvf mongodb-linux-x86_64-rhel62-4.0.0.tgz -C /usr/local/mongodb --strip-components=1

创建数据目录

1
mkdir /service/mongodb/{data,log,conf,key} -p

配置参数文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
cat >> /service/mongodb/conf/config.conf <<EOF
systemLog:
  destination: file
  path: "/service/mongodb/log/mongod.log"
  logAppend: true
  logRotate: reopen
  timeStampFormat: iso8601-local
storage:
  dbPath: "/service/mongodb/data"
  journal:
    enabled: true
    commitIntervalMs: 100
  directoryPerDB: true
  syncPeriodSecs: 60
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      ## recommend:About 60% of physical memory 
      cacheSizeGB: 2
processManagement:
  fork: true
  pidFilePath: "/service/mongodb/data/mongod.pid"
net:
  bindIp: 10.0.139.161
  port: 27017
  maxIncomingConnections: 10000
operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 200
EOF

配置环境变量

1
echo "export PATH=$PATH:/usr/local/mongodb/bin" >>/etc/profile

启动mongodb

1
numactl --interleave=all /usr/local/mongodb/bin/mongod --config /service/mongodb/conf/config.conf

创建root用户

1
2
3
4
5
6
7
mongo mongodb://10.0.139.161:27017/admin
mongodb> use admin
mongodb> db.createUser(
{
user:"root",
pwd:"abcd123#",
roles:[{role:"root",db:"admin"}] })

生成keyfile

1
2
openssl rand -base64 756 > /service/mongodb/key/rsa_key
chmod 600 /service/mongodb/key/rsa_key

开启用户认证

1
2
3
4
5
cat >> /etc/mongodb/config.conf <<EOF
security:
  keyFile: "/service/mongodb/key/rsa_key"
  authorization: enabled
EOF

重启数据库实例

1
2
mongod --config /service/mongodb/conf/config.conf --shutdown
numactl --interleave=all /usr/local/mongodb/bin/mongod --config /service/mongodb/conf/config.conf

登录mongodb

1
mongo mongodb://root:abcd123#@10.0.139.161:27017/admin
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus