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
  |