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

数据分析

2021-01-21

5

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

欢迎添加微信,互相学习↑↑↑ -_-

发表评论

全部评论:0条

白老虎

programming is not only to solve problems, ways to think