サービスの成長に合わせて運用をしていくと、自然とサーバの台数が増えていきます。また、サービスの規模や状況によっては、データベースサーバだけに限らずサーバの構築の自動化を行っておらず手作業で増やすこともよくあります。手作業で設定を行った際に恐ろしいのは、うっかりミスで設定が正しく適用されておらず、最悪な場合サーバごとに設定が微妙に異なってしまうことですが、これがたまに起るので困ってしまいます。根本的に問題を防ぐには自動化やサーバの構成に対してのテストなどが必要になると思いますが、今すでにあるサーバに対して設定がどう違っているか確認したいことがあります。
そこで今回は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.cnf
とmy.cnf2
としてそれぞれ設置します。
今回はポートの変更を想定したファイルを作成します。
これらの比較をpt-config-diff
を用いて行います。
比較した結果は上の通りになりました。先ほど設定した通りの結果になっていることがわかると思います。
また上記では、わかりやすくするためportの設定だけ行ったmy.cnf
を用意しましたが、以下のように設定の順番がバラバラなファイルを用意してみました。
まず、最初のmy.cnf
ファイルにdatadirとsocketの設定を追加してみました。
my.cnf2
ファイルにもdatadirの設定とsocketの設定をmy.cnf
とは別に追加しました。順番を入れ替えても問題ないことを試すため、逆順に並べています。
上記の2ファイルをpt-config-diffを使って比較してみます。
比較した結果が上のようになります。順番を変えてもそれぞれの設定が比較されていることがわかると思います。
ただし、この設定ファイル間での比較ですが、設定ファイルに書かれていない場合、比較がうまく行えない場合があります。上記の例で言うと、port3306がデフォルト値で設定されておりmy.cnfファイルに存在しない場合は、うまく比較することができないのでご注意ください。
次に、my.cnf
のportの設定をデフォルト値にしたmy.cnf3というファイルを用意して、pt-config-diffを使って比較してみます。
上記のようにportの設定の違いについて表示がされません。設定ファイルの変更だけではなく追加や削除がある場合なども注意が必要です。
設定ファイルとサーバでの比較
続いてサーバと設定ファイルでの比較を行います。サーバと設定ファイルで比較を行うというと、何か変な比較を行うような気がしますが、実際にはSHOW VARIABLES;
での結果を取得してサーバの設定と設定ファイルのdiffを取って比較を行います。実際にyumレポジトリーを使用してインストールしたMySQLサーバと先ほど作成したmy.cnf2
を比較してみようと思います。
上記のように、ホストの設定と与えられたファイルの差分を取ってmy.cnf2
を適用した場合にどのような影響があるかを簡単に確認することができます。設定ファイルとサーバの順番を逆にしても問題は無く、以下のように実行することもできます。
サーバ間での比較
pt-config-diff
では、2台のサーバ間での設定を比較することもできます。実際に動いているサーバ間で挙動が異なる場合に比較を行いたい場合などに便利だと思います。
yumレポジトリーを使用してインストールしたMySQLとDockerのデフォルトのMySQLを用意して、比較してみようと思います。DockerのIPやポートは環境に合わせて入力してみてください。
比較した結果が上記になります。ログの出力位置やopensslの設定など、Dockerとyumを使ってインストールしたものだとどのような違いがあるか、一目瞭然となってわかりやすいと思います。
このように、サーバ間での設定を比較することができました。
まとめ
今回はpt-config-diffコマンドを用いて設定間の差分を確認する方法を紹介しました。追加や削除だとうまく動かないこともありますが、サーバの設定を行った際以外にも、設定ファイルを変更する際にどのような変更を加えたのかをわかりやすくする等の目的で利用すると良いかもしれません。SHOW VARIABLES
コマンドを使って作成されているので、本番サーバに実行しても影響はほぼ無いと思います。
サーバ間で微妙に挙動が異なる場合にサーバの設定の調査をしたい時や、サーバの設定を更新する際の確認などに、ぜひ使ってみてはいかがでしょうか。