Chef で MySQL のインストールと設定

CentOS に MySQL をインストールする Chef Cookbook を作成しました。MySQL 5.5.38 を remi リポジトリからインストールします。MySQL 5.6 用の Cookbook も作成してたのですけど、そっちはなんかはまって上手くいかなかったのでとりあえず5.5バージョンで。

スポンサーリンク

このエントリーは、CentOS サーバー設定用 Chef Cookbook/Recipe の目次 の一部です。

MySQL インストール用 Recipe

まずは、メインの MySQL をインストールする Recipe から。

site-cookbooks/app_mysql_cookbook/recipes/default.rb

上から順番に、/etc/my.cnf の設置、パッケージのインストール、ログファイルとログローテートの設定、サービスの設定と起動、mysql_secure_installation(対話型インストール)をシェルで実行、以上の一連の処理を行っています。

/etc/my.cnf 用テンプレート

続いて、MySQL の設定ファイル /etc/my.cnf 用のテンプレートです。設定するパラメータが膨大ですが、パフォーマンス・チューニングに必要となるのは、Network, Cache & Memory, InnoDB あたりのセクションのみです。テンプレート内では変数にしておいて、後述の Wrapper Cookbook で値を設定します。Wrapper Cookbook については、以下。

Chef Cookbook の管理方針、The Environment Cookbook Pattern について | EasyRamble
Chefでrbenvとruby-buildをインストール | EasyRamble

site-cookbooks/templates/default/my.cnf.erb

ログローテーション用 MySQL root ユーザー設定のテンプレート

MySQL ログのローテートに必要な /root/.my.cnf 用のテンプレートです。詳細は、/etc/logrotate.d/mysqld に説明してありますが、/usr/bin/mysqladmin flush-logs を行うために、MySQLユーザーとそのパスワードの設定を行います。ここもパスワードは変数にしておいて、Wrapper Cookbook で指定。

site-cookbooks/templates/default/.my.cnf.erb

ログローテート設定用のファイル

error.log(エラーログ)、slow.log(スロークエリログ)用のログローテートを設定するファイルです。このファイルは変数を使わないので、files/default 以下に格納しました。

site-cookbooks/files/default/mysql-log-rotate

の行で、–defaults-extra-file=/root/.my.cnf と、MySQLユーザーとパスワードの情報が書かれている外部ファイル(/root/.my.cnf)を指定しています。

my.cnf.erb のパラメータ値の設定

Wrapper Cookbook で、site-cookbooks/templates/default/my.cnf.erb 内の変数に対する値を設定します。パフォーマンス・チューニングに必要となる、Network, Cache & Memory, InnoDB あたりのセクションは注意する。各々環境で理想値は異なると思いますので、そこはご留意下さい。調べたデフォルト値をコメントで記しています。

site-cookbooks/wrapper_project_cookbook/recipes/default.rb

/etc/my.cnf のパラメータ値については以下参照。

MySQL :: MySQL 5.5 Reference Manual :: 5.1.4 Server System Variables
MySQL :: MySQL 5.5 Reference Manual :: 14.15 InnoDB Startup Options and System Variables
MySQLのmy.cnfファイルサンプル – 世界の一部

provision 後 mysql_secure_installation が成功しているか確認

mysql クエリーで、以下を確認します。

1. 匿名ユーザーが削除されていること。
2. リモートからの root ログインを拒否していること。
3. root ユーザーのパスワードが設定されていること。
4. test データベースが削除されていること。

以上のようになっていればOKです。

以降、少々解説です。

/etc/my.cnf を最初に作成する理由

recipes/default.rb では一番最初に、以下の /etc/my.cnf を設置する処理を行っています。

この template リソースを使って、/etc/my.cnf を作成する処理を一番最初に行っているのは以下の理由によります。

my.cnf の innodb_data_file_path, innodb_log_file_size 設定で MySQL が起動しなくなる場合の対処 | EasyRamble

mysql-server のインストールが完了した時点で mysql_install_db が自動実行され、/var/lib/mysql 以下に ibdata1, ib_logfile0, ib_logfile1 が作成される。これらのファイルが存在している状態で、/etc/my.cnf で innodb_data_file_path, innodb_log_file_size を設定しようとすると、mysqld の restart がエラーになってしまいます。なので、/etc/my.cnf を最初に設置した後に、mysql パッケージをインストールする順番の処理にしました。

ログファイルとログローテートの設定

#log files, #log rotation のコメント部の処理では、ログファイルの作成とログローテートの設定を行っています。以下のページを参考にしました。

MySQL ログのローテーション設定(logrotate)(flush-logs が cron で動かないときの対処を含む) – 彼女からは、おいちゃんと呼ばれています

error.log, slow.log, query.log の3つのログファイルを作成していますが、my.cnf で general_log = 0 に設定しているので、有効になるのは error.log, slow.log のみです。query.log は全てのクエリを記録して膨大になるので、有効にするのはデバッグ時などに限ったほうが良いかと思います。したがって、ログローテーションの設定も、error.log, slow.log の2つのみを対象にしています。

mysql_secure_installation(対話型インストール)をシェルで実行

最後の mysql_secure_installation では、通常のコンソールからの mysql インストール時で行われる対話型によるインストール処理をシェルで実行しています。

Chefのレシピでmysql_secure_installation(bashリソース利用) – Qiita
chefでmysql-5.6インストールしようとしたら苦労した話 – blog.youyo.info

上記リンクの参考のままでは動かず、ここも設定に工夫が必要でした。mysql -u root -p#{root_password} を mysql -u root -p #{root_password} と -p と パスワードの間にスペースを入れると、対話型でパスワードが聞かれて、最初エラーになりました。スペース無しにすると、そのまま実行してくれる。

以上で、MySQL 5.5.38 の Chef Cookbook は完了です。/etc/my.cnf を最初に作成しないといけない部分と、mysql_secure_installation の箇所がはまりどころでした。

MySQL(/etc/my.cnf)のオプション設定値を考えるのも結構大変でしたが、苦手だった MySQL のパラメータのチューニングについて学べて良かったです。スコープがグローバルとスレッドの2種類のパラメータがあるのに注意するのがポイントのようです。かなり奥が深そう。

スポンサーリンク
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!