Minio备份

Minio备份

#!/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
. /etc/profile

## 备份时间戳
## 备份类型 oss|hostPath
token="KrAyu4HaquejTMvXM9jCaCkeXMMWLG9McOyiV6DENYj6+j0skBe6qc6CHL2\/WU1FBnpGbAJTSekCcw4tTLiICkaYZ3QGwJPVdKcIpi7MaKP9srPIykg=="
webhook_url="https://*********/api/server/save"

# 企微相关配置
db_type="minio"
db_env="正式环境"
host=$(hostname)

TIME=`date +%Y%m%d`
bak_type="hostPath"
base_dir="/data/backup/minio"
back_dir="${base_dir}/${TIME}"
last_sun=`date +%Y%m%d   -d "last sun"`
last_sun_dir="${base_dir}/${last_sun}"
today_day=`date +%w`

## 备份开始时间
start_time=$(date "+%F %X")
# 备份保留时间
keep_time="15"

# 磁盘使用率达到百分之85
MAX_DISK_PERCENT="85"

if  [[ ! -d ${last_sun_dir} ]]; then
mkdir -p ${last_sun_dir}
fi 


# 判断当前磁盘剩余空间是否满足要求
CURRENT_PERCENT=$(df -P ${base_dir} | tail -1 | awk '{print $5 }' | cut -d'%' -f1)
if [ "${CURRENT_PERCENT}" -ge "${MAX_DISK_PERCENT}" ]; then
       cat  > ${base_dir}/webhook.json << EOF
{"table_name":"rt_backup","data":[
{
"name":"$bak_type",
"object":"$db_env",
"status":"失败",
"msg":"磁盘空间不足",
"ins_date":"$start_time"
}
]}

EOF

    curl -X POST -s -H "Token: ${token}" -H 'Content-Type: application/json' -d @${base_dir}/webhook.json ${webhook_url}
	exit 0
fi

# minio 配置
minio_host='http://10.201.40:31114'
minio_ak='staship'
minio_sk='starh022!'

# 对象存储相关配置
oss_ep=''
oss_ak=''
oss_sk=''
oss_bucket=""
oss_bak_dir="${cos_bucket}/${db_type}"

# 检测是否安装 rclone mc
## rclone工具路径
rclone_path="/usr/bin/rclone"
## mc工具地址
mc_path="/usr/bin/mc"

func() {
  bdir_size=$(du -sm $1 2>/dev/null |awk '{print $1}')
  bdir_files=$(find $1 -type f|wc -l)
  end_time=$(date "+%F %X")
  if [ ${bdir_size} -lt 1 ];then
    bak_status_col='warning'
    bk_status="Failed"
  else
    bak_status_col='info'
    bk_status="Succes"
  fi
       cat > ${base_dir}/webhook.json << EOF	   
{"table_name":"rt_backup","data":[
{"name":"$bak_type",
"object":"$db_env",
"status":"$bk_status",
"msg":"$bak_status_col",
"ins_date":"$start_time"
}
]}

EOF

  curl -X POST -s -H "Token: ${token}" -H 'Content-Type: application/json' -d @${base_dir}/webhook.json ${webhook_url}
}




if [[ ! -f ${rclone_path} ]]; then
  wget https://ykj-privatize.oss-cn-shenzhen.aliyuncs.com/%E5%B8%B8%E7%94%A8%E8%BD%AF%E4%BB%B6/rclone-current-linux-amd64.zip
  unzip rclone-current-linux-amd64.zip
  cp rclone-*-linux-amd64/rclone /usr/bin/
  chown root:root ${rclone_path}
  chmod 755 ${rclone_path}
fi

## 检测是否安装 mc
if [[ ! -f ${mc_path} ]]; then
  wget -O ${mc_path} https://ykj-privatize.oss-cn-shenzhen.aliyuncs.com/%E5%B8%B8%E7%94%A8%E8%BD%AF%E4%BB%B6/mc
  chmod 755 ${mc_path}
fi

## 配置minio api
${mc_path} config host add minio ${minio_host} ${minio_ak} ${minio_sk} --api s3v4

## 备份相关设定
if [ ${bak_type} == "oss" ]; then
  if [ ${oss_ep} ] && [ ${oss_ak} ] && [ ${oss_sk} ] && [ ${oss_bucket} ];then
    ## 生成 rclone配置文件
    rclone_config="/root/.config/rclone"	
    if [[ ! -f ${rclone_config}/rclone.conf ]]; then
      mkdir ${rclone_config}
      cat > ${rclone_config}/rclone.conf << EOF
[minio]
type = s3
env_auth = false
provider = Minio
access_key_id = ${minio_ak}
secret_access_key = ${minio_sk}
region = us-east-1
endpoint = ${minio_host}

[oss]
type = s3
provider = Other
env_auth = false
access_key_id = ${cos_ak}
secret_access_key = ${cos_sk} 
endpoint = ${cos_ep}
EOF
    fi
  else
    echo "oss 配置为空!!!"
	exit 0
  fi
  ## 挂载对象存储
  if ! $(mountpoint -q ${base_dir}); then
    /usr/bin/rclone mount oss:${cos_bak_dir} /data/backup --log-file=/var/log/rclone/rclone.log --log-level=INFO --log-format=date,time,microseconds,pid,longfile,shortfile --daemon
  fi  
elif [ ${bak_type} == "hostPath" ]; then 
  ## 生成 rclone配置文件
  rclone_config="/root/.config/rclone"
    if [ -f $rclone_config/rclone.conf ] ; then
    rm  -rf  $rclone_config/rclone.conf
    fi  
  if [[ ! -f ${rclone_config}/rclone.conf ]]; then
    mkdir ${rclone_config}
    cat > ${rclone_config}/rclone.conf << EOF
[minio]
type = s3
env_auth = false
provider = Minio
access_key_id = ${minio_ak}
secret_access_key = ${minio_sk}
region = us-east-1
endpoint = ${minio_host}
EOF
    fi 
else
  echo "${bak_type} NOT NULL"
  exit 1
fi    

bucket_list=($(mc ls minio| awk '{print $NF}'|tr -d '/'))

## 备份

if [ `ps -ef|grep rclone|grep -v -E "mount|grep"` ];then
  echo "已存在相关备份!!!"
  exit 2
else
  if [ $today_day -eq  0 ];then 
     mkdir -p ${back_dir}
     cd ${back_dir}
     for bucket in ${bucket_list[@]};do
        ${rclone_path} copy minio:${bucket} -P ${back_dir}/${bucket} --log-file=${back_dir}/miniodump-${bucket}.log -q
     done
	 func
  elif [ $today_day -ne 0 ];then
     cd ${last_sun_dir}
     for bucket in ${bucket_list[@]};do
	 ${rclone_path} copy minio:${bucket} -P ${last_sun_dir}/${bucket} --log-file=${last_sun_dir}/miniodump-${bucket}.log -q
     done
	 func
  fi 
fi


# 删除15天前的文件目录
find ${base_dir} -maxdepth 1 -type d -mtime  +${keep_time} |xargs rm -rf {};



posted @ 2023-04-10 15:40  小星奕的快乐  阅读(473)  评论(0)    收藏  举报