1. 程式人生 > >記crond導致備份失敗的排查過程

記crond導致備份失敗的排查過程

備份系統 對比 ron 不知道 手動 而不是 產生 自己 數據庫

  

  今天上班的路上收到一條短信,顯示線上所有實例備份都失敗了。備份失敗是大事,於是到公司的第一件事兒就是排查備份失敗的原因。

  這兩天遷移了數據庫管理平臺,當然涉及到數據庫備份功能,備份失敗肯定和平臺遷移有一定關系,我們先聊聊線上備份方案:

  

  目前線上的備份方案是:

    1、有一個前端頁面可以配置備份任務

    2、備份任務配置好了,會自動刷新到系統的crontab定時通過ansible遠程執行。

排查過程:

1、查看備份報告,顯示所有的備份文件大小都是0,初步估計是備份失敗了而不是元數據沒有更新的問題。

2、去機器上面查看備份日誌:

技術分享

從日誌上面查看是備份已經成功,但是去過去備份文件大小的時候拋文件不存在的異常。

不知道大家有沒遇到這種情況,不過問看到這種現象首先想到的是有多個任務在跑,上一個備份還沒完成就被另外一個備份任務將備份文件刪除了。方面就初步出來了,就是要找到另外一個任務是怎麽來的。

3、我先挑選了一個比較小的非核心集群,嘗試了手動執行了crontab裏面的備份命令,備份成功(這只是確認一下,因為平臺遷移後測試過備份任務是沒有問題的)

4、由於每一個集群的備份全部失敗了,也就是說,兩個備份任務能連接到線上所有的mysql機器,有這權限的只有3臺服務器,於是去查了這三臺服務器是否有重復的定時任務。結果只有一臺機器上面才定時任務。

5、上面的嘗試也沒找到原因,就只能繼續嘗試,將備份任務的時間修改為當前時間+2分鐘,讓它定時執行看是否正常。

結果和晚上備份情況一樣還是失敗。

6、到這個時候我已經有點懵了,感覺這個太不科學了,期間還讓開發平臺的同事幫忙查看了代碼裏面生成crontab部分是否有問題,比如在其他機器上同時有生成,結果都是大失所望。

7、繼續其他嘗試,對比手動執行和定時任務產生的進程:

在目標機器使用ps -ef |grep backup.sh

a) 手動執行的時候:為2個進程

b) crontab定時執行的時候:為4個進程,

這個還是只能肯定定時任務有問題,並不能說明什麽原因造成這個現象的。

只能繼續蒙圈…………

8、在不知道怎麽排查問題的時候,我做了一個新的嘗試。

在配置好定時任務的時候,在中控機上使用service crond stop 將定時服務給停了,如果備份成功了那說明需要在其他機器找問題

9、這次嘗試確實後備份確實成功了,但是在其他機器也找不到原因,這時候 已經很抓狂了,完全不知道什麽情況了。

在準備放棄的時候,我在中控機上面使用 ps -ef |grep crond 查看crond 服務的情況。尼瑪,內心10000個草泥馬飛奔,居然還有有一個crond服務!!

技術分享

使用service crond start 啟動crond,

居然有兩個服務。

看到這裏終於可以松口氣,看來問題就在這裏了,

於是將多余的crond 服務 kill掉後備份就正常。

ps:crond 這個服務個人確實從來沒發現可以啟動兩個的,後面我做了各種嘗試,最終還是只有一個服務,至今也不知道這個第二個crond服務怎麽起來的。

遇到自己感覺靈異的問題,我們要相信機器不會撒謊,我們要保持清晰的思路,堅持下去,終究能找到問題所在的。

話是這麽說,但是事實上做起來還是很難的,我差點就放棄,準備將這套備份系統直接下了,用自己新寫的一套來替代,本地已經測試ok,只要上線跑跑就可以了。不過還是挺慶幸當時沒有放棄,如果放棄了,那麽我也就錯過了crond服務還有可能出現兩個的奇觀了!

嘿嘿,提個問題,如果你們遇到這種情況,會用什麽思路來排查呢?

記crond導致備份失敗的排查過程