資料庫備份導致的zabbix_server大量告警的問題排查

  • 2019 年 10 月 5 日
  • 筆記

問題:

每天在9點15分左右,運維人員會收到大量的zabbix_server報警郵件,提示 "PROBLEM: Zabbix agent on XXX is unreachable for 5 minutes"

排查過程:

從9點之前的系統運行狀態開始查起。

1、查看9點左右的zabbix_server.log。沒有發現異常。

2、在zabbix server上寫了一個計劃任務 56 8 * * * /bin/ping one_agent_IP>> /tmp/net_status.log  

通過ping agent端的ip,判斷是否網路抖動導致agent unreachable的。

但是,第二天/tmp/net_status_log的日誌顯示ping沒有丟包問題。排除了網路抖動問題。

3、查看9點左右的計劃任務,發現9點時候在執行了一個backup.sh,看到裡面mysqldump的備份參數如下:

mysqldump –force –opt -uxxx -pxxx  zabbix | gzip > xxxx.sql.gz

至此,可以基本判斷是這個備份資料庫操作導致的zabbixserver告警。

原因:

這裡先看下上面mysqldump的幾個參數,

–opt        Same as –add-drop-table,–add-locks, –create-options,

               –quick,–extended-insert, –lock-tables,–set-charset,

               and –disable-keys.Enabled by default, disable with

               –skip-opt.

  -f, –force      Continue even if we get an SQL error.

其中,–opt裡面包含了一堆的參數,這裡最關鍵的是 –lock-tables,mysql5.6官方手冊上的解釋如下:

–lock-tables, -l

For eachdumped database, lock all tables to be dumped before dumping them. The tablesare

lockedwith READ LOCAL to permit concurrent inserts in the case of MyISAM tables. For transactional

tables such as InnoDB,–single-transaction is a much better option than –lock-tables

because it does not need tolock the tables at all.

Because–lock-tables locks tables for each database separately, this option does notguarantee

that thetables in the dump file are logically consistent between databases. Tables indifferent

databasesmay be dumped in completely different states.

Someoptions, such as –opt, automatically enable –lock-tables. If you want tooverride this,

use–skip-lock-tables at the end of the option list.

官方建議在InnoDB存儲引擎時候,使用 –single-transaction,而不要用 –lock-tables,因為–lock-tables會造成鎖表的問題。

在搭配–single-transaction 參數後,會在FLUSH TABLES WITH READ LOCK 後添加START TRANSACTION 語句,將事務的隔離級別設置為REPEATABLE READ ,這個時候的加鎖,僅僅是為了確定master-data中的binlog的具體位置和開啟事務,開啟事務後,就已經把讀鎖釋放了,而且在由日誌可以看出,在日誌的回滾過程中,是回滾到單一的TRANSACTION,也是sp點,每次進行對錶和參數的改動後,都會對事務進行回滾。通過對備份log的分析,可以發現,所有的的備份階段完成後,都是rollback到sp點的。也就是返回到SAVEPOINT sp時間點,也就是備份完成後,實際上備份庫仍然是在sp點,而這個所謂的sp回滾,其實是調用的undo中的數據快照來實現的。(就是說9點鐘執行的備份,最終我們備份出的數據就是9點的數據,備份過程中數據的變化不會寫入到備份文件里)。

如下圖是執行 mysqldump -q –single-transaction -B zabbix > test.sql 時候的mysql的general log日誌。

備份時候,使用了–opt參數會暫時鎖表,zabbix_agent收集到的數據無法及時寫入資料庫,zabbix_server在長時間沒有發現收集到agent的數據,就會觸發告警。

我們只要改下備份的參數即可,mysqldump -uxx -pxx -f -q–single-transaction -B zabbix | gzip > xxxx.sql.gz

另外,對於Innodb存儲引擎的表,建議在使用mysqldump備份時候都要加上 -q –single-transaction 參數。