WordPressをロードバランサーで負荷分散する際に

f:id:ts0818:20201213125157j:plain

Freediving as a widespread means of hunting and gathering, both for food and other valuable resources such as pearls and coral, dates from before 4500 BCE. By classical Greek and Roman times commercial diving applications such as sponge diving and marine salvage were established.

https://en.wikipedia.org/wiki/Underwater_diving

⇧ な、何と!紀元前4500年に、「フリーダイビング」ってものは行われていたのではないか説に衝撃を受けてます、どうもボクです。

どんな問題も、突き詰めるには深い場所まで潜り込むことが必要ですかね、何かが見つかるという意味では、見つからない場合もあるけども...。

 

By the way, 初のオンライン開催ということのようですが、

phpcon.connpass.com

⇧「PHPカンファレンス 2020」に参加して参りました。  

PHP 8.0」が出たそうな、う~ん、時の流れというやつですかね。

ちなみに、「W3Techs」によると、

w3techs.com

⇧「サーバーサイド言語」の利用率は「PHP(内部ではC言語とかも使われている)」が大部分を占めてるそうですね。

ただ、いまのところ「大規模」なシステム構築ってなると「PHP」だと限界があるそうです、と「PHPカンファレンス 2020」で仰っられた方がおりました。

ちなみに、「W3Techs」は、

W3Techs is a division of Q-Success Web-based Services.

The goal is to collect information about the usage of various types of technologies used for building and running websites, and to produce and publish surveys that give insights into that subject.

Our company has no affiliation with any of the technology providers, which we cover in our surveys.

https://w3techs.com/about

⇧ 情報の収集を目的としてますと。何の?

『「Webサイト」で使用されている技術の種類について』ってことで、「Webシステム」については言及されてないというね...

なので、いまいち、情報の妥当性ってものが疑わしいと思ってしまうんですよね...

せめて「Webシステム」についても情報の収集の対象に含まれているのか、とかハッキリさせて欲しいところですかね...

 

というわけで、初っ端からボヤきが出てしまいましたが、「WordPress」について調べてみました。

レッツトライ~。 

 

WordPressって?

WordPress」と言えば、PHP製のOSSOpen Source Software)な「CMS(Contents Management System)」ということですが、「W3Techs」によりますと、

⇧ 2020年12月1日時点の統計によりますと、「CMS(Content Management Systems)」の市場のシェアは、「WordPress」が「39.3%」で一番ですと。

 

そんな「WordPress」ですが、2020年12月13日(日)現在、

ja.wordpress.org

PHP 7.2 以上、MySQL 5.6 以上、mod_rewrite Apache モジュールが必要です。詳細は Requirements を参照してください。

WordPress の機能 | WordPress.org 日本語

⇧ 上記サイト様によりますと、「WordPress」を利用するためには、 

  1. PHP
  2. データベース(以下どちらか)
  3. Webサーバー(以下どちらか)

などが必要ですと。各々、必要なバージョンがあるみたいね。

「データベース」や「Webサーバー」は上記以外でも、動作するとは思うけども、上記のものが望ましい感じなんですかね。

ただ、詳細を確認しても「データベース」に接続するための「ドライバ」についての言及が無いんだけど、

qiita.com

PDOを使っていたのだが、ある日から上記のメッセージしか出ないようになった。心当たりはPHPのバージョンをアップデートしたことくらい。
PDOからデータベース(僕の場合MySQL)を操作するためのドライバがインストールされてないことが原因らしい。以下のコードで確認できる。

PDOで could not find driver が出たとき - Qiita

⇧ ってな感じで、ハマることが多いようです。

 

www.mysql.com

MySQL では、JDBCODBC、および .Net の標準ベースドライバを提供していますので、最適な言語でアプリケーションを開発することができます。さらに、ネイティブ C ライブラリによって、MySQL を直接アプリケーションに組み込むこともできます。

f:id:ts0818:20201206230727p:plain 

MySQL :: MySQL コネクタ

これらのドライバは、MySQL コミュニティによって開発およびメンテナンスが行われています。

f:id:ts0818:20201206230821p:plain

MySQL :: MySQL コネクタ

PHPはコネクターが無いんね、代わりにドライバをインストールするってことねって思ってたら、

MySQLドキュメントストア」って説明だと、

