ZabbixのMySQL(MariaDB)のお掃除

Zabbix、監視データですぐ太る…

意味もなく五七調にしてみたw

ということで、お休み恒例技術メモ、VMwareネタが続きましたが、ここで唐突にZabbixさんのMySQLのお掃除についてです。
 #VMwareネタ大きいやつが一つあるけど、今書いていいかどうか悩ましい…
  もうすこしほとぼり冷めてからかな…

肥大化の原因

1. データベースファイルの巨大化

データを貯める→データベースファイルが肥大化する→zabbix上のローテでデータ減る→ファイルは小さくならない(シンプロビジョニングのディスクが広がったあと縮まないのに近い?)
特にzabbixのデータ保持期間がデフォルトの365日のままだと危険。

2.大量のバイナリログ

/var/lib/mysql直下に大量のバイナリログ(binlog.xxxx)が存在する。
デフォルトだと30日間保存、一つあたり1.1GBあるため、バイナリログが大量に発生するような環境(warningが沢山飛んだりするようなとことか…?)の場合、ディスク圧迫の原因になる。

メンテナンス方法

1.Zabbixのデータファイル(テーブル)の掃除

特に肥大化しやすいファイルは以下の5つ(大きい順に)

  • history_uint.ibd
  • history.ibd
  • trends_uint.ibd
  • trends.ibd
  • history_log.ibd

■手順

  1. ZabbixにSSHで入って、上記5個のサイズをチェックしておく
  2. zabbix上でトレンドとヒストリの保存期間を短縮する
  3. 一日待つ
  4. mysqlにログインしてalter tableコマンドででテーブルを最適化する(なるべくファイルサイズのでっかいのから)
mysql> alter table history_log engine=InnoDB;
mysql> alter table trends engine=InnoDB;
mysql> alter table trends_uint engine=InnoDB;
mysql> alter table history engine=InnoDB;
mysql> alter table history_uint engine=InnoDB;
※注意事項
  • 元テーブルのサイズと同じくらいのディスク空き容量が必要
  • 実行時はWRITEがブロックされるので、コマンドが終了するまではzabbixの監視データは歯抜けになる(readは可能)
テーブル最適化の定期メンテ用スクリプト

作ってみたけど、単にコマンドならべただけなので、もう少し誰かどうにかしてくれないかな…

#!/bin/sh
mysql --user='root' --password='rootのパスワード' --database=zabbix <<eof
alter table history_log engine=InnoDB;
alter table trends engine=InnoDB;
alter table trends_uint engine=InnoDB;
alter table history engine=InnoDB;
alter table history_uint engine=InnoDB;
eof

とりあえず/root/mysql_maintenance.sh とかにして、cronで毎月1日に動かす位でよい
例:`0 21 1 * * /root/mysql_maintenance.sh`

参考リンク

https://www.robata.org/docs/zabbix/tips-dbsize-check-01.html

2.バイナリログの保存期間の短縮

  1. mysqlにログインする
  2. バイナリログの保存期間を確認する
  3. 大抵デフォルトの30日間なので、7日間に変更する
  4. 変更できていることを確認する
  5. 暫く待つと、7日間より古いログは自動的に削除される
mysql> show variables like 'binlog_expire_logs_seconds';
+----------------------------+---------+
| Variable_name              | Value   |
+----------------------------+---------+
| binlog_expire_logs_seconds | 2592000 |
+----------------------------+---------+
1 row in set (0.00 sec)

mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
1 row in set (0.00 sec)

参考

https://protocol.nekono.tokyo/2020/08/06/mysql8%E3%81%A7%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%AD%E3%82%B0%E3%82%92%E5%89%8A%E9%99%A4%E4%BF%9D%E5%AD%98%E6%9C%9F%E9%96%93%E5%A4%89%E6%9B%B4/#:~:text=%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%AD%E3%82%B0%E3%81%AE%E4%BF%9D%E5%AD%98%E6%97%A5%E6%95%B0,binlog_expire_logs_seconds%E3%80%8D%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82&text=%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AF30%E6%97%A5(2592000,%E8%A8%AD%E5%AE%9A%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82