一、接着上文
上文介绍了mongodb sharding的分片集群搭建,本文侧重于讲述日志治理。
这里使用linux自带的日志治理工具logrotate,无论是哪个端口的进程,其日志治理方式类似。
查看/data目录下的文件大小,
du -hs *
二、Logrotate配置
#vi /etc/logrotate.d/mongo12000
/data/mongodb12000/log/mongo12000.log {
daily
copytruncate
notifempty
rotate 21
dateext
compress
delaycompress
missingok
sharedscripts
postrotate
if [ -f /data/mongodb12000/run/mongo12000.pid ]; then
kill -SIGUSR1 `cat /data/mongodb12000/run/mongo12000.pid`
fi
endscript
}
进程ID文件存储在/data/mongodb12000/run/mongo12000.pid,见下:
[root@mongo_test03 ~]# ll /data/mongodb12000/run/mongo12000.pid
-rw-r--r-- 1 mongo mongo 5 Jun 25 2023 /data/mongodb12000/run/mongo12000.pid
[root@mongo_test03 ~]# cat /data/mongodb12000/run/mongo12000.pid
1445
关于进程ID,
[root@mongo_test03 ~]# ps -ef | grep 12000
mongo 1445 1 9 2023 ? 25-05:17:11 /usr/local/mongodb-linux-x86_64-rhel70-4.0.27/bin/mongod -f /data/mongodb12000/cnf/mongo12000.cnf
查看配置文件
cat /data/mongodb12000/cnf/mongo12000.cnf
#日志目录
logpath = /data/mongodb12000/log/mongo12000.log
#进程ID文件
pidfilepath = /data/mongodb12000/run/mongo12000.pid
三、遇到的问题
1、cnf文件里配置的日志文件与logrotate.d配置的进程ID不一致
/data/mongodb40000/cnf/mongo40000.cnf 中的配置错误,
修改前:
#日志目录
logpath = /data/mongodb40000/log/mongo11000.log
#进程ID文件
pidfilepath = /data/mongodb40000/run/mongo11000.pid
[root@mongo_test03 log]# ll
total 14775004
-rw-r--r-- 1 mongo mongo 15129517397 Mar 29 10:24 mongo11000.log
-rw------- 1 mongo mongo 81082 Mar 29 12:25 mongo40000.log
[root@mongo_test03 log]# pwd
/data/mongodb40000/log
[root@mongo_test03 log]# cat /data/mongodb40000/run/mongo11000.pid
1221
这种错误,主要还是因为复制mongo40000.cnf的时候,遗漏修改端口号导致。
2、mongos 的日志治理失败
- 错误的logrotate配置
[root@mongo_test03 logrotate.d]# cat /etc/logrotate.d/mongo50000
/data/mongodb50000/log/mongo50000.log {
daily
copytruncate
notifempty
rotate 7
dateext
compress
delaycompress
missingok
sharedscripts
postrotate
if [ -f /data/mongodb50000/run/mongo50000.pid ]; then
kill -SIGUSR1 `cat /data/mongodb50000/run/mongo50000.pid`
fi
endscript
}
而实际上的进程ID文件是 /data/mongodb50000/run/mongos.pid,而非上面的/data/mongodb50000/run/mongo50000.pid。
所以导致logrotate未能对其进行日志治理,文件大小居然都1.6GB了。
而实际上/data/mongodb50000/run/目录下的进程ID文件名是mongos.pid,见下:
[root@mongo_test03 logrotate.d]# cat /data/mongodb50000/run/mongos.pid
1683
[root@mongo_test03 logrotate.d]# ps -ef | grep 50000
mongo 1683 1 0 2023 ? 1-15:24:17 /usr/local/mongodb-linux-x86_64-rhel70-4.0.27/bin/mongos -f /data/mongodb50000/cnf/mongo50000.cnf
修改文件/etc/logrotate.d/mongo50000中的mongo50000.pid为mongos.pid。
- 日志文件的路径错误,导致日志治理失败。
mongos的日志文件路径是在/data/mongodb50000/log/mongos.log, 而非/data/mongodb50000/log/mongo50000.log。需要再次修改/etc/logrotate.d/mongo50000。最终如下:
# 文件名可以是mongo50000,也可以是mongos, 换句话说,日志治理和文件名无关。
[root@mongo_test03 logrotate.d]# cat /etc/logrotate.d/mongo50000
# 日志文件的路径,需要修改为正确的路径
/data/mongodb50000/log/mongos.log {
daily
copytruncate
notifempty
rotate 7
dateext
compress
delaycompress
missingok
sharedscripts
postrotate
if [ -f /data/mongodb50000/run/mongos.pid ]; then
kill -SIGUSR1 `cat /data/mongodb50000/run/mongos.pid`
fi
endscript
}
四、定期执行治理
# vi /etc/crontab
30 2 * * * root /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
日志保留21天,最早保存日志的日期是20240308,并且压缩为gz,见上。
至此,mongodb的日志治理就介绍完了。