MySQL道普請便り

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

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

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

そこで今回は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の設定の違いについて表示がされません。設定ファイルの変更だけではなく追加や削除がある場合なども注意が必要です。

著者プロフィール

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

GMOメディア株式会社 技術推進室所属のWebアプリケーションエンジニア。最近はミドルウェア・インフラ周りのことも少しずつ学習しています。趣味は将棋。好きな戦法は四間飛車。

Twitter:@kk2170

コメント

コメントの記入