0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【LifeKeeper for Linux】LAMP環境冗長化のすゝめ

0
Posted at

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を編集をします。この作業は両ノードで実施してください。記載する内容は次のテクニカルドキュメントに書いてある通りです。

/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の編集をやっていきますわよ。

/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/htmlindex.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のみで実施してください。理由が分からなかったので軍師殿に聞きました。

  1. ユーザー情報は「共通」です
    NODE1で作成したapp_userは、NAS上のデータファイルに書き込まれています。
    そのため、NODE2に切り替わった(スイッチオーバーした)後は、NODE2でも自動的にそのapp_userが使えるようになります。改めて、両ノードで個別にユーザーを作る必要はありません。

ほーん、なるほど。これ、前にもどこかで聞きましたね。忘れておりました。

さて、これでLAMP環境の冗長化は終了です。LKWMCに舞台を移して、ちゃんと動作するかどうか確認しに行きましょう。まず、スイッチオーバーする前にApache web serverにアクセスしておきます。

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

稼働中ノードがNODE2に変わっていますね!粋なことをするじゃないですか、軍師殿!!

3.終わりに

此度はLAMP環境を作り、それを冗長化したでござる。MySQL、中々手強かった……。権限周りは謎が深まるばかりでござるな。様々な環境を冗長化することで、課題が見えてきたでござる。同志殿、これからも修行に励むぞ!

これにて、御免!!!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?