AOFのないクラッシュの後、レディスのセットの一貫性を保つことは可能ですか?

Redisの新しい並べ替え。

架空のセットアップ/状況:Redisが10分ごとにスナップショットを作成すると仮定します。 AOFはオフです。投稿のIDを保持する「投稿」というセットがあります。投稿のIDを保持するMySQLテーブルもあります。

  1. MySQLとRedisには合計2つの投稿IDがあります
  2. Redisはスナップショットを作成します
  3. ユーザーが新しい投稿を作成する - Redisには3つのIDがあり、MySQLもそうである
  4. しかし、Redisがクラッシュしたり、殺されたりします。
  5. 再起動時に、Redisは2つのIDを持ち、MySQLは3つのIDを持ちます。

Redisのデータが一貫していないことをどのように認識していますか?私が読んだことから、AOFはより多くの問題をもたらし、完全ではありません。セットを一貫して維持する、より簡単で洗練されたソリューションがありますか?

4
「しかし、レディスがクラッシュしたり、殺されたりする」...殺された場合(殺されていない、殺されていない場合)には、退去する前にセーブを行います。
追加された 著者 Carl Zulauf,
ああ、私はそれを知りませんでした、かなりスマートですね。先端に感謝します。
追加された 著者 Jon Derring,

2 答え

ここでどのくらいのデータを話していますか?それほど多くない場合は、RedisのすべてのデータをMySQLデータベースからリロードするだけのプロセスを持つことができます。素敵なことは、10分のバックアップストアからすべてのデータをRedisにロードして、すべてのキーをRedisのキーで上書きすることができることです。それが既に存在するならば、それは偉大な、そうでなければ、それはそれを追加します。

残念ながら、2つのシステム間の並行性を構築するための主要な作業なしに、それらを一貫性を保つことはできません。 AOFはそれほど悪くありません。あなたはそれを試してみるべきです。それでも、一貫性について心配する必要があります。

2
追加された
うわー、大丈夫。さて、クラッシュ後はいつでもMySQLからの再読み込みについて考えましたが、もっと良い解決策が考えられていました(MySQLからの選択を避けようとしていました)。私はAOFを試していないが、ほとんどのブログ記事は何らかの理由であまりにも多くの肯定的なことを言っていない。私は問題がそれほど単純ではないと思います。いずれにせよ助けてくれてありがとう。 Btw、それはそれほどデータではないと思います。
追加された 著者 Jon Derring,

私が成功した1つの解決策は、別のサーバーで実行されているスレーブインスタンスを使用することです。スレーブとの同期はブロックされていないので、最後のコマンドを失う可能性があります。マスターがクラッシュした場合でも、実際にはこれはほとんど起こりません。冗長性のために複数のスレーブを持つこともできます。

その結果、マスターはディスクI/Oを使用しなくなり、スナップショットで使用されるプロセスフォークに追加のメモリは不要になります。マスターが停止すると、一時的なマスターからマスタースレーブを取得して、スレーブの1つをマスターにして(私のお気に入りのredisコマンド SLAVEOF NO ONE を使用して)一時的にデータを復元し、一度同期が完了するとマスタ/スレーブの役割を元の構成に戻します。

1
追加された
興味深い...私はそれを試してみる必要があります。ご提案いただきありがとうございます。
追加された 著者 Jon Derring,