MySQLドキュメントストアは次のコンポーネントで構成されています。

  • ネイティブJSONドキュメントストレージ: MySQLはネイティブなJSONデータ型提供し、JSONドキュメントを効率的にバイナリ形式で格納し、そのドキュメントに対して仮想列を使用してインデックスも作成できます。また、JSONドキュメントは格納時に自動的に検証されます。
  • Xプラグイン Xプラグインは、MySQLでXプロトコルを使用可能にし、コネクタとMySQLシェルを使用してMySQLサーバーのクライアントとして動作します。
  • Xプロトコル Xプロトコルは、Protobufライブラリをベースにした新しいクライアントプロトコルで、CRUDSQLの両方の操作に対応しています。
  • X DevAPI: X DevAPIは、Xプロトコルの上に構成された、新しく先進的で非同期処理も可能な、CRUDおよびSQL操作のための開発者APIです。新しいスキーマオブジェクトとしてコレクションを導入しています。ドキュメントはコレクションに格納され、専用のCRUD操作が使用できます。
  • MySQL Shell: MySQLシェルは、MySQLサーバーの開発と管理をサポートするインタラクティブJavascriptPython、またはSQLインターフェイスです。MySQLシェルを使用して、データの参照と更新、およびさまざまな管理操作を実行できます。
  • MySQLコネクタ: 次のMySQLコネクタはXプロトコルをサポートしており、好みの開発言語でX DevAPIを使用できます。

MySQL :: MySQL ドキュメントストア

⇧「MySQL Connector/PHP」が存在するというね...

ただ、「MySQL ドキュメントストア」は有償サービスみたいね。

 

他にもハマりどころは多そう...

wordpress.org

dev.classmethod.jp

⇧「MySQL 8.0」で導入されたらしい「ユーザー認証方法」とかも未だに「WordPress」側は未対応なのかしらね...

まぁ、何が言いたいかと言いますと、 

wordpress.org

⇧ 行間から読み取れタイプのドキュメントをどうにしかしてくれって感じですかね...

上記以外にも必要な情報があるでしょうにね...

 

WordPressとデータベースと画像と

まぁ、そんな感じで、「WordPress」のインストールに必要な情報がいまいち分かり辛いのですが、晴れて「WordPress」のインストールに成功すると、

  1. WordPressがインストールされる
  2. データベースにWordPressで使用されるテーブルが作成される

ってことなんですが、 まず、「1.WordPressがインストールされる」については、「WordPress」のバージョンは旧いのですが、

www.nsthink.com

⇧ 上記サイト様が参考になります。上図のような構成の「フォルダ」「ファイル」が一式インストールされます。

 

続きまして「2.データベースにWordPressで使用されるテーブルが作成される」についてすが、「データベース」に以下のようなテーブルが作成されます。 

codex.wordpress.org

⇧「WordPress」のデータは、このテーブル群に保存されていくことになるのですが、ここで厄介なのが「画像」の扱いですかね。

な、何と!

WordPress」の仕様上の問題だとは思うのですが、「画像ファイル」自体が保管されるのが、「1.WordPressがインストールされる」でインストールされた「フォルダ」の中の1つである「wp-content/uploads」フォルダになってしまっているというね。

 

何が宜しくないのか

「wp-content/uploads」フォルダに「画像」が保存されることの何が宜しくないのか?

ザックリと、2つの問題がありますと。

  1. WordPressを配置してるサーバーの容量が圧迫される
  2. 負荷分散した場合に、異なるマシンに配置したWordPressから画像が参照できない

上記の2点が問題になってくるんではないかと。

 

「1.WordPressを配置してるサーバーの容量が圧迫される」については、長期間WordPressを利用していれば、アップロードされる画像の量も大量となるので、相当にサーバーの容量を消費することになるってことですかね。

ただ、この点については、「スケールアップ」すれば対応できますかね。

「2.負荷分散した場合に、異なるマシンに配置したWordPressから画像を参照できない」ってほうが、なかなか難しい問題ですと。

何が、問題かと言うと、負荷分散するということは、当然「スケールアウト」でサーバー台数を複数構成にするということです。

ちなみに、

news.mynavi.jp

