質問

複数のサーバーが関与するアプリケーションを構築しています。(サーバーが 4 つあり、それぞれにデータベースと Web サーバーがあります。1 つのマスター データベースと 3 つのスレーブ + 1 つのロード バランサー)

キャッシュを有効にする方法はいくつかあります。現時点では、それはかなり単純で、まったく効率的ではありません。すべてのキャッシュは、すべてのサーバー間の NFS パーティション共有上で行われます。NFS がアーキテクチャのボトルネックになっています。

  1. キャッシュを実装するアイデアがいくつかあります。サーバーレベル(ローカルファイルシステム)で実行できますが、問題は、すべてのサーバーでコンテンツが更新された場合にキャッシュファイルを無効にすることです。小さなキャッシュの寿命を延ばすことで実行できます(キャッシュがより早く更新されるため、効率的ではありません)
  2. また、各サーバーが相互に通信するメッセージングSytem(たとえばXMPP)で実行することもできます。キャッシュの無効化の責任者は、キャッシュが無効になっていることを知らせるために、他のすべてにリクエストを送信します。遅延はおそらく大きいです(キャッシュが無効になっていることを誰もが知るには時間がかかります)が、私のアプリケーションは原子キャッシュの無効化を必要としません。
  3. 3番目のアプローチは、クラウドシステムを使用して(CouchDBなど)キャッシュを保存することですが、このパフォーマンスについてはわかりません。SQLデータベースを使用するよりも速いですか?

Zend Framework を使用する予定でしたが、あまり関係ないと思います (XMPP、CouchDB を処理するために、おそらく他のフレームワークにいくつかのパッケージが存在することを除いて)

要件:永続キャッシュ (サーバーが再起動された場合、キャッシュの再作成中にサーバーがダウンするのを避けるために、キャッシュは失われないようにする必要があります)

役に立ちましたか?

解決 2

比較的良い解決策を見つけたと思います。

Zend_Cache を使用して各キャッシュ ファイルをローカルに保存します。私は、キャッシュ ファイルをローカルでも管理する nanoserver に基づいた小さなデーモンを作成しました。1 つのサーバーがローカルでキャッシュ ファイルを作成/変更/削除すると、同じアクションを実行するデーモンを介してすべてのサーバーに同じアクションが送信されます。

つまり、ローカル キャッシュ ファイルとリモート アクションが同時に存在します。おそらく完璧ではありませんが、今のところは機能するはずです。CouchDB は遅すぎ、NFS の信頼性が十分ではありません。

他のヒント

http://www.danga.com/memcached/

Memcached は、メッセージベースの読み取り、コミット、無効化など、提示された要件のほとんどをカバーします。高可用性と高速ですが、アトミックな信頼性はほとんどありません (パフォーマンスが犠牲になります)。

(また、memcached は YouTube、Wikipedia、Facebook などを強化しているため、多くの分散キャッシュ オプションを真剣に評価するための時間、資金、才能のある組織が memcached を使用することはかなり確立されていると思います。)

編集(コメントに応じて)キャッシュの考え方は、バッキング ストアに比べて比較的一時的なものであるということです。キャッシュ データを長期間保持する必要がある場合は、(a) データ層を非正規化してパフォーマンスを向上させるか、(b) 大量のデータをストレート キーで保存する中間層データベース サーバーを追加することを検討することをお勧めします。値ペア テーブル、またはそれに非常に近いもの。

キャッシュ ストアとしての memcached を擁護するために、サーバーの再起動の影響を少なくしながら高いパフォーマンスを実現したい場合は、memcached サーバーを 4 台だけ用意すればよいのではないでしょうか。それとも8?それぞれの「再起動」は、それに応じてデータベース サーバーに与える影響が少なくなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top