PowerCMS X ブログ

2023-12-05

PowerCMS Xの CMSサーバーを EC2冗長構成にする

規模の大きなウェブサイトやアプリケーションを構成する場合に冗長化構成を求められるケースがあります。
この記事では、AWSを利用した CMSサーバー*の冗長化構成のポイントについてまとめます。

EC2を冗長化する構成例

※ 公開側については AWS S3に静的ファイルを配信して Amazon CloudFrontで配信するようなケースが多いと思いますが、説明が複雑化するため、この記事では CMSサーバーに焦点を絞ります。

ポイントは 3つです。

  • 共有ディスクを設定する
  • 適切なキャッシュドライバを選択する
  • スケジュールタスクを負荷分散させる

共有ディスクを設定する

ドキュメントルート配下のコンテンツ以外に、以下のディレクトリを共有ディスクに設定します。lsyncdを使わずに共有ディスクにする理由は以下の通りです。

  • 大量のファイルに更新が入った時に高負荷状態になる
  • 双方向同期でデータが壊れることがある(Hyper Estraierのインデックスファイルなど)
  • タイムラグが発生する可能性がある※

※ ただし、EFSをマウントしたとして、書き込みが遅い問題やタイムラグが出ることもあります。

/home/がマウントされたディスクだとして、アプリケーションディレクトリを以下に設定します。

/home/www/PowerCMSX

他、以下のディレクトリを共有ディスク配下に設定します。

config.json

        "temp_dir": "/home/www/powercmsx-files/tmp",
        "cache_dir": "/home/www/powercmsx-files/cache",
        "support_dir": "/home/www/powercmsx-files/support",
        "assets_c": "/home/www/powercmsx-files/assets_c",
        "assets_c_path": "/assets_c/",
        "tmpl_paths": [
            "/home/www/powercmsx-files/user-customize-files/alt-tmpl"
        ],
        "plugin_paths": [
            "/home/www/powercmsx-files/user-customize-files/plugins"
        ],
        "model_paths": [
            "/home/www/powercmsx-files/user-customize-files/models"
        ],
        "theme_paths": [
            "/home/www/powercmsx-files/user-customize-files/themes"
        ],
        "import_paths": [
            "/home/www/powercmsx-files/user-customize-files/import"
        ],
        "htmlimporter_settings_paths": [
            "/home/www/powercmsx-files/user-customize-files/import_settings"
        ],
        "log_dir": "/home/www/powercmsx-files/logs",

/home/www/powercmsx-files/user-customize-files/ というやたらと長いパスが指定されているのは、代替テンプレートやモデル定義ファイルなどは、PowerCMS Xではパスの長いものが優先されるためです。

/home/www/PowerCMSX/Plugins/VideoCaptions/alt-tmpl/include/edit/upload_file/column_extra_path.tmpl
/home/www/powercmsx-files/user-customize-files/alt-tmpl/include/edit/upload_file/column_extra_path.tmpl //こちらが優先される
/home/www/PowerCMSX/lib/PAML/models/entry.json
/home/www/powercmsx-files/user-customize-files/models/entry.json //こちらが優先される

EFSが遅い対策

あらゆるファイルの読み書きのシーンで EFSが遅いと感じるかもしれませんが、スケジュールタスクについては実行時の一時ディレクトリをローカルの速いディスクに変更できます。「SearchEstraier」や「DocumentSearch」で大量のコンテンツの検索インデックスを洗い替えする時など、ディスクの速度によって実行時間に大きな差が出ます。

config.json

        "work_dir": "/var/www/tmp",

※ temp_dirを共有しなければならない理由は、例えばファイルアップロード後に「保存」ボタンをクリックしてオブジェクトを保存する時、違うインスタンスにリクエストが向いてしまうとファイルを保存できないなど、リクエストをまたがって利用されるファイルがあるからです。

適切なキャッシュドライバを選択する

PowerCMS Xではデータベースへのクエリのみならず、テンプレートのコンパイル結果など様々なデータをキャッシュすることで高速に動作するようになっています。
望ましいのは Amazon Elastic Cacheを利用することです。PowerCMS Xのキャッシュドライバは「Redis」「Memcacached」に対応しています。

避けるべきは EFS配下にキャッシュディレクトリがある場合にキャッシュドライバに「File」を指定することです。読み書きの遅さの影響を受けて遅くなるからです。

Amazon Elastic Cacheが利用できない場合、「MySQL」を指定してください。最新版では、「MySQL」キャッシュの性能が向上しています。

config.json

        "cache_driver": "Redis",

 

あるいは

        "cache_driver": "MySQL",

スケジュールタスクを負荷分散させる

通常スケジュールタスク(worker.phpなどによって実行されるバッチ処理)は一台で実行するように考えていると思いますが、冗長化構成の時、各々のマシンで異なるタスクを処理するような設定が可能です。

*/10 * * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --exclude_ids searchestraier_update_idx,scheduled_publish,scheduled_replacement,scheduled_unpublish
*/10 * * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --exclude_ids searchestraier_update_idx --task_ids scheduled_publish,scheduled_replacement,scheduled_unpublish
0    3 * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/rebuildFiles.php archive --urlmapping_ids 1,2,45,46
0    3 * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --task_ids searchestraier_update_idx

worker.php 実行時には temp_dir配下に「.pid」ファイル(e12d4d581bc48366a79acf9f5a8b0206.pidなどのハッシュ値)が生成され、次回実行時にファイルが存在する時は実行がスキップされます。
この「.pid」ファイルは worker.php に渡す引数によって異なるファイル名になるため、上記のように実行するタスクを分けて cronに設定することができます。

上から

  • HyperEstraierのインデックスの洗い替え、時限公開・公開停止・差し替えを除くスケジュールタスクを10分ごとに実行
  • HyperEstraierのインデックスの洗い替えを除外、時限公開・公開停止・差し替えの時限公開・公開停止・差し替え(他のタスクの実行時間の影響を受けずに時限公開を反映できる)
  • 特定の URLマップに対するアーカイブを毎朝 3時に再構築
  • HyperEstraierのインデックスの洗い替えを毎朝 3時に再構築

となります。これを 2台に分散させます。

EC2 マシンA

*/10 * * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --exclude_ids searchestraier_update_idx,scheduled_publish,scheduled_replacement,scheduled_unpublish
0    3 * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/rebuildFiles.php archive --urlmapping_ids 1,2,45,46

EC2 マシンB

*/10 * * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --exclude_ids searchestraier_update_idx --task_ids scheduled_publish,scheduled_replacement,scheduled_unpublish
0    3 * * * apache cd /home/www/PowerCMSX/ && /usr/bin/php ./tools/worker.php --task_ids searchestraier_update_idx

カテゴリー:サイト制作全般 | 技術情報

投稿者:Junnama Noda

ブログ内検索

アーカイブ