経済産業省の審議会のひとつである「JISC」(日本工業標準調査会)は、「外来語の表記に語尾の長音符号を省く場合の原則」として、もともと以下のように定めていました。

「サーバー」と「サーバ」、どっちが正解? - 【ビジネス用語】 | マイナビニュース

Microsoft社は2008年、「コンピュータが日常必需品となり一般化してくるにつれて、長音なしの表記に対し違和感を覚えるユーザーが増えてきたことから、一般的な表記に合わせる時期」と判断。国語審議会の答申を受けて出された、1991年の内閣告示第二号(下記参照)をベースにした表記に順次移行していくことを発表しました。

「サーバー」と「サーバ」、どっちが正解? - 【ビジネス用語】 | マイナビニュース

⇧ って感じで、「サーバ」って表記は日本独自仕様だったらしいね...「JISC」が余計なことをしてくれてたわけです、どうしようもないな...

イメージ的には、以下のような感じですかね。(あくまでイメージなので推測となってしまっている点、ご了承ください。「サーバ」って表記になっちゃってる点もご了承ください。)

f:id:ts0818:20201206213616p:plain

⇧ 上図のイメージのように、Webサーバーを搭載したマシンが複数台あるような構成で、一番左のマシンの「WordPress」の管理画面で「投稿(画像付き)」したとすると、

f:id:ts0818:20201206214530p:plain

⇧ 一番左のマシンの「WordPress」にしか画像が保存されていないということになるため、他のマシンの「WordPress」にアクセスした際に、画像が見つからないということが起こってしまうという。(「画像ファイル」+「画像のパス」の両方がないと画像が表示できないため)

画像以外にも、不整合が発生するような気もするんだけど、WordPressの仕組みに詳しくないので分からん...

というように、「WordPress」で表示するデータの一部が、複数のマシンで共通して参照できる「データベース」などで管理されない問題がありますと。 

 

外部システムに保存した画像を参照させる

WordPress」で画像以外のデータは全て、「データベース」で解決できているっていう仮定が矛盾してないという前提で話を進めると、外部システムに「画像ファイル」を保存して、データベースには「外部システムに保存した画像ファイルのURL」を保存すれば良いってことになるんだと。 (「WordPress」のデータを保存してる「データベース」に「画像ファイル」を保存するテーブルを追加して保存するでも良いとは思うけど)

4thsight.xyz

⇧ 上記サイト様が参考になるかと。

AWSAmazon Web Service)とかで構築する場合は、「Amazon S3(Simple Storage Service)」を利用するのが一般的なんですかね。

hacknote.jp

AWSAmazon Web Service)内のサービスのみで完結できてますね。

日本からのアクセスのみで1ヶ月、10万PVで1リクエスト5MB、サーバー通信で5MB使うと想定します。

WordPress基本構成パターン8-ロードバランサ+オートスケーリングインスタンス | ハックノート

⇧EC2(t3.xlarge)を1台、1ヵ月稼働させた場合、およそ160USDってことで、だいたい16665.52円って...結構なお値段ですかね。

EC2(t3.xlarge)×2台分+ロードバランサーの料金はと言うと、およそ、350USDということで、月々36455.82円!

AWSAmazon Web Service)は使った分だけの、従量課金制とは言うものの、ランニングコストを考えると、財力に余裕のある企業にしか勧められないってことですかね...

まぁ、1ヵ月10万PVもあるようなサイトなら十分元を取れるってことですかね。

私のはてなブログ(無料)がだいたい1ヵ月5万PVですが。(月間10万PVぐらいになって欲しいところです、と思う今日この頃です)

 

WordPressの投稿が画像以外はすべてデータベースからデータを取得しているのかがハッキリしませんが、とりあえず、画像は外部のマシンに配置して参照するようにしておいたほうが良さ気ですね。

真面目に運用しようとすると、「WordPress」ってかなり面倒くさそうな感じですね...

基本的な WordPress ソフトウェアはシンプルで何が起こるか予測しやすいため、簡単に始めることができます。

https://ja.wordpress.org/about/

⇧ う~ん、いろいろ条件あっての「簡単に始めることができます。」ってことな気がしてならないけど...

ちなみに、2020年現在、PHPのWebアプリケーション開発用のフレームワークは「Laravel」の勢いが強いみたいですね。

 

今回はこのへんで。