web-dev-qa-db-ja.com

データベースとしてのRedis

キャッシュではなくデータベースとしてRedisを使用したい。私の(限られた)理解から、Redisはメモリ内のデータストアです。 Redisを使用することのリスクは何ですか?また、どうすればそれらを軽減できますか?

48
Paddy

Redisをさまざまな方法で信頼できるストアとして使用できます。

  • オン[〜#〜] aof [〜#〜](追加のみのファイルストア) AOFドキュメントを参照 。これにより、データセットに対して行われたすべてのRedisコマンドのログがリアルタイムで保持されます。

  • マスタースレーブレプリケーションを使用してRedisを実行します レプリケーションドキュメントを参照 。これにより、インスタンスの1つに障害が発生した場合に、高可用性を提供できます。

  • EC2のようなもので実行している場合は、RedisパーティションをEBSでバックアップして、インスタンスの障害に対する別の保護レイヤーを提供できます。

将来的には Redis Cluster -これは特に、HAとスケーラビリティに役立つ方法でRedisを実行する方法として設計されています。ただし、これは少なくともあと6か月ほどは表示されません。

41
rlotun

Redisは、データをディスクに書き戻すこともできるメモリ内ストアです。 fsync を実行して、redisをより安全にする(ただし、より遅くする=>トレードオフ)回数を指定できます。

しかし、それでも、redisがまだ実際に(ミッション)クリティカルデータを格納していない状態にあるかどうかはわかりません(まだ?)。たとえば、もう1つのツイート(Twitter.com)または同様の何かが失われたときに大きな問題ではない場合、私は確かにredisを使用します。 persistence については、redisのWebサイトにたくさんの情報があります。

また、anti-rez(redisメンテナ)のブログ記事を読むことで発生する可能性がある いくつかの永続性の問題 にも注意する必要があります。彼はいくつかの興味深い記事を持っているので、あなたは彼のブログを読むべきです。


13
Alfred

Redisはメモリ内ストレージであるため、マシンのメモリサイズに合わない大きなデータを保存することはできません。 Redisは通常、保存するデータがRAMサイズの1/3より大きい場合、非常にうまく機能しません。そのため、Redisをデータベースとして使用することの致命的な制限です。

確かに、ビッグデータを複数のRedisインスタンスに分散させることはできますが、すべて自分で手動で行う必要があります。通常、操作は次のように実行されます(最初からインスタンスが1つしかない場合)。

  1. そのマスタースレーブメカニズムを使用して、データを2番目のマシンに複製します。これで、同じデータの2つのコピーができました。
  2. マスターとスレーブ間の接続を切断します。
  3. 最初のマシンのデータの前半(ハッシュなどで分割)を削除し、2番目のマシンのデータの後半を削除します。
  4. すべてのクライアント(PHP、Cなど)に、指定されたキーがそのマシンにある場合は最初のマシンで動作するように指示し、そうでない場合は2番目のマシンで動作するように指示します。

これがRedisのスケーリング方法です!また、移行中の書き込みを防ぐために、サービスを停止する必要があります。

私たちが経験する経験から、Redisにはこの結論があります:Redisは30Gを超えるデータを格納するのに適切な選択ではありません。Redisはスケーラブルではなく、Redisはプロトタイプ開発に非常に適しています。

後で、Redisの代替手段であるSSDB( https://github.com/ideawu/ssdb )を見つけました。これは、RedisのほぼすべてのAPIをサポートするleveldbサーバーであり、より多くのAPIを格納するのに適しています。 1TBを超えるデータは、ハードディスクのサイズにのみ依存します。

4
ideawu

Redisをサービスのプライマリデータベースとして使用することで学んだことをいくつか共有したいと思います。パーティション化できないデータがあったため、Redisを選択しました。 1つの箱から得られる最高のパフォーマンスを得たいと思っていました

長所:

  • Redisは生のパフォーマンスで無敵でした。最初から1秒あたり10Kのトランザクションがありました(1つのトランザクションに複数のRedisコマンドが含まれていることに注意してください)。 LUAスクリプトとともに、いくつかの最適化を行った後、1秒あたり25,000以上のトランザクションのレートを達成することができました。したがって、ボックスごとのパフォーマンスに関しては、Redisは他に類を見ません。
  • Redisはセットアップが非常に簡単で、他のSQLおよびNoSQLデータストアとは対照的に学習曲線が非常に小さくなっています。

短所:

  • Redisは、ハッシュ、セット、リストなどのいくつかのプリミティブデータ構造と、これらのデータ構造に対する操作のみをサポートします。 Redisをキャッシュとして使用している場合はこれらで十分ですが、Redisを本格的なプライマリデータストアとして使用する場合は、制約を感じることになります。これらの単純なタイプを使用してデータ要件をモデル化するのに苦労しました。
  • Redisで見た最大の問題は、柔軟性の欠如でした。データの構造を解決したら、ストレージ要件やアクセスパターンを変更するには、事実上、ソリューション全体を再考する必要があります。これがすべてのNoSQLデータストアに当てはまるかどうかはわかりません(MongoDBの方が柔軟性があると聞きましたが、自分では使用していません)。
  • Redisはシングルスレッドであるため、CPU使用率は非常に低くなります。複数のRedisインスタンスを同じマシンに配置してCPU使用率を向上させることはできません。これらは同じディスクをめぐって競合し、ディスクをボトルネックにします。
  • 他の回答で述べられているように、水平方向のスケーラビリティの欠如は問題です。
1
Mustafa Hussain