Apache上で複数のMySQLインスタンスを運用することは、複数のアプリケーションを同一サーバー上で効率的に管理するために有効な方法です。これにより、各アプリケーションが独自のMySQLインスタンスを持ち、データの分離が容易になります。例えば、開発環境やテスト環境、本番環境を同一のサーバーで動作させる場合、それぞれ異なるMySQLインスタンスを利用することで、環境間のデータが干渉しないようにすることが可能です。
本記事では、Apache上で複数のMySQLインスタンスを設定・管理する具体的な方法を、初心者でもわかりやすくステップバイステップで解説します。必要な環境の準備から、インスタンスの複製、設定ファイルの編集、サービスの起動、さらにはトラブルシューティングまでを網羅し、安定したシステム運用を実現するための知識を提供します。
MySQLの複数インスタンスが必要な理由
MySQLの複数インスタンスを運用することは、複数のプロジェクトやアプリケーションが同一サーバーで動作する場合に大きな利点をもたらします。主な理由は以下の通りです。
リソースの分離と安全性の向上
各インスタンスが独立して動作するため、アプリケーション間でのデータ干渉が防げます。これにより、一方のアプリケーションがデータの破損や誤操作をしても、他のインスタンスには影響を与えません。
環境ごとのデータベース管理
開発、テスト、本番などの異なる環境を1台のサーバーで構築する際に、複数のMySQLインスタンスを利用することで、環境間のデータが混在することなく運用できます。これにより、環境ごとに異なる設定やパラメータを使用することが可能です。
異なる設定要件への対応
アプリケーションによっては、MySQLの設定要件が異なる場合があります。例えば、あるアプリケーションでは大容量データを扱い、大きなメモリバッファが必要ですが、別のアプリケーションでは軽量な構成が求められます。複数インスタンスを使うことで、それぞれの要件に最適な設定を施すことができます。
コスト削減と効率向上
複数の物理サーバーを用意する代わりに、1台のサーバー上で複数のインスタンスを動作させることで、ハードウェアコストや運用コストを削減できます。また、サーバーのリソースを効率的に活用できるため、運用全体のパフォーマンスが向上します。
これらの理由から、MySQLの複数インスタンス運用は、特に中規模から大規模のシステムにおいて重要な役割を果たします。
MySQLの複数インスタンスの基本構成
MySQLの複数インスタンスを運用するためには、各インスタンスが独立したデータディレクトリと設定ファイルを持つ必要があります。これにより、インスタンスごとに異なるポート番号やソケット、ログファイルを指定でき、互いに干渉することなく動作します。
複数インスタンスのアーキテクチャ
MySQLの複数インスタンスは以下のような構成を持ちます。
- データディレクトリ:インスタンスごとに専用のデータディレクトリを作成し、データを完全に分離します。
- 設定ファイル(my.cnf):インスタンスごとに異なる設定ファイルを用意し、ポート番号やバッファサイズなどのパラメータを指定します。
- サービスプロセス:各インスタンスは独立したサービスとして登録され、システム起動時に自動的に起動するように設定されます。
- ログ管理:エラーログやスロークエリログもインスタンスごとに出力先を分けることで、問題発生時の解析が容易になります。
基本構成の例
以下は、2つのMySQLインスタンス(3306番ポートと3307番ポート)を同一サーバーで動作させる際の構成例です。
/etc/mysql/
├── my.cnf # メイン設定ファイル
├── my3306.cnf # 3306番ポート用の設定
├── my3307.cnf # 3307番ポート用の設定
/var/lib/mysql/
├── mysql3306 # 3306番ポートのデータディレクトリ
├── mysql3307 # 3307番ポートのデータディレクトリ
/var/log/mysql/
├── mysql3306.log # 3306番ポート用のログ
├── mysql3307.log # 3307番ポート用のログ
各要素の役割
- my.cnf:グローバル設定を記述するが、基本的には個別のインスタンス設定が優先される。
- my3306.cnf / my3307.cnf:各インスタンスに固有のポート番号やディレクトリを記述し、それぞれ独立して動作。
- mysql3306 / mysql3307:インスタンスごとのデータベースファイル群が格納される。
このように構成を整理することで、運用時の混乱を避け、効率的に複数インスタンスを管理できるようになります。
必要な環境と準備
MySQLの複数インスタンスをApache環境で運用するためには、事前に必要な環境を整え、準備を進めることが重要です。以下では、環境の確認から必要なファイルの準備までを詳しく解説します。
必要なソフトウェアとバージョン要件
- Apache:バージョン2.4以上が推奨されます。
- MySQL:バージョン5.7以上が望ましく、複数インスタンス運用において安定性が向上しています。
- OS:Linux(Ubuntu, CentOSなど)が最も一般的ですが、Windows Server環境でも構築可能です。
環境の確認
以下のコマンドを使用して、ApacheとMySQLがすでにインストールされているかを確認します。
# Apacheのバージョン確認
apachectl -v
# MySQLのバージョン確認
mysql --version
もしインストールされていない場合は、以下のようにインストールします。
# ApacheとMySQLのインストール (Ubuntu)
sudo apt update
sudo apt install apache2 mysql-server
MySQLインスタンスの複製準備
デフォルトのMySQLインスタンスを複製するためのディレクトリ構成を準備します。以下の手順でデータディレクトリを作成し、複数インスタンス用のベースを整えます。
# データディレクトリの作成
sudo mkdir /var/lib/mysql3306
sudo mkdir /var/lib/mysql3307
# 権限の設定
sudo chown -R mysql:mysql /var/lib/mysql3306
sudo chown -R mysql:mysql /var/lib/mysql3307
設定ファイルの準備
MySQLの複数インスタンスを設定するために、デフォルトの設定ファイルを複製し、それぞれのインスタンス用に編集します。
# 設定ファイルのコピー
sudo cp /etc/mysql/my.cnf /etc/mysql/my3306.cnf
sudo cp /etc/mysql/my.cnf /etc/mysql/my3307.cnf
ネットワークとポートの確認
複数のMySQLインスタンスを同時に稼働させるためには、それぞれ異なるポート番号を使用する必要があります。デフォルトではポート3306が使用されますが、他のインスタンスには3307や3308などを割り当てます。
sudo netstat -tuln | grep 3306
このコマンドで使用中のポートを確認し、他のポートが空いているかチェックします。
これで、MySQLの複数インスタンスを構築するための準備が整いました。次は、実際にMySQLインスタンスを複製し、個別の設定を進めていきます。
MySQLの複製とデータディレクトリの作成
MySQLの複数インスタンスを運用するには、既存のMySQLインスタンスを複製し、新たなデータディレクトリを作成する必要があります。これにより、各インスタンスが独立した環境で動作し、データの分離が可能になります。
データディレクトリの複製
既存のMySQLデータディレクトリを複製し、新しいインスタンス用のディレクトリを作成します。以下の手順でデータディレクトリを準備します。
# MySQLを停止(安全のため)
sudo systemctl stop mysql
# 新しいデータディレクトリの作成
sudo mkdir /var/lib/mysql3306
sudo mkdir /var/lib/mysql3307
# デフォルトデータをコピー
sudo cp -R /var/lib/mysql/* /var/lib/mysql3306/
sudo cp -R /var/lib/mysql/* /var/lib/mysql3307/
# 権限の変更
sudo chown -R mysql:mysql /var/lib/mysql3306
sudo chown -R mysql:mysql /var/lib/mysql3307
データディレクトリの初期化
新しく作成したデータディレクトリが正しく初期化されているか確認し、不足しているファイルがないかを確認します。もし不完全な場合は、以下のコマンドで初期化を実行します。
# MySQLデータディレクトリの初期化
sudo mysqld --initialize --datadir=/var/lib/mysql3306
sudo mysqld --initialize --datadir=/var/lib/mysql3307
ソケットファイルとPIDファイルの作成
MySQLはデフォルトで /var/run/mysqld/
にソケットファイルとPIDファイルを作成します。複数インスタンスを運用する際には、それぞれ独自のソケットファイルとPIDファイルが必要です。
sudo mkdir /var/run/mysqld3306
sudo mkdir /var/run/mysqld3307
# 権限の設定
sudo chown mysql:mysql /var/run/mysqld3306
sudo chown mysql:mysql /var/run/mysqld3307
データディレクトリの確認
作成したデータディレクトリが正しく配置されているか、以下のコマンドで確認します。
ls -la /var/lib/mysql3306
ls -la /var/lib/mysql3307
ディレクトリ内に ibdata1
や mysql
フォルダが存在することを確認してください。
複製の完了
これでMySQLインスタンス用のデータディレクトリが複製されました。次は、各インスタンスごとに個別の設定ファイルを編集し、ポート番号やソケットの指定を行います。
設定ファイル(my.cnf)の編集方法
MySQLの複数インスタンスを適切に管理するためには、それぞれのインスタンスが異なるポート、データディレクトリ、ソケットを使用するように設定ファイル(my.cnf
)を編集する必要があります。これにより、インスタンス間の干渉を防ぎ、独立した動作が可能になります。
設定ファイルの複製と配置
まず、デフォルトのmy.cnf
を複製してインスタンスごとに設定ファイルを作成します。
# 設定ファイルのコピー
sudo cp /etc/mysql/my.cnf /etc/mysql/my3306.cnf
sudo cp /etc/mysql/my.cnf /etc/mysql/my3307.cnf
複製した設定ファイルは、それぞれのインスタンス用に編集します。
my.cnfの編集例(ポート3306用)
/etc/mysql/my3306.cnf
を以下のように編集します。
[mysqld]
port = 3306
socket = /var/run/mysqld3306/mysqld.sock
pid-file = /var/run/mysqld3306/mysqld.pid
datadir = /var/lib/mysql3306
log-error = /var/log/mysql/mysql3306.log
my.cnfの編集例(ポート3307用)
/etc/mysql/my3307.cnf
は以下のように編集します。
[mysqld]
port = 3307
socket = /var/run/mysqld3307/mysqld.sock
pid-file = /var/run/mysqld3307/mysqld.pid
datadir = /var/lib/mysql3307
log-error = /var/log/mysql/mysql3307.log
編集ポイントの詳細解説
- port:各インスタンスごとに異なるポートを指定します。一般的には3306がデフォルトですが、複数インスタンスを運用する場合は3307、3308と順番に指定します。
- socket:ソケットファイルの場所をインスタンスごとに分けることで、接続が競合しないようにします。
- pid-file:プロセスIDファイルをインスタンスごとに指定することで、サービス管理が容易になります。
- datadir:インスタンスごとのデータディレクトリを指定し、データを分離します。
- log-error:エラーログファイルを分けて指定し、インスタンスごとに個別のログを記録します。
設定の確認
設定が正しく記述されているか確認するために、以下のコマンドでファイルをチェックします。
sudo mysqld --defaults-file=/etc/mysql/my3306.cnf --verbose --help
sudo mysqld --defaults-file=/etc/mysql/my3307.cnf --verbose --help
エラーが表示されなければ、設定ファイルの編集は完了です。次は、これらの設定ファイルを元にMySQLインスタンスをサービスとして登録し、起動します。
サービスの登録と起動方法
複数のMySQLインスタンスを運用するためには、それぞれのインスタンスをシステムサービスとして登録し、自動的に起動・停止できるように設定します。これにより、サーバー再起動時にも各インスタンスが自動的に復旧します。
MySQLサービスの複製
デフォルトのMySQLサービスユニットファイルを複製し、それぞれのインスタンス用に編集します。
# systemdサービスファイルの複製
sudo cp /lib/systemd/system/mysql.service /etc/systemd/system/mysql3306.service
sudo cp /lib/systemd/system/mysql.service /etc/systemd/system/mysql3307.service
サービスファイルの編集
複製したmysql3306.service
とmysql3307.service
を編集して、各インスタンスが異なる設定ファイルを参照するようにします。
/etc/systemd/system/mysql3306.service
[Unit]
Description=MySQL 3306 Server
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my3306.cnf
LimitNOFILE = 5000
[Install]
WantedBy=multi-user.target
/etc/systemd/system/mysql3307.service
[Unit]
Description=MySQL 3307 Server
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/my3307.cnf
LimitNOFILE = 5000
[Install]
WantedBy=multi-user.target
サービスのリロードと登録
編集が完了したら、systemdに新しいサービスを認識させます。
# systemdの再読み込み
sudo systemctl daemon-reload
# サービスの登録
sudo systemctl enable mysql3306.service
sudo systemctl enable mysql3307.service
MySQLインスタンスの起動
各MySQLインスタンスを起動し、動作を確認します。
# MySQLインスタンスの起動
sudo systemctl start mysql3306.service
sudo systemctl start mysql3307.service
起動状況の確認
インスタンスが正常に起動しているか確認します。
sudo systemctl status mysql3306.service
sudo systemctl status mysql3307.service
もし「active (running)」と表示されていれば、正常に起動しています。
自動起動の確認
サーバー再起動時に自動的にMySQLインスタンスが起動するように設定されているか確認します。
sudo systemctl list-unit-files | grep mysql
mysql3306.service
とmysql3307.service
が「enabled」と表示されていれば、自動起動が有効になっています。
MySQLへの接続テスト
各インスタンスに接続して、動作を確認します。
mysql -u root -S /var/run/mysqld3306/mysqld.sock
mysql -u root -S /var/run/mysqld3307/mysqld.sock
これで複数のMySQLインスタンスがサービスとして登録され、正常に動作する環境が整いました。次は、ApacheとMySQLの連携設定を行います。
Apacheとの連携設定
MySQLの複数インスタンスをApacheで使用するためには、各インスタンスに適切に接続できるようApacheの設定を行います。これにより、複数のWebアプリケーションがそれぞれ独立したMySQLインスタンスに接続できるようになります。
PHPのインストールと設定確認
ApacheがMySQLに接続するためには、PHPとMySQL用の拡張モジュールが必要です。以下のコマンドで必要なパッケージをインストールします。
# PHPとMySQL拡張モジュールのインストール
sudo apt install php libapache2-mod-php php-mysql
インストール後、Apacheを再起動してモジュールを有効にします。
sudo systemctl restart apache2
PHPから複数のMySQLインスタンスに接続
PHPで複数のMySQLインスタンスに接続する際は、PDOやmysqliを使用して接続情報を指定します。以下は、複数インスタンスに接続するサンプルコードです。
接続用PHPスクリプト(mysql_connect_test.php)
<?php
// 3306インスタンスへの接続
$dsn1 = 'mysql:host=localhost;port=3306;dbname=testdb';
$user = 'root';
$password = 'your_password';
try {
$dbh1 = new PDO($dsn1, $user, $password);
echo "Connected to MySQL instance on port 3306.<br>";
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage() . "<br>";
}
// 3307インスタンスへの接続
$dsn2 = 'mysql:host=localhost;port=3307;dbname=testdb';
try {
$dbh2 = new PDO($dsn2, $user, $password);
echo "Connected to MySQL instance on port 3307.<br>";
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage() . "<br>";
}
?>
このスクリプトを/var/www/html/
に配置し、ブラウザで確認します。
sudo cp mysql_connect_test.php /var/www/html/
ブラウザで以下のURLにアクセスします。
http://<サーバーIP>/mysql_connect_test.php
正しく接続できた場合は「Connected to MySQL instance on port 3306」「Connected to MySQL instance on port 3307」と表示されます。
Apacheのバーチャルホスト設定(複数アプリケーション用)
Apacheが複数のWebアプリケーションをそれぞれ異なるMySQLインスタンスに接続するためには、バーチャルホストの設定を行います。
バーチャルホスト設定例(/etc/apache2/sites-available/app1.conf)
<VirtualHost *:80>
ServerAdmin admin@app1.com
DocumentRoot /var/www/app1
ServerName app1.local
<Directory /var/www/app1>
AllowOverride All
</Directory>
SetEnv DB_PORT 3306
ErrorLog ${APACHE_LOG_DIR}/app1_error.log
CustomLog ${APACHE_LOG_DIR}/app1_access.log combined
</VirtualHost>
/etc/apache2/sites-available/app2.conf
<VirtualHost *:80>
ServerAdmin admin@app2.com
DocumentRoot /var/www/app2
ServerName app2.local
<Directory /var/www/app2>
AllowOverride All
</Directory>
SetEnv DB_PORT 3307
ErrorLog ${APACHE_LOG_DIR}/app2_error.log
CustomLog ${APACHE_LOG_DIR}/app2_access.log combined
</VirtualHost>
バーチャルホストを有効にします。
sudo a2ensite app1.conf
sudo a2ensite app2.conf
sudo systemctl reload apache2
PHPでポート情報を利用する
バーチャルホストごとに設定されたDB_PORT
環境変数をPHPで利用して、動的にMySQLインスタンスを切り替えます。
<?php
$port = getenv('DB_PORT');
$dsn = "mysql:host=localhost;port=$port;dbname=testdb";
$user = 'root';
$password = 'your_password';
try {
$dbh = new PDO($dsn, $user, $password);
echo "Connected to MySQL on port $port.";
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
これでApacheを通じて、複数のMySQLインスタンスに適切に接続できる環境が整いました。次は、トラブルシューティングとデバッグ方法を解説します。
トラブルシューティングとデバッグ方法
MySQLの複数インスタンスをApacheと連携して運用する際には、さまざまな問題が発生する可能性があります。ここでは、よくある問題とその解決方法を解説します。
MySQLインスタンスが起動しない場合
MySQLインスタンスが正常に起動しない場合は、設定ファイルの記述ミスやポートの競合が原因となっている可能性があります。
1. ログファイルを確認
エラーログを確認して、具体的なエラーメッセージを特定します。
sudo cat /var/log/mysql/mysql3306.log
sudo cat /var/log/mysql/mysql3307.log
2. ポートの競合を確認
他のサービスが指定したポートを使用していないか確認します。
sudo netstat -tuln | grep 3306
解決方法:
- ポートがすでに使用されている場合は、
my.cnf
を編集して空いているポートに変更します。 - 設定変更後、MySQLサービスを再起動します。
sudo systemctl restart mysql3306.service
sudo systemctl restart mysql3307.service
ApacheからMySQLに接続できない場合
PHPスクリプトやアプリケーションがMySQLに接続できない場合は、以下の点を確認します。
1. ソケットファイルの存在確認
指定したソケットファイルが存在しているか確認します。
ls /var/run/mysqld3306/mysqld.sock
ls /var/run/mysqld3307/mysqld.sock
ソケットが存在しない場合は、my.cnf
のsocket
設定が正しいか確認し、再起動します。
sudo systemctl restart mysql3306.service
2. PHPスクリプトでの接続テスト
PHPスクリプトを直接実行して、接続テストを行います。
php /var/www/html/mysql_connect_test.php
エラーメッセージが出力された場合は、メッセージ内容に従って設定を見直します。
ポート接続エラーの対処法
以下のようなエラーが表示される場合があります。
Connection failed: SQLSTATE[HY000] [2002] No such file or directory
これは、ポートやソケットの指定が間違っている可能性があります。
解決策:
- PHPスクリプトでポート番号やソケットのパスを正しく指定しているか確認します。
my.cnf
のport
およびsocket
設定を見直し、間違いがあれば修正します。
$dsn = 'mysql:host=localhost;port=3307;dbname=testdb';
MySQLインスタンスの自動起動が機能しない場合
MySQLインスタンスがシステム起動時に自動で起動しない場合は、サービスが正しく登録されているか確認します。
sudo systemctl list-unit-files | grep mysql
mysql3306.service
とmysql3307.service
がenabled
になっていなければ、有効化します。
sudo systemctl enable mysql3306.service
sudo systemctl enable mysql3307.service
データの競合や破損が発生した場合
複数インスタンスが同じデータディレクトリを共有している場合、データが破損する可能性があります。
解決策:
- 各インスタンスが異なる
datadir
を使用しているか確認します。 - データディレクトリが重複している場合は、新たにディレクトリを作成し、設定を修正します。
sudo mkdir /var/lib/mysql3308
sudo chown -R mysql:mysql /var/lib/mysql3308
まとめ
トラブルシューティングでは、ログの確認が重要です。問題が発生した場合は、エラーログをもとに原因を特定し、設定を見直します。ApacheとMySQLの連携は多くの要素が絡むため、一つずつ順番に確認することが効果的です。
まとめ
本記事では、Apache上でMySQLの複数インスタンスを運用する方法について解説しました。MySQLの複数インスタンスを利用することで、プロジェクトやアプリケーションごとに独立したデータベース環境を構築し、リソースの分離やデータの安全性を高めることが可能です。
具体的には、MySQLのデータディレクトリの複製や設定ファイル(my.cnf
)の編集、複数のサービス登録とApacheとの連携設定を行いました。また、トラブルシューティング方法を通じて、実運用での問題解決スキルも習得できたかと思います。
これらの知識を活用することで、複数の環境やアプリケーションを同一サーバー上で効率的に運用し、コスト削減やパフォーマンス向上を実現できるでしょう。
コメント