一,业务背景
数据的备份(恢复)对于企业来说,是挽救生命的最后一根稻草;也是运维日常工作的一个重要组成部分。目前流行的方式是采用脚本对数据进行备份,并同步到远端进行异地备份。一旦需要备份的数据多了后,会面临以下问题:
1.备份是否成功,需要在每个脚本里进行判断并发送邮件,一旦涉及邮箱账号密码调整需要每个脚本调整,容易遗漏;

  1. 对于日常审计要求,如何快速提供备份操作结果是个麻烦事情(登录到机器一个个的统计记录,容易吐);
    之前看《devops最佳实践》一书中一个案例提及,他们公司所有服务器操作记录都集中存放到es,方便集中管理和IT审计。恰巧之前才在公司实现通过elk采集nginx日志,并通elastalert实现基于状态码和后端响应时间记录出现次数的报警。并且kibana可以制作表格视图并导出,这样一来就解决日常备份的两个痛点。

二,方案思路:

1,备份脚本任务一开始便向es中插入一条记录,该记录包括:备份开始时间,备份主机,备份脚本的完整路径和文件名,备份来源,备份目的,备份状态,备份结束时间,文件大小等;并记录插入成功的doc_id;

2,备份结束后,更新该条记录的字段态,主要是更新结束时间,备份状态(默认failed改为success),文件大小等。

3, 备注:
A,通过开始和结束时间,计算出总的备份时间,方便调整更新窗口;
B,通过对备份状态字段的值判断,如果为failed则发送邮件报警;
C,通过文件大小,可以评估磁盘容量使用情况,方便进行容量规划;

三, 实现脚本(数据库备份为例)

 由于整体脚本比较简单,只列shell插入es部分脚本
     1,开始插入记录
  curl -s -H 'Content-Type: application/json' XPUT http://$esUrl/backup_$(date +%Y%m%d)/log/ -d '{
"@timestamp":"'"${startYmd}T${startHMS}+08:00"'",
"start_time":"'"${startYmd}T${startHMS}+08:00"'",
"backup_host":"'"$(hostname)"'",
"command_info":"'"${backup_command}"'",
"backup_source":"'"${backup_source}"'",
"backup_dest":"'"${backup_dest}"'",
"backup_type":"'"${backup_type}"'",
"backup_name":"'"${backup_name}"'",
"last_time":0,
"backup_status":"failed",
"end_time":"1970-01-01T00:00:00+08:00"

}' > /tmp/${backup_name}.json

2,更新记录

 其中变量doc_id为前一步中  /tmp/${backup_name}.json 存放的插入es记录的返回结果(用jq进行json解析)

 curl -s -H 'Content-Type: application/json' XPUT http://$esUrl/backup_$(date +%Y%m%d)/log/$doc_id/_update -d '{"doc":{"last_time":"'"${last_time}"'","end_time":"'"${endYmd}T${endHMS}+08:00"'","backup_status":"success","backup_size":"'"${backup_size}"'"}}'

四,es 数据结果

     head插件数据结果查询:

基于elasticsearch和elastalert的备份状态检查

五,elastalert报警

 elastalert安装可以参考网上文档,配置报警规则:查询最近12小时以内记录,如果备份状态为failed的记录出现1次,则发送报警邮件,规则的如下:

name: backup
type: frequency
attach_related: true
index: backup
num_events: 1 #出现次数
timeframe:
hours: 12 #查询最近12小时
filter:

  • term:
    backup_status.keyword: failed #备份状态为 failed
    alert:
  • "email"
    alert_subject: "Elastalert {0} {1} {2} {3} option failed occurred"
    alert_subject_args:
  • "backup_host"
  • "command_info"
  • "backup_type"
  • "name"
    alert_text_type: exclude_fields
    alert_text: |
    alert_text_args:
  • "backup_host"
  • "backup_source"
  • "backup_type"
  • "command_info"
  • "backup_status"
    include: ["command_info","backup_host","backup_type"]
    top_count_keys: ["command_info","backup_host","backup_type"]
    raw_count_keys: true
    email:
  • "xxxxx@test.com"

六,报警邮件截图

由于是测试,所以我备份记录状态全是失败.

基于elasticsearch和elastalert的备份状态检查