MySQL道普請便り

第37回pt-config-diffを使って設定の違いを確認する

サービスの成長に合わせて運用をしていくと、自然とサーバの台数が増えていきます。また、サービスの規模や状況によっては、データベースサーバだけに限らずサーバの構築の自動化を行っておらず手作業で増やすこともよくあります。手作業で設定を行った際に恐ろしいのは、うっかりミスで設定が正しく適用されておらず、最悪な場合サーバごとに設定が微妙に異なってしまうことですが、これがたまに起るので困ってしまいます。根本的に問題を防ぐには自動化やサーバの構成に対してのテストなどが必要になると思いますが、今すでにあるサーバに対して設定がどう違っているか確認したいことがあります。

そこで今回はPercona Toolkitの1つであるpt-config-diffコマンドを用いて、各サーバ間の設定の違いを確認する方法を紹介していきたいと思います。

検証環境

今回は第5回 Dockerで複数バージョンのMySQLを開発環境に用意するで作成した環境と第10回 yum, rpmインストールにおけるMySQL 5.6とMySQL 5.7の違いで紹介されたyumリポジトリを使用したインストールを利用しています。MySQLのバージョンは5.7.17を使用しています。

またPercona Toolkitは第9回 pt-query-digestを使って遅いクエリーを発見するで紹介したように導入しています。

pt-config-diffの使い方

pt-config-diffコマンドは次の3通りの使い方ができます。

  • 設定ファイル同士の比較
  • 設定ファイルとサーバでの比較
  • サーバ間での比較

それぞれ説明していきたいと思います。

ファイル同士の比較

pt-config-diffコマンドは、my.cnfファイルのような設定ファイルを使って設定の比較することができます。ローカルのホームディレクトリに、以下のような設定ファイルをmy.cnfmy.cnf2としてそれぞれ設置します。

# cat my.cnf
[mysqld]
port = 3306

今回はポートの変更を想定したファイルを作成します。

# cat my.cnf2
[mysqld]
port = 3305

これらの比較をpt-config-diffを用いて行います。

# pt-config-diff my.cnf my.cnf2
1 config difference
Variable                  my.cnf my.cnf2
========================= ====== =======
port                      3306   3305

比較した結果は上の通りになりました。先ほど設定した通りの結果になっていることがわかると思います。

また上記では、わかりやすくするためportの設定だけ行ったmy.cnfを用意しましたが、以下のように設定の順番がバラバラなファイルを用意してみました。

まず、最初のmy.cnfファイルにdatadirとsocketの設定を追加してみました。

# cat my.cnf
[mysqld]
port = 3306
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

my.cnf2ファイルにもdatadirの設定とsocketの設定をmy.cnfとは別に追加しました。順番を入れ替えても問題ないことを試すため、逆順に並べています。

# cat my.cnf2
[mysqld]
socket=/tmp/mysql/mysql.sock
datadir=/tmp/mysql
port = 3305

上記の2ファイルをpt-config-diffを使って比較してみます。

# pt-config-diff my.cnf my.cnf2
3 config differences
Variable                  my.cnf                    my.cnf2
========================= ========================= =====================
datadir                   /var/lib/mysql            /tmp/mysql
port                      3306                      3305
socket                    /var/lib/mysql/mysql.sock /tmp/mysql/mysql.sock

比較した結果が上のようになります。順番を変えてもそれぞれの設定が比較されていることがわかると思います。

ただし、この設定ファイル間での比較ですが、設定ファイルに書かれていない場合、比較がうまく行えない場合があります。上記の例で言うと、port3306がデフォルト値で設定されておりmy.cnfファイルに存在しない場合は、うまく比較することができないのでご注意ください。

次に、my.cnfのportの設定をデフォルト値にしたmy.cnf3というファイルを用意して、pt-config-diffを使って比較してみます。

# cat my.cnf3
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# pt-config-diff my.cnf2 my.cnf3
2 config differences
Variable                  my.cnf2               my.cnf
========================= ===================== =========================
datadir                   /tmp/mysql            /var/lib/mysql
socket                    /tmp/mysql/mysql.sock /var/lib/mysql/mysql.sock

