高速なフラットファイルまたはMySQL RAMデータベースとは何ですか?
-
10-07-2019 - |
質問
複数のPHPスクリプトを実行してデータを共有する簡単な方法が必要です。
RAMストレージエンジンを使用してMySQL DBを作成し、それを介してデータを共有する必要があります(複数のスクリプトが同じDBに同時に接続できますか?)
または、1行に1つのデータを含むフラットファイルの方が良いでしょうか?
解決
フラットファイル?いやぁ...
適切なDBエンジン(MySQL、SQLiteなど)を使用します。次に、パフォーマンスを最大化するには、memcachedを使用してコンテンツをキャッシュします。
このように、並行性などを処理する実績のあるサーバーソフトウェアを使用して、プロセス間でデータを簡単に共有できます。しかし、データをキャッシュする速度が得られます。
いくつかの点に注意してください:
- MySQLにはクエリキャッシュがあります。同じクエリを繰り返し発行する場合、キャッシュレイヤーを追加せずに多くのパフォーマンスを得ることができます。
- とにかく、MySQLは本当に高速です。負荷テストを行って、十分に高速でないことを実証しましたか?
他のヒント
メンテナーの健全性のために、フラットファイルを使用しないでください。
できるだけ速く共有データを探しているだけで、RAMにすべてを保持できる場合は、 memcached は完璧なソリューションです。
データの永続性が必要な場合は、MySQLなどのDBMSを使用します。
一般に、DBの方が優れていますが、小規模でほとんど静的な量のデータを共有している場合、フラットファイルで行うことでパフォーマンス上の利点(および単純さ)が得られる可能性があります。
ささいなデータ共有以外のもの。ただし、DBを選択します。
1-フラットファイルが役立つ場合: フラットファイルはデータベースよりも高速ですが、非常に特定のアプリケーションで使用できます。 検索や書き込みを行わずにデータを最初から最後まで読み取ると、高速になります。 データがメモリに収まらず、ジョブを完了するために完全に読み取る必要がある場合、データベースよりも「高速」になります。また、読み取りよりも書き込みが多い場合、フラットファイルも輝きます。ほとんどのデフォルトのデータベースセットアップでは、インデックスと外部キーを維持するために、読み取りクエリが書き込みの完了を待つ必要があります。通常、書き込みクエリを単純な読み取りより遅くします。
TD / LRバージョン: ウェブ検索クエリではなく、ジョブベースのシステム(別名、単純なログ解析)にフラットファイルを使用します。
2-フラットファイルピットフォール: フラットファイルを使用する場合は、カスタムロックメカニズムを使用してファイルが変更されたときにスクリプトを同期する必要があります。バグがある場合、これはスローダウン、デッドロックまでの破損につながる可能性があります。
3- Ramベースのデータベース? ほとんどのデータベースは、クエリ結果、検索インデックス用のメモリキャッシュを持っているため、フラットファイルでは非常に困難です。それらはメモリにキャッシュされるため、ほとんどの場合、メモリから完全に実行することは効果がなく、危険です。データベース構成を適切に調整することをお勧めします。
ramを使用してパフォーマンスを最適化する場合は、まず、ramドライブからphp scrip、htmlページ、および小さな画像を実行することを検討します。キャッシュメカニズムが粗雑であり、静的データが変化しないために体系的にハードドライブにヒットする可能性が高い場合。
より良い結果を得るには、ロードバランサを使用し、RAMベースのSANアレイまでのバックプレーン接続でクラスタリングします。しかし、それはまったく別のトピックです。
5-複数のスクリプトが同じDBに同時に接続できますか?
はい、呼び出された接続プーリング。 php(クライアント側)で、mysql-pconnect(接続を開く関数http://php.net/manual/en/function.mysql-pconnect.php )。 php.iniで最大オープン接続を構成できると思います。 mysqlサーバー側の同様の設定は、/ etc / mysql / my.cnfで同時クライアント接続の最大数を定義します。
CPUの並列処理を利用し、PHPスクリプトが互いのクエリの終了を待つのを避けるために、これを行う必要があります。負荷が高い場合のパフォーマンスが大幅に向上します。
通常のWebクライアント用のApache設定には、1つの接続プール/スレッドプールもあります。 httpd.confを参照してください。
テキストの壁はごめん、退屈だった。 ルイ。
複数のサーバーでそれらを実行している場合、ファイルシステムベースのアプローチはそれを削減しません(一貫性のない共有ファイルシステムを持っている場合を除きます。
したがって、Webサーバー間でデータを共有するには、とにかくサーバーベースのデータベースが必要になります。パフォーマンスまたは可用性のいずれかを真剣に考えている場合、アプリケーションは複数のWebサーバーをサポートします。
フラットファイルのロックを処理する何らかのメカニズム(およびアクセスを制御する方法)がない限り、MySql DBの方が適していると言えます。この場合、DBレイヤーは(特定のDBMSに関係なく)間接レイヤーとして機能しているため、心配する必要はありません。
OPはWebサーバーを指定していないため(PHPは実際にコマンドラインから実行できます)、キャッシュテクノロジーが今後の機能であるかどうかはわかりません。 OPは、Webサイト主導ではない何らかのフライングデータ変換を行うことを検討している可能性があります。誰が知っている。
システムにPHPキャッシュ(APCなどのメモリにコンパイルされたPHPコードをキャッシュする)がある場合、PHPコードとしてデータをPHPファイルに入れてみてください。データを書き込む必要がある場合は、セキュリティ上の問題がいくつかあります。
複数の場合、簡単な方法が必要です PHPスクリプトを実行してデータを共有します。
APC 、およびmemcachedは、コンテキストに応じて適切なオプションです。 共有メモリもオプションです。
RAMを使用してMySQL DBを作成する必要がありますか ストレージエンジン、およびデータの共有 それ(複数のスクリプトが接続できます 同じDBを同時に使用しますか?)
これも適切なオプションですが、おそらくAPCやmemcachedほど高速ではありません。
または、1つの 行ごとのデータの方が良いですか?
これが読み取り専用データである場合、可能性がありますが、上記のオプションのいずれよりも遅い可能性があります。特にデータが大きい場合。ただし、カスタム解析コードを記述するのではなく、単純にPHP配列を構築し、ファイルをinclude()することを検討してください。
これが複数のライターから同時にアクセスされる可能性のあるデータストアである場合、必ずフラットファイルを使用しないでください!複数のプロセスからフラットファイルに書き込むと、ファイルが破損する可能性があります。ファイルをロックすることはできますが、ロックの競合の問題と長いロック待機時間のリスクがあります。
同時書き込みの処理が、mysqlやmemcachedなどのアプリケーションが存在する理由です。