1. 程式人生 > >基於elasticsearch和elastalert的備份狀態檢查

基於elasticsearch和elastalert的備份狀態檢查

pro shel shell xxxxx 容易 如何快速 hour 方式 ofo

一,業務背景
數據的備份(恢復)對於企業來說,是挽救生命的最後一根稻草;也是運維日常工作的一個重要組成部分。目前流行的方式是采用腳本對數據進行備份,並同步到遠端進行異地備份。一旦需要備份的數據多了後,會面臨以下問題:
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"‘",
br/>"@timestamp":"‘"${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:
  • "[email protected]"

六,報警郵件截圖

由於是測試,所以我備份記錄狀態全是失敗.

技術分享圖片

基於elasticsearch和elastalert的備份狀態檢查