MySQL道普請便り

第113回 anemoeaterを使ってスローログを可視化してみる

この記事を読むのに必要な時間:およそ 3 分

皆様あけましておめでとうございます。本年も「MySQL道普請便り」をよろしくおねがいします。

新年ということで,色合いを豊かにスローログを可視化してみようと思います。今回は,スローログを時に便利なツールであるAnemometerのラッパーであるanemoeaterについて紹介していきます。

Anemometerとanemoeaterに関して

Anemometerは,boxさんが作成されたスローログの可視化ツールで,ペルコナツールキットの1つであるpt-query-digestを利用して,結果を綺麗に時系列で便利に表示するためのツールです。GitHubのリンクはこちらになります。

anemoeaterは,この連載の執筆者でもあるyoku0825さんが用意したラッパーツールで,Anemometerにある問題を幾つか解決するために作成されたものとなります。特にスローログファイルだけあれば表示できる点が非常に便利なので,皆さんも使ってみてください。GitHubのリンクはこちらになります。

環境設定

今回は,基本的にgitとdockerとperl環境を利用して進めていきます。今回もDockerHub上のMySQLイメージを利用して行います。バージョンは8.0.18を使用しています。また今回はスローログを出力したいため,my.cnfの設定を行います。docker runコマンドを実行するディレクトリに以下のファイルを置いて,設定が有効になるようにしましょう。

$ cat ./config/my.cnf
[mysqld]
slow_query_log=1
slow_query_log-file=/var/log/mysql/mysql-slow.sql
long_query_time =0.01

一応各パラメータについて簡単に説明をしておくと,slow_query_logを1にすることでスローログが出力されるようになります。slow_query_log-fileでスローログが出力される先を指定します。long_query_timeは,スローログに出力されるしきい値になります。上記の設定では10ms以上のクエリがスローログとして記録されます。

$ docker run --name michibushin -v "/tmp:/tmp" -v "$PWD/config:/etc/mysql/conf.d" -v "$PWD/logs/mysql:/var/log/mysql"  -e MYSQL_ROOT_PASSWORD=my-secret-pw -d -p 3306:3306  -d mysql:8.0.18 --secure-file-priv=/tmp

上記で起動をして,以下のようにしてMySQLに接続していきます。スローログはカレントディレクトリの直下に出力されます。

$ mysql -h0.0.0.0  -uroot -pmy-secret-pw

ここで以下のコマンドを実行してmy.cnfの設定が有効になっていれば,設定完了です。

mysql> show variables like 'slow%';
+---------------------+-------------------------------+
| Variable_name       | Value                         |
+---------------------+-------------------------------+
| slow_launch_time    | 2                             |
| slow_query_log      | ON                            |
| slow_query_log_file | /var/log/mysql/mysql-slow.sql |
+---------------------+-------------------------------+
3 rows in set (0.00 sec)

mysql> show variables like 'long%';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.010000 |
+-----------------+----------+
1 row in set (0.01 sec)

スロークエリが出力される設定で,しきい値も正しく登録されていることがわかりました。

検証用のデータとしては,第2回 MySQLにはじめてのデータを入れてみるからKEN_ALL.CSVを利用して作成していきます。

$ cat ken_all.sql
CREATE DATABASE zipcode CHARACTER SET utf8mb4;
CREATE TABLE zipcode.zipcode(
       code varchar(12) NOT NULL,
       old_zipcode varchar(5) NOT NULL,
       zip_code varchar(7) NOT NULL,
       prefecture_kana varchar(255) NOT NULL,
       city_kana varchar(255) NOT NULL,
       town_kana varchar(255) NOT NULL,
       prefecture varchar(128) NOT NULL,
       city varchar(128) NOT NULL,
       town varchar(128) NOT NULL
     ) DEFAULT CHARACTER SET= utf8mb4;
$ mysql -h0.0.0.0  -uroot -pmy-secret-pw < ken_all.sql

データをインポートした後とりあえずスローログが出力されているか確認してみましょう。LOAD DATA INFILEは結構重いので出力されていると思います。

