私のアプリケーションはキャッシュ サーバーの再起動に対して回復力があります (まあ、そうしたいのですが、気にしないでください)。つまり、キャッシュ (マスター/スレーブ クラスター構成の Redis) が利用できなくなった場合 (クラスター全体が利用できなくなった場合など)、アプリケーションはキャッシュを多用する機能をオフにすることで正常に機能を低下させ、それでもゆっくりと動作します。
私はマスター/スレーブ モードで Redis を使用しているため、マスターとスレーブの同期をリモートでも効率的に行うために、状態をファイル システムに保存する必要があります。これは、サーバーが再起動されると、前の化身から見たデータをロードすることを意味します。
上記は、クラスター全体がダウンしたときにキャッシュ無効化メッセージを送信する必要があるまではうまく機能します。流れは次のようになります。
- キャッシュはOK
- アプリサーバーはデータ X=Y をキャッシュに入れます。X=Y はキャッシュ ファイル システムに保存されます。
- キャッシュが失敗し、再起動します。
- アプリ サーバーは、X を Y' に操作するコマンドを取得します - X のキャッシュ無効化を送信しようとしています。失敗 - キャッシュが応答していません (まだダウンしています)。キャッシュはオプションであるため、アプリ サーバーはログを記録して続行します。
- キャッシュがバックアップされます - X=Y を含むファイル システムからデータをロードします
- アプリ サーバーは、X を処理する要求を受け取ります。キャッシュに移動し、前のデータ X=Y を確認します。データベースに Y' があるにもかかわらず、Y が提供されています。問題。怒っている顧客。
これをどのように解決できますか - 具体的には、マスター/スレーブ シナリオを使用する Redis で (スレーブは現在、より高速なフェールオーバーのためにのみ使用されます)。