1.はじめに
御免仕る!LifeKeeper初心者侍だ。冬も明け、桜も咲き、春でござるなぁ。
ここで一句詠むとしよう。
種蒔けど 芽吹かぬリソース 紅の窓
うむ、いい句だ。同志殿も一句詠んでみてはどうだろうか。
……はい、こんにちは。今回はLAMP環境をLifeKeeperで保護してみようと思います。
内に潜む侍はエラーの連発で参ってるようですね。変な俳句を詠み始めてます。まぁ春だから仕方ないですね。
ちなみに、現代の日本は暖かいのであっという間に桜は散ります。良くて葉桜ですよ、侍殿。
この記事で分かること
- LAMP環境構築手順
- MySQLの導入とLifeKeeperでのリソース作成方法
- PHPの導入
今回も前回と同様に引き続き同じ環境(Hyper-V、AlmaLinux 10)を使っていきます。
いざ!推して参る!!!
2. LAMP環境
LAMP環境はOSS(オープンソースソフトウェア)で構築され、低コストかつ柔軟な運用ができることが最大の魅力です。そんなLAMP環境を作ってくれるのは次の4つです。
- Linux(OS)
- Apache(Web server)
- MySQL(DataBase)
-
PHP
では実際にLAMP環境を構築していきましょう。
2.1 LAMP環境の構築
まずはOSのインストールと設定ですね。今回はLifeKeeperで冗長化するのでLifeKeeperをインストールするための設定も一気にやってしまいましょう。こちらを参考にしてください。
Apache、MySQL、PHP(今回はPHPを使用します)のパッケージをインストールします。これらのパッケージはデフォルトでローカルリポジトリに含まれているためdnfコマンドでインストールします。
# dnf -y install httpd
# dnf install mysql8.4-server
# dnf install -y php php-mysqli php-json
これで必要なものは揃いましたね。本来LAMP環境を構築するだけであればMySQLのデーターディレクトリをApacheの設定に反映させるだけでいいのですが、LifeKeeperでLAMP環境を冗長化するための準備が挟まります。
2.2 LAMP環境を冗長化するための準備
といいましても、このタイミングでLifeKeeperをインストールして仮想IPリソースとDataKeeperリソース(ファイルシステムリソースおよびDataKeeperリソース、以後DataKeeperリソースと呼称)を作成するだけです。
LifeKeeperのインストールと仮想IP、DataKeeperリソースの作成に関しては以下の記事を参考にしてください。
なぜこの作業を挟むかというと、Apacheでは仮想IPをcnfファイルのListen項目に記載する必要がありましたね。またLifeKeeperでMySQLを保護する際に使用するRecovery Kit for MySQLが正しく機能するためには、データディレクトリーが常に共有ディスク上にある必要があるんですね。リソースの作成順としては次の図のようなイメージです。
詳細は以下のページをご参照ください。
LifeKeeperでの設定が終わったら、Apache、MySQLの各設定に工程を移します。Apacheは前回の記事で解説しているので、そちらを参考にしてください。今回はMySQLの設定について解説します。
2.3 MySQLの設定
この作業は両ノードで実施します。まず先にMySQLを起動しておきましょう。
# systemctl start mysqld
# systemctl disable mysqld
そしたら、MySQLのユーザーを作成していきます。デフォルトはrootユーザーとなっています。ここで/val/log/mysql/mysqld.logを確認してみてください。
「[Warning] [MY-010453] [Server] root@localhost is created with an empty password !」と記載してあればパスワードは存在しないため、パスワードを求められてもEnterを押してしまって大丈夫です。さっそくログインしていきます。
mysql -u root -p
まずはroot用のパスワードを変更します。これをしないと他の操作ができないため注意してくださいね。
ALTER USER 'root'@'localhost' IDENTIFIED BY '任意のパスワード';
次に作業用ユーザーの作成をします。今回はmysqlユーザーを作成します。
CREATE USER 'mysql'@'localhost' IDENTIFIED BY '任意のパスワード';
そして全権限の付与をします。
GRANT ALL PRIVILEGES ON *.* TO 'mysql'@'localhost';
この設定を反映させて終了します。
FLUSH PRIVILEGES;
EXIT;
ここまでできたら両ノードでMySQLを停止させておきましょう。
# systemctl stop mysqld
次にMySQLのデータ保存先(データディレクトリ)を/var/www/html下に設定します。ここからの作業はNODE1のみで実施します。
データディレクトリを作成し、MySQLの初期設定ファイルやシステムテーブルをDataKeeperで管理する領域に置くため、/var/lib/mysql下にあるデータを丸ごとコピーしてきます。
# mkdir -p /var/www/html/mysql_data
# cp -rp /var/lib/mysql/* /var/www/html/mysql_data/
そして所有権をmysqlユーザーに設定します。
chown -R mysql:mysql /var/www/html/mysql_data
次に/etc/my.cnfを編集をします。この作業は両ノードで実施してください。記載する内容は次のテクニカルドキュメントに書いてある通りです。
# [client-server]の下に記載する。
[mysqld]
datadir=/var/www/html/mysql_data
socket=/var/www/html/mysql_data/mysql.sock
port =3307
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
user =mysql
[client]
user = mysql
password = 任意のパスワード
おそらくselinuxがmysqlの起動を阻むので、/etc/selinux/configを編集し、
SELINUX=permissive
とします。またリソース作成前にid mysqlコマンドでNODE1とNODE2で同じIDが出力されていることを確認してください。これが一致していないとエラーを吐かれます。
[root@NODE1 ~]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
[root@NODE2 ~]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
こんな感じで同じIDが出力されていれば問題ないです。
2.4 MySQLのリソース作成
LifeKeeperでリソースを作っていきましょう。段々お馴染みになってきましたね。
オペレーション⇒MySQL Databaseを選択します。そうすると、my.cnfはどこにあるんじゃ、MySQL実行パスはどこにあるんじゃ、と聞かれますのでお答えしてあげましょう。my.cnfは/etcにあります。実行パスはデフォルトのままで大丈夫です。
ここで/etc/my.cnfと書くとエラーが出ました。なので/etcとだけ書いてください。
確かにディレクトリ内を探してくれるので、当たり前っちゃ当たり前なんですけど、やはり親切心から書いちゃいますよね。
そんな親切心はいらない、ということです(;ω;)
ちなみに、my.cnfにデフォルトで書いてある
# include all files from the config directory
#
!includedir /etc/my.cnf.d
は使用できないため、設定文は全てmy.cnfに記載してください。
注意: include文は使用できません。単一のmy.cnfに全ての設定を記述してください。
と考慮事項のページの一番下に書いてありました。私は見逃していましたね。(何があったかは語る必要もありません(涙))
2.4 PHPの設定
さて、気を取り直してPHPの設定に参りましょう。両ノードで作業してください。
systemctl enable php-fpm
このphp-fpmが盲点で、AlmaLinux 10のApacheはPHPを動かすのにphp-fpmを使用するようですね。これを起動していなかったせいで、NODE1からNODE2へスイッチオーバーしたあとService Unavailableと出ました。
お次に/etc/php.iniの編集をやっていきますわよ。
mysqli.default_socket = /var/www/html/mysql_data/mysql.sock
pdo_mysql.default_socket = /var/www/html/mysql_data/mysql.sock
そしたら/var/www/htmlにindex.phpを作成します。
このとき元々置いていたindex.htmlはバックアップを取って削除しておいてね。
満を持して、Apacheのウェブページを開こうとしたらこのページは動作してませんと怒られました(ヒェン……シテ……ドウシテ……)。
# php /var/www/html/index.php
軍師殿に泣きついたら、このコマンドを教えてもらいました。これで何が原因で怒られているのか分かります。理由も分からずに怒られるのは理不尽ですからね。
理由としては、MySQLには辿り着けるけどログインできないよ(Access denied) ということでした。なので今回はテスト用と称して、外部接続用ユーザーを作成し全権限を与えることで解決することにしました。
PHPを使用するためのMySQLのユーザーを作成し全権限を与えます。
# -- 'app_user' という名前のユーザーを、パスワード 'AppPass124!' で作成
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppPass124!';
# -- このユーザーに、すべての操作権限を与える(テスト用)
GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'localhost';
# 設定の反映
FLUSH PRIVILEGES;
Exit;
このユーザー作成はNODE1のみで実施してください。理由が分からなかったので軍師殿に聞きました。
- ユーザー情報は「共通」です
NODE1で作成したapp_userは、NAS上のデータファイルに書き込まれています。
そのため、NODE2に切り替わった(スイッチオーバーした)後は、NODE2でも自動的にそのapp_userが使えるようになります。改めて、両ノードで個別にユーザーを作る必要はありません。
ほーん、なるほど。これ、前にもどこかで聞きましたね。忘れておりました。
さて、これでLAMP環境の冗長化は終了です。LKWMCに舞台を移して、ちゃんと動作するかどうか確認しに行きましょう。まず、スイッチオーバーする前にApache web serverにアクセスしておきます。

ちゃんと動いているようですね。もちろん今回も軍師殿にこのページを作ってもらいました。前回とは打って変わったデザインですね。この記事を書いてるときに気づきましたが、LifeKeeper MySQL ClusterではなくLifeKeeper LAMP Clusterにしてもらえばよかったですね。ぬかりました。
ではいつも通りスイッチオーバーをして、同様にweb serverが開けるかも確認しましょう。

稼働中ノードがNODE2に変わっていますね!粋なことをするじゃないですか、軍師殿!!
3.終わりに
此度はLAMP環境を作り、それを冗長化したでござる。MySQL、中々手強かった……。権限周りは謎が深まるばかりでござるな。様々な環境を冗長化することで、課題が見えてきたでござる。同志殿、これからも修行に励むぞ!
これにて、御免!!!