基于elasticsearch和elastalert的备份状态检查
作者:互联网
** 数据的备份(恢复)对于企业来说,是挽救生命的最后一根稻草;也是运维日常工作的一个重要组成部分。目前流行的方式是采用脚本对数据进行备份,并同步到远端进行异地备份。一旦需要备份的数据多了后,会面临以下问题:
1.备份是否成功,需要在每个脚本里进行判断并发送邮件,一旦涉及邮箱账号密码调整需要每个脚本调整,容易遗漏;
2. 对于日常审计要求,如何快速提供备份操作结果是个麻烦事情(登录到机器一个个的统计记录,容易吐);
之前看《devops最佳实践》一书中一个案例提及,他们公司所有服务器操作记录都集中存放到es,方便集中管理和IT审计。恰巧之前才在公司实现通过elk采集nginx日志,并通elastalert实现基于状态码和后端响应时间记录出现次数的把傲娇。并且kibana可以制作表格视图并导出,这样一来就解决日常备份的两个痛点。**
一,方案思路:
1,备份脚本任务一开始便向es中插入一条记录,该记录包括:备份开始时间,备份主机,备份脚本的完整路径和文件名,备份来源,备份目的,备份状态,备份结束时间,文件大小等;并记录插入成功的doc_id;
2,备份结束后,更新该条记录的字段态,主要是更新结束时间,备份状态(默认failed改为success),文件大小等。
备注:
A,通过开始和结束时间,计算出总的备份时间,方便调整更新窗口;
B,通过对备份状态字段的值判断,如果为failed则发送邮件报警;
C,通过文件大小,可以评估磁盘容量使用情况,方便进行容量规划;
二, 实现脚本(数据库备份为例)
由于整体脚本比较简单,只列shell插入es部分脚本
1,开始插入记录
curl -s -H 'Content-Type: application/json' XPUT http://$esUrl/backup_$(date +%Y%m%d)/log/ -d 'br/>{
"@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插件浏览数据如下
四,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"
五,报警邮件截图
由于是测试,所以我备份记录状态全是失败
标签:name,记录,type,备份,elastalert,failed,elasticsearch,backup 来源: https://blog.51cto.com/emulator/2370949