web-dev-qa-db-ja.com

キャッシング(memcache / redis)と複数のサーバー-最善の戦略

アプリケーション(Symfony2)でキャッシュ(memcacheまたはredisベース)を使用するための最良の戦略を検討しています。これは、負荷分散と個別のレプリケートされたデータベース+1つの共通の共有ストレージを備えた複数の(これまでのところ3つの)個別のマシンに展開されます。 4番目のサーバーもあり、主にcronと大量メール送信に使用されます。キャッシュは頻繁に使用されるだけでなく、頻繁なデータ変更のために更新されることに注意してください。

これまでのところ、3つの試みがあります。

  1. 4台目のマシンに単一のキャッシュを配置し、ドメイン全体で共有します。悪い面は、このマシンが故障すると、すべてが故障することです。

  2. 複数のマシンに別々のキャッシュを配置し、それぞれに独自のキャッシュがあります。欠点は、冗長なタスクを実行するためにより多くの計算能力を予約する必要があることです。

  3. 1台のマシンがキャッシュを再構築してから、別のマシンに伝播します(最初のケースと同じ欠点)。

これを処理するための最良のオプションは何ですか?

2
ex3v

公開されている情報をよく読んだ場合、memcacheは、repcachedというデーモンを介して複数のサーバー間でのデータ複製をサポートします。ただし、me​​mcacheを使用したことがないことを追加する必要があります。

私はredisを使用しましたが、マスタースレーブセットアップをサポートしていることを知っています。

どちらの場合も、デーモンをすべてのマシンにインストールし、データをマスタースレーブ方式で複製することをお勧めします。次に、更新遅延を調整して、セットアップの一貫したレプリカを作成します。

理由は次のとおりです。

  • 専用のレプリケーションメカニズムを設定する必要はありません。デーモンがタスクを処理します
  • いずれかのマシンに障害が発生した場合、セットアップは問題なく機能し続け、他のマシンは障害が発生したマシンへの接続を失い、負荷を共有します。その後、残りの3つのノードのいずれかを当面マスターに切り替えることができます。

アプリケーション側では、読み取りと書き込みのためにデーモンの単一のインスタンス(通常はマスターインスタンス)に接続し、スレーブに怠惰な方法でデータを複製させることができます。

キャッシュは常にホットデータに直接アクセスできるため、これにより最高のパフォーマンスを引き出すことができます。このセットアップは、適切な可用性も維持します(Xを必要に応じて構成できる、障害が原因で「失われたデータ」のX時間を許可します)。また、アプリケーションインスタンスが常に使用可能なキャッシュを見つけるように、キャッシュDNSエントリの負荷を分散することもできます。

redisを選択する場合は、必ず両方のデータ永続化モード(RDBとAOF)を有効にしてください。

1