[最佳实践] - 如何处理Doris日志和core文件占用磁盘的问题

50人浏览 / 0人评论

在doris系统中过多的日志和core文件会占用非常多的磁盘, 特别是doris be宕机的时候生成的core文件有时候特别大, 遇到过生成的core文件100G多, 所以清理是必不可少的. 下面介绍了一个清理脚本的使用.

第一步: 准备doris环境信息

  • 确认每个fe, be, broker的安装目录, 日志目录, core文件目录(core文件一般在bin目录中)
  • 如果是be, 则创建一个数据盘目录/data/cores, 用来备份多余的core文件

第二步: 用第一步的结果, 修改清理脚本中对应的变量值

#!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

第五步: 观察对应的清理输出清理日志

  • /opt/doris-cleaner-fe.log
  • /opt/doris-cleaner-be.log
  • /opt/doris-cleaner-broker.log

全部评论