在doris系统中过多的日志和core文件会占用非常多的磁盘, 特别是doris be宕机的时候生成的core文件有时候特别大, 遇到过生成的core文件100G多, 所以清理是必不可少的.
下面介绍了一个清理脚本的使用.
#!bin/bash
RETVAL=0
## fe日志目录, 无则随意填写, 启动时不用启动fe日志清理即可
fe_log_dir=/data/doris-fe/log
## fe元数据备份目录
fe_meta_backup_dir=/opt/vipkid/fe-meta-backup
## be日志目录, 无则随意填写, 启动时不用启动be日志清理即可
be_log_dir=/opt/doris-be/log
## be core文件目录, 一般在bin中. 无则随意填写, 启动时不用启动be日志清理即可
core_dir=/opt/doris-be/bin
## 一般be部署在系统盘上, 多余的core文件移动到较大的数据盘中. 无则随意填写, 启动时不用启动be日志清理即可
target_dir=/data1/cores
## broker日志目录. 无则随意填写, 启动时不用启动broker日志清理即可
broker_log_dir=/opt/doris-broker/log
## nginx日志目录. 包含 access.log, error.log等
nginx_log_dir=/data/logs/nginx
## proxysql目录, 日志目录配置详见: /etc/proxysql.cnf
## datadir="/opt/proxysql/data"
## errorlog="/opt/proxysql/log/error.log"
##
## 变量配置
## SET mysql-eventslog_filename='queries.log';
## SET mysql-auditlog_filename='queries_audit.log';
proxysql_log_dir=/opt/proxysql
## 通用日志删除方法, 并且输出会删除哪些日志文件
delete_log()
{
log_dir=$1
log_formater=$2
keep_days=$3
cd $log_dir
deleting_file_count=`ls $log_formater | wc -l`
if [ "$deleting_file_count" -gt "0" ];then
echo -----需要删除的日志文件列表 ⬇
find $log_formater -mtime $keep_days
echo -----需要删除的日志文件列表 ⬆
find $log_formater -mtime $keep_days | xargs -r rm -rf
else
echo 未找到任何匹配的文件: $log_formater, 不用执行删除日志操作
fi
}
## 清理目录中的core文件, 只保留最新的一个
clean_and_left_lastest_core_file()
{
core_dir=$1
core_file_formater=$2
cd $core_dir
core_file_count=`ls $core_file_formater | wc -l`
if [ "$core_file_count" -gt "0" ];then
lastest_core_file=`ls -lrt $core_file_formater | awk -F' ' 'END {print $9}'`
for core_file in `ls $core_file_formater`
do
if [ $core_file == $lastest_core_file ];then
echo $core_dir/$core_file 是最新的core,需要保留
else
echo '' > $core_file
rm -f $core_file
echo $core_dir/$core_file删除完成
fi
done
fi
}
## 1. 清理be宕机时产生的core文件, 只保留最新的一个, 并且将其移动到新目录中
## 2. 清理新目录中的core文件, 只保留最新的一个
clean_core_files()
{
core_dir=$1
target_dir=$2
core_file_formater=$3
cd $core_dir
core_file_count=`ls $core_file_formater | wc -l`
if [ "$core_file_count" -gt "0" ];then
lastest_core_file=`ls -lrt $core_file_formater | awk -F' ' 'END {print $9}'`
for core_file in `ls $core_file_formater`
do
if [ $core_file == $lastest_core_file ];then
mv $core_file $target_dir/
echo $core_dir/$core_file 是最新的core,不用删除,已经移动到 $target_dir
else
echo '' > $core_file
rm -f $core_file
echo $core_dir/$core_file 处理完成
fi
done
fi
clean_and_left_lastest_core_file $target_dir $core_file_formater
}
## 删除除了最新的之外的所有指定文件, 最新的日志文件清空内容
clean_and_left_latest_log()
{
log_dir=$1
log_formater=$2
cd $log_dir
file_count=`ls $log_dir | wc -l`
if [ "$file_count" -gt "0" ];then
lastest_file=`ls -lrt $log_formater | awk -F' ' 'END {print $9}'`
for log_file in `ls $log_formater`
do
if [ $log_file == $lastest_file ];then
echo '' > $log_file
echo $log_dir/$log_file 是最新的日志, 已经清理内容
else
echo '' > $log_file
rm -f $log_file
echo $log_dir/$log_file 删除完成
fi
done
fi
}
## 清理be日志文件和core文件
clean_be_log()
{
log_dir=$be_log_dir
delete_log $log_dir "be.INFO.log.20*" "+3"
core_file_formater="core.*"
clean_core_files $core_dir $target_dir $core_file_formater
}
## 清理fe的gc日志、审计日志、和正常的fe日志.
## 除了审计日志保留30天外, 其余的都保留3天
clean_fe_log()
{
log_dir=$fe_log_dir
delete_log $log_dir "gc.log.20*" "+3"
delete_log $log_dir "fe.gc.log.20*" "+3"
delete_log $log_dir "fe.audit.log.20*" "+30"
delete_log $log_dir "fe.log.20*" "+3"
}
## 清理fe备份的元数据文件
clean_fe_meta_backup()
{
log_dir=$fe_meta_backup_dir
delete_log $log_dir "doris-meta-20*.gz" "+3"
}
## 清理broker的日志, 保留3天
clean_broker_log()
{
log_dir=$broker_log_dir
delete_log $log_dir "apache_hdfs_broker.log.20*" "+3"
}
## 清理proxysql日志, 审计日志保留30天, 查询日志保留3天, 错误日志保留最新一个
clean_proxysql_log()
{
log_dir=$proxysql_log_dir
query_log_formater=queries.log.*
queries_audit_log_formater=queries_audit.log.*
error_log_formater=error.log
delete_log "$log_dir/data" $query_log_formater "+3"
delete_log "$log_dir/data" $queries_audit_log_formater "+30"
clean_and_left_latest_log "$log_dir/log" $error_log_formater
}
## 清理nginx日志
clean_nginx_log()
{
log_dir=$nginx_log_dir
error_log_formater=error.log
access_log_formater=access.log
mirror_error_log_formater=error_mirror.log
mirror_access_log_formater=access_mirror.log
clean_and_left_latest_log $log_dir $error_log_formater
clean_and_left_latest_log $log_dir $access_log_formater
clean_and_left_latest_log $log_dir $mirror_error_log_formater
clean_and_left_latest_log $log_dir $mirror_access_log_formater
}
echo '-------⬇ 开始清理日志-------' `date '+%Y-%m-%d %H:%M:%S'`
case "$1" in
fe)
clean_fe_log
;;
fe_meta_backup)
clean_fe_meta_backup
;;
be)
clean_be_log
;;
broker)
clean_broker_log
;;
proxysql)
clean_proxysql_log
;;
nginx)
clean_nginx_log
;;
*)
echo $"Usage: sh $0 {fe|fe_meta_backup|be|broker|proxysql|nginx}"
esac
echo '-------⬆ 完成清理日志-------' `date '+%Y-%m-%d %H:%M:%S'`
exit $RETVAL
cd /opt
vim doris-cleaner.sh
将第二步中修改好的清理脚本内容拷贝到 doris-cleaner.sh中, 保存
crontab -e
# 第一种方式: 会输出清理日志
*/10 * * * * cd /opt && sh doris-cleaner.sh be >> doris-cleaner-be.log
*/10 * * * * cd /opt && sh doris-cleaner.sh broker >> doris-cleaner-broker.log
*/10 * * * * cd /opt && sh doris-cleaner.sh fe >> doris-cleaner-fe.log
0 3 */1 * * cd /opt && sh doris-cleaner.sh fe_meta_backup >> doris-cleaner-fe.log
0 3 */7 * * cd /opt && sh doris-cleaner.sh proxysql >> doris-cleaner-proxysql.log
0 3 */7 * * cd /opt && sh doris-cleaner.sh nginx >> doris-cleaner-nginx.log
# 第二种方式: 不输出清理日志
*/10 * * * * cd /opt && sh doris-cleaner.sh be > /dev/null
*/10 * * * * cd /opt && sh doris-cleaner.sh broker > /dev/null
*/10 * * * * cd /opt && sh doris-cleaner.sh fe > /dev/null
0 3 */1 * * cd /opt && sh doris-cleaner.sh fe_meta_backup > /dev/null
0 3 */7 * * cd /opt && sh doris-cleaner.sh proxysql > /dev/null
0 3 */7 * * cd /opt && sh doris-cleaner.sh nginx > /dev/null
## 以下命令二选一, 任意一个执行成功, 都算定时任务保存成功
service restart crond
/bin/systemctl restart crond.service
欢迎添加微信,互相学习↑↑↑ -_-
白老虎
programming is not only to solve problems, ways to think
grafana 级连 菜单 templating (variables) 配置
AI 机器人 抓取 微信 聊天中的 百度网盘 分享地址和密码
rocketmq 集群搭建 (2master + 2slave + 2namesrv)