ハンドアウト

オープンソースシステムを利用した
大規模Webサイトの構築
Apache/PHP/PostgreSQLを利用した大規模Webサイトを構築す
る際のシステム設計とPHPプログラミングについて
大垣 靖男
<[email protected]>
日本PHPユーザー会
Electronic Service Initiative, Ltd.
大規模Webシステムの必要要件
„
大規模システムには高いシステムパフォーマンスが必要
多数の同時ユーザーに対応
高いWebサーバー負荷
多数の同時接続に対応
高いDBサーバー負荷
非常に多いネットワークトラフィック
高いネットワーク負荷
„
大規模なWebシステムでは負荷を効率よく分散し、ボトルネックになるシステムを作らな
いことが重要
システム規模、システムの特徴をインフラ設計/システム設計/コーディングが重要
„
大規模Webシステムの必要要件
„
„
„
„
„
„
„
多数の同時ユーザー数への対応
多数の同時接続数への対応
大量のネットワークトラフィックへの対応
ここでは、単純化のため、システム可用性の確保などは考慮しないこととする(実際のシステムで
は当然考慮しなければならない)
ここでいう大規模Webシステムとはシステムの複雑性ではなく、システムユーザーの規模が大規
模であることとする
大規模Webシステムは高性能であることが必須条件
Electronic Service Initiative, Ltd.
1
大規模WebシステムはApache/PHP/PostgreSQLで
構築できるか?
„
現状のApache/PHP/PostgreSQLでもかなり大規模なシステム構築が可能
„
Apache/PHP/PostgreSQLの問題点
„
„
„
„
Apacheには大きな問題が無いが、非常に多い同時リクエストが発生した場合のパフォーマンス
確保が課題
PHPのPostgreSQLモジュールにはコネクションプーリング機能が無いため、DB性能の確保が課
題
PostgreSQLはレプリケーション機能が弱い
PHPは比較的高速に動作するサーバーサイドスクリプト言語だが、大規模システムには
向かない側面を持つ
„
スクリプト型言語
„
„
„
コネクションプーリングが未サポート
„
„
„
モジュールとして動作していても、PHPエンジンを利用するだけでWebサーバーのパフォーマンスは半分以
下に低下
スクリプト実行は遅い
永続的接続はサーバープロセス/スレッド毎に確保
他の多くのシステムと同様にPostgreSQLは同時ユーザー数が多すぎると100%の性能が発揮できない
PHPを利用した大規模サイトの構築にはちょっとした工夫が必要!
Electronic Service Initiative, Ltd.
大規模Webサイト構築の注意点
„
„
„
„
„
システム負荷の見積もり
各システムの性能特性の把握
ページのリアルタイム性の評価
„
„
„
必要なログの評価
サブシステム間での連携(関係)
の評価
„
„
ピークシステム負荷は?
ピーク性能特性は?
リアルタイム性が必要なページ
(データ)は?
どのようなログが必要か?
サブシステム間での連携時の性
能は?
700
600
500
リクエス ト数
表示遅延
クエリ数
処理遅延
400
300
200
100
0
64
128
192
256
Electronic Service Initiative, Ltd.
2
PHPからPostgreSQLへのアクセスにおける問題点
„
Pgsqlモジュールの永続的DB接続と非永続的DB接続
„
„
„
永続的接続はDB接続をWebサーバープロセスが終了するまで維持
非永続的接続はリクエスト終了時にDB接続を切断
コネクションプーリング
„
„
„
データベース性能の確保には重要な技術
PHPはコネクションプーリングをサポートしていない
コネクションプーリングと同様な仕組みはシステム構成またはPHPプログラムで作成
可
Electronic Service Initiative, Ltd.
他のPHPの問題点
„
スクリプトエンジン
„
„
„
„
„
Webサーバー(Apache) とPHP
„
„
„
PHPは内部的にプログラムをバイトコード(中間コード)にコンパイルし実行する
1行のバイトコードの実行にはC言語にして数千行以上のコードが実行される
リクエストをまたがるデータ保持を行う、効率的な機能が提供されていない
オブジェクト指向プログラミングはオーバーヘッドが大きい
モジュールとして実行されたPHPはPHPスクリプト実行しなくてもパフォーマンスを低
下させる
実行されないコードもリクエスト毎にコンパイルするため、読み込むコード量に比例し
てパフォーマンスが低下する
セッションとシリアライズ
„
PHP Sessionモジュールはオーバーヘッドが大きいserialize/unserializeを実行する
Electronic Service Initiative, Ltd.
3
通常のシステム構成
„
Apache/PHP/PostgreSQLを利用したWebシステム
ファイアーウォール
Apache+PHPサーバー
Apache+PHPサーバー
Apache+PHPサーバー
PostgreSQLサーバー
Electronic Service Initiative, Ltd.
通常のシステム構成の問題点
„
「通常のWebシステム」の特徴
„
„
„
„
„
複数あるWebサーバーは全て同じサービスを提供
データベースサーバーへの接続は非永続的接続を利用し、最大接続数を超えて接
続に失敗した場合は再接続を試みる(または永続的接続を使用)
ファイアーウォールは接続制限などを行わない
負荷分散はラウンドロビンDNSを利用する
「通常のWebシステム」の問題点
„
Webサーバーへの負荷分散の為に、Webサーバーを追加する事が難しい
„
瞬間的な高負荷に対応しにくい
„
全てのページリクエストが全てのWebサーバーで処理されている
„
„
„
データベースサーバーへの接続数が多くなりすぎる
リバースプロキシーが無い
負荷の高いプログラムなどにシステム全体の性能が左右される
Electronic Service Initiative, Ltd.
4
スケーラビリティーを考慮したシステム構成の例
„
Apache/PHP/PostgreSQLを利用したシステム
ファイアーウォール
--limitを利用
Apache+PHPサーバー
+Squid
Apache+PHPサーバー
+Squid
Apache+Squid
PostgreSQLへの接続数を制限
PostgreSQLサーバー
Electronic Service Initiative, Ltd.
スケーラビリティーを考慮したシステム構成の例
„
特徴
„
„
„
„
„
静的コンテンツと動的コンテンツを持つWebサーバーに役割を分担
Squidを利用しリバースプロキシーを構築
IPTablesを利用しDoS対策を実施
負荷分散はIPTablesを利用
PHPからのデータベース接続数を制限
„
„
„
永続的接続を利用しApacheプロセス数で接続数を制限
非永続的接続を利用しPHPスクリプトからSemaphoreを利用して接続数を制限
問題点
„
„
非永続的接続はコネクションプーリングより性能が悪い
永続的接続を利用した接続の場合、コネクションプーリングと同等のパフォーマンス
が期待できるが柔軟性にかける
Electronic Service Initiative, Ltd.
5
大規模システムの設計
„
„
„
リバースプロキシーの導入は必ず検討する
イメージなど静的なコンテンツ専用サーバーの導入を検討する
ラウンドロビンDNSよりIPTablesのDNATの利用を検討する
„
„
„
„
„
„
他にもIPTablesはDoS対策として利用可能
データ更新が管理できる場合、バッチ処理などによりデータをレプリケーション
する
アクセスログなどはテキストベースで収集し、DB化が必要な場合はバッチ処理
でおこなう
WebサーバーからDBサーバーへのアクセス数を何らかの形で制限する
HTTPヘッダーによるロードバランスをサポートするシステムの導入を検討する
etc
Electronic Service Initiative, Ltd.
大規模システムのPHPプログラミング
„
„
„
„
„
„
„
„
„
„
„
„
利用可能な場合バイトコードのキャッシングを考慮する
リバースプロキシーの利用を考慮する
動的なページ生成は最小限にとどめる
配列のハッシュ機能を活用する(e.g. in_array()を利用しない)
同じスクリプトを何度もrequire/includeしない
過度なオブジェクト指向は避ける
読み込まれるスクリプト行数に注意する
実行されるスクリプト行数に注意する
スクリプトは常に最も短い時間で実行が完了するようにコーディングする(i.e.
sleepや不適切に設定されたMTAを使わない)
エラーハンドラと出力バッファを利用した効率的なエラー処理を行う
開発時には遅いマシンを利用して開発する
etc
Electronic Service Initiative, Ltd.
6
結論
„
Apache/PHP/PostgreSQLを利用した大規模Webシステム作れるか?
„
システム構成やプログラム設計を工夫し、これらのソフトウェア+αを利用すると同
時アクセスユーザー数が数千〜数万ユーザーになるシステムを構築することは十分
可能
Electronic Service Initiative, Ltd.
最後に
„
パフォーマンステストはしていますか?
„
„
„
リクエスト数
遅延時間
CPU/メモリ利用率
Electronic Service Initiative, Ltd.
7