cat logs/mysql/mysql-slow.sql
/usr/sbin/mysqld, Version: 8.0.18 (MySQL Community Server - GPL). started with:
Tcp port: 0  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
/usr/sbin/mysqld, Version: 8.0.18 (MySQL Community Server - GPL). started with:
Tcp port: 0  Unix socket: /var/run/mysqld/mysqld.sock
Time                 Id Command    Argument
# Time: 2020-01-07T23:25:07.328935Z
# User@Host: root[root] @ localhost []  Id:     7
# Query_time: 0.064265  Lock_time: 0.000048 Rows_sent: 0  Rows_examined: 0
use mysql;
SET timestamp=1578612307;
INSERT INTO time_zone_transition (Time_zone_id, Transition_time, Transition_type_id) VALUES
 (@time_zone_id, -2147483648, 0)
,(@time_zone_id, -1988164200, 2)
,(@time_zone_id, 403041600, 1)
,(@time_zone_id, 417034800, 2)
,(@time_zone_id, 1224972000, 1)
,(@time_zone_id, 1238274000, 2);
# Time: 2020-01-09T23:25:09.384497Z
# User@Host: root[root] @ localhost []  Id:     7
# Query_time: 0.017580  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1578612309;
COMMIT;

このように出力が確認できました。

cpanmのインストール

anemoeaterを起動するためにはcpanmが必要なため,準備をします。cpanmはperlのパッケージマネージャの一種なので,perlが必要なのかなと思われるかと思いますが,今回はシステムにあるperlを利用したのでperlのインストール自体は必要ありません。cpanmのGitHubのリポジトリはこちらになります。今回はUbuntuでのインストール方法を紹介します。

Ubuntuで試す場合,aptコマンドを利用してインストールします。以下のコマンドをターミナルから実行してみましょう。

$ sudo apt install build-essential cpanminus

cpanm -Vとコマンドを実行して,以下のようにバージョン情報が出力されていることが確認できれば大丈夫です。

$ cpanm -V
cpanm (App::cpanminus) version 1.9018 (/usr/local/bin/cpanm)
perl version 5.018004 (perl)

〈以下省略〉

後は,ライブラリのインストール先を指定するための環境変数を記載して完了です。私はbashを使っているので.bash_profileの末尾に以下のような設定を追加しました。

$ cat .bash_profile

〈省略〉

export PERL_CPANM_OPT="--local-lib=~/.perl5"
export PERL5LIB=$HOME/.perl5/lib/perl5:$PERL5LIB;

anemoeaterを起動してみる

anemoeaterは,ローカルで起動する方法とdockerを利用する方法がありますが,今回はDockerのものを利用します。GitHubにある注意を読んでいただければわかるのですが,anemometerのベースとなったAnemometerの方でpt-query-digestのバージョンへの追従が行われておらず,pt-query-digestのバージョンが3.0.11以降のものだと利用ができません。そのため今回はバージョン問題が発生しないDocker版のものを利用して確認していきます。

GitHubのスタートに沿って実行してみましょう。まずは,anemoeaterのリポジトリをcloneしてきます。そしてcloneしてきたディレクトリで実行していきます。

$ git clone https://github.com/yoku0825/anemoeater
$ cd anemoeater
$ cpanm --installdeps .
$ ./anemoeater --use-docker-for-pt ../logs/mysql/mysql-slow.sql

しばらくすると以下のような表示がされるので,指定に従ってアクセスをします。cpanmの時点でエラーが出る場合はbuild-essentialをaptからインストールしてください。

Docker container starts with 172.17.0.2.
URL will be http://127.0.0.1:32768/anemometer

すると次のような画面が表示されます。

画像

これで,スローログさえ用意できれば,グラフィカルにどういう状態だったかを確認できるようになりました。

まとめ

今回は,anemoeaterを使ってスローログを可視化する方法を紹介しました。溜め込んでしまったスローログが活用できていない場合などに,最初の一歩として使ってみてはどうでしょうか。

著者プロフィール

木村浩一郎(きむらこういちろう)

株式会社オプティム 技術統括本部のエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170