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
|