上記のようにportの設定の違いについて表示がされません。設定ファイルの変更だけではなく追加や削除がある場合なども注意が必要です。

設定ファイルとサーバでの比較

続いてサーバと設定ファイルでの比較を行います。サーバと設定ファイルで比較を行うというと、何か変な比較を行うような気がしますが、実際にはSHOW VARIABLES;での結果を取得してサーバの設定と設定ファイルのdiffを取って比較を行います。実際にyumレポジトリーを使用してインストールしたMySQLサーバと先ほど作成したmy.cnf2を比較してみようと思います。

# pt-config-diff my.cnf2 h=localhost,u=root --ask-pass
Enter MySQL password:
3 config differences
Variable                  my.cnf2               localhost
========================= ===================== =========================
datadir                   /tmp/mysql            /var/lib/mysql/
port                      3305                  3306
socket                    /tmp/mysql/mysql.sock /var/lib/mysql/mysql.sock

上記のように、ホストの設定と与えられたファイルの差分を取ってmy.cnf2を適用した場合にどのような影響があるかを簡単に確認することができます。設定ファイルとサーバの順番を逆にしても問題は無く、以下のように実行することもできます。

# pt-config-diff h=localhost,u=root my.cnf2 --ask-pass
Enter MySQL password:
3 config differences
Variable                  localhost                 my.cnf2
========================= ========================= =====================
datadir                   /var/lib/mysql/           /tmp/mysql
port                      3306                      3305
socket                    /var/lib/mysql/mysql.sock /tmp/mysql/mysql.sock

サーバ間での比較

pt-config-diffでは、2台のサーバ間での設定を比較することもできます。実際に動いているサーバ間で挙動が異なる場合に比較を行いたい場合などに便利だと思います。

yumレポジトリーを使用してインストールしたMySQLとDockerのデフォルトのMySQLを用意して、比較してみようと思います。DockerのIPやポートは環境に合わせて入力してみてください。

# pt-config-diff h=localhost,u=root,p=パスワード h=172.17.0.2,u=root,p=パスワード
16 config differences
Variable                  localhost                 691a7261e882
========================= ========================= =========================
general_log_file          /var/lib/mysql/ip-172-... /var/lib/mysql/691a726...
have_openssl              YES                       DISABLED
have_ssl                  YES                       DISABLED
hostname                  localhost                 691a7261e882
log_error                 /var/log/mysqld.log       stderr
open_files_limit          5000                      1048576
plugin_dir                /usr/lib64/mysql/plugin/  /usr/lib/mysql/plugin/
relay_log_basename        /var/lib/mysql/ip-172-... /var/lib/mysql/691a726...
relay_log_index           /var/lib/mysql/ip-172-... /var/lib/mysql/691a726...
server_uuid               327464db-3de1-11e6-855... c52b5861-dc6e-11e6-893...
skip_name_resolve         OFF                       ON
slow_query_log_file       /var/lib/mysql/ip-172-... /var/lib/mysql/691a726...
socket                    /var/lib/mysql/mysql.sock /var/run/mysqld/mysqld...
ssl_ca                    ca.pem
ssl_cert                  server-cert.pem
ssl_key                   server-key.pem

比較した結果が上記になります。ログの出力位置やopensslの設定など、Dockerとyumを使ってインストールしたものだとどのような違いがあるか、一目瞭然となってわかりやすいと思います。

このように、サーバ間での設定を比較することができました。

まとめ

今回はpt-config-diffコマンドを用いて設定間の差分を確認する方法を紹介しました。追加や削除だとうまく動かないこともありますが、サーバの設定を行った際以外にも、設定ファイルを変更する際にどのような変更を加えたのかをわかりやすくする等の目的で利用すると良いかもしれません。SHOW VARIABLESコマンドを使って作成されているので、本番サーバに実行しても影響はほぼ無いと思います。

サーバ間で微妙に挙動が異なる場合にサーバの設定の調査をしたい時や、サーバの設定を更新する際の確認などに、ぜひ使ってみてはいかがでしょうか。

おすすめ記事

記事・ニュース一覧