iowait対策としてzabbixで使用しているMySQLのDB領域を圧縮する

f:id:komeiy:20141012172923p:plain

zabbixのこの赤いロゴ大好きです。

最近、zabbixのGUIが重くて状況を確認したところ、iowaitが20%を定常的に超えていたのでIOの負荷を下げるためにデータ圧縮をしてみます。

ディスク構成がチープですので、innodbのデータ領域に書き込む前にデータを圧縮してIO負荷を下げるということです。どれくらい効果が出るのか検証できないため、まずは実践です。

他に負荷に関して気になる点

  • CPU負荷はhousekeeperの処理で定期的に上がっている状況。

  • icmpのプロセスも負荷が高そうです。

  • 何個か別のサービスが同居しているため、そちらの負荷の可能性もある。

この通り、問題は多々あり、これですべて解決するわけではないですが、まずは直接の原因であろうiowaitの解消のために実施してみます。zabbixはまだ運用を開始したばかりで、nvpsも200弱程度です。もちろんまだまだハード追加なしで対応できるレベルだと思ってます。

まずテーブル内のレコード数をカウントします。この数を圧縮にかかる時間の目安として事前に確認してメンテナンスの計画を立てます。データ量ではないので一概には言えませんが、hiroty, history_unit, trend_unitあたりが時間かかりそうです。

$ mysql -uroot  -e "SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema = 'zabbix';"

+-----------------------+------------+
| table_name            | table_rows |
+-----------------------+------------+
| acknowledges          |          0 |
| actions               |         12 |
| alerts                |       1084 |
| application_template  |        318 |
| applications          |        343 |
| auditlog              |      61893 |
| auditlog_details      |       2509 |
| autoreg_host          |          1 |
| conditions            |         25 |
| config                |          1 |
| dbversion             |          1 |
| dchecks               |          5 |
| dhosts                |         50 |
| drules                |          5 |
| dservices             |         49 |
| escalations           |        133 |
| events                |     180217 |
| expressions           |          4 |
| functions             |      27233 |
| globalmacro           |          2 |
| globalvars            |          1 |
| graph_discovery       |      10249 |
| graph_theme           |          4 |
| graphs                |      11164 |
| graphs_items          |      20372 |
| group_discovery       |          0 |
| group_prototype       |          0 |
| groups                |         19 |
| history               |   16882070 |
| history_log           |      17285 |
| history_str           |      14748 |
| history_str_sync      |          0 |
| history_sync          |          0 |
| history_text          |     404559 |
| history_uint          |  337073134 |
| history_uint_sync     |          0 |
      〜 略 〜
| timeperiods           |          0 |
| trends                |    2637085 |
| trends_uint           |  105099525 |
| trigger_depends       |        124 |
| trigger_discovery     |      25891 |
| triggers              |      26768 |
| user_history          |          4 |
| users                 |          9 |
| users_groups          |          9 |
| usrgrp                |          8 |
| valuemaps             |         19 |
+-----------------------+------------+

それでは実際にデータを圧縮します。my.cnfにinnodb_file_format=Barracudaと書いていれば圧縮されていると思っている人は多いのでは?圧縮されているかどうかは今回稼働後に対応です。初期構築に実施してください。

mysql> use zabbix
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql> alter table history ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Query OK, 16970384 rows affected, 5 warnings (1 hour 54 min 13.83 sec)
Records: 16970384  Duplicates: 0  Warnings: 5

mysql> alter table history_log ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Query OK, 17335 rows affected, 5 warnings (1 min 15.21 sec)
Records: 17335  Duplicates: 0  Warnings: 5

mysql> alter table history_str ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Query OK, 16660 rows affected, 5 warnings (29.43 sec)
Records: 16660  Duplicates: 0  Warnings: 5

mysql> alter table history_text ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Query OK, 454836 rows affected, 5 warnings (3 min 11.30 sec)
Records: 454836  Duplicates: 0  Warnings: 5

mysql> alter table trends ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Query OK, 2090389 rows affected, 5 warnings (5 min 52.37 sec)
Records: 2090389  Duplicates: 0  Warnings: 5

mysql> alter table trends_uint ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Query OK, 101156873 rows affected, 5 warnings (3 hours 18 min 10.14 sec)
Records: 101156873  Duplicates: 0  Warnings: 5

mysql> alter table items ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Query OK, 59090 rows affected, 5 warnings (3 min 42.17 sec)
Records: 59090  Duplicates: 0  Warnings: 5

mysql> alter table history_uint ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;
Query OK, 301915740 rows affected, 5 warnings (1 day 10 hours 31 min 56.64 sec)
Records: 301915740  Duplicates: 0  Warnings: 5

かなりの時間がかかってしまいました。。圧縮処理をしている最中に見てみましたが、使用しているCPUが偏ってる気がしました。むしろ1つしか使ってないのでしょうか。

さて、気になる稼働後のiowaitですが、3%程度の低下が見られました。もう少し経過を観測してみますが、もしかすると先に記載した別のサービスがIO負荷をかけているのかもしれません。


シェアして頂けると嬉しいです。
参考になったという方がいれば是非お願いしますm(_ _ )m
モチベーション維持の観点で非常に励みになります。

このエントリーをはてなブックマークに追加

MySQL徹底入門 第3版 ?5.5新機能対応?

MySQL徹底入門 第3版 ?5.5新機能対応?