redisってデータを永続化する機能を持ってるって知らなかった...。
つい先日、仕事でredisについて触れる機会があったのだけど、redisのことについて「なんかkey-valueというタイプのNoSQLデータベース」くらいの認識で正直詳しいことをあんまり知らなかったので、公式ドキュメントを読んだりした。 NoSQLのイメージとして、「メモリとかにデータを保持して読み込み書き込みが早いけど、メモリに何かあったらデータ全部なくなっちゃう揮発性がある」というのがあったので、サーバーが不都合で落ちたらデータなくなると思ってたのだけど、実はデータを永続化する仕組みがあるというのを知って、本当勉強不足だな〜と思ったのでまとめてみる。
redisについて、おさらいした
redisのdata typeはいくつかあるけど、基本的なものは
- string
- keyとそれに関連するvalueで、一つのデータ
- lists
- その名の通りで、配列と同じような感じ。インデックス値がわかっていればアクセスは高速。
- sets
- 順序を持たないstringの集合体
- sorted sets
- 順序並び替えされたstringの集合体
- hashes
- その名の通りハッシュのようなデータ構造。特定のフィールド値と値がセットになったデータの集合体
というものがある*1。これらデータの有効期限TTL
を設定もできる。
コマンドのドキュメントもわかりやすくて、改めて勉強して見るととっかかりやすいミドルウェアだなと感じた。
下の動画でシュッと学べたし、公式ドキュメントにもデータタイプのサマリーが載っている。
今回、この動画の後半で redis data persistence についての話が出ていて勉強になった
redisのデータ永続化
タイプとしては
- RDB persistence
- AOF(Append Only File) persistence
の二種類があり、どちらか片方を設定 or もしくは両方を設定できる。どちらもメリット・デメリットはあって、RDBタイプは redis-cli
とかからSAVE
とかを叩くとある一定期間内のデータセットのdumpファイルみたいなのを作成してくれる。
$ redis-cli 127.0.0.1:6379> SAVE OK 127.0.0.1:6379> exit $ strings dump.rdb REDIS0009 redis-ver 5.0.4 redis-bits ctime used-mem ....... (省略) ....... users?? John Doe Brad Kate Mike John
これを定期的に実行してdumpファイルを作っておけば、ある特定の期間のデータをRestoreできるという仕組みで、dumpファイルは定期的にS3とかにバックアップとして残しておけば何か合っても大丈夫ということ。ただこのdumpのタイミングが5分とか10分とかだと、もし次のdumpファイル作成の間に障害が起きたらその間のデータは損失してしまうということなので、データの損失期間を少なくしたい場合には、もう一つのAOFが適しているっぽい。 AOFもdumpみたいに永続化するファイルを作成するのだけど、そのファイルがredisに対して実行した実行処理にhistoryを保存する。つまりそのhistoryをすべて再実行すれば全く同じデータを再構築することができるという仕組みらしい。dumpと違って実行処理のhistoryログは非常に大きくなりやすいが、先に行ったデータ損失期間がほぼないのがメリット。ただ、fsyncポリシーによってはlogを保存する処理が遅くなることがあるので注意が必要になるみたい(1秒ごとの書き込みでもパフォーマンスは優れていると言ってるが、もっと短くするとどうなるかわからない)。
用法によると思うが、公式ドキュメントにも
The general indication is that you should use both persistence methods if you want a degree of data safety comparable to what PostgreSQL can provide you.
とあり、普通のRDBのデータと差異がないデータを保全するには両方の永続機能を使うのを推奨しているみたい。
redisをちょっと知れた気がする。
話変わるけどredisのドキュメント見ると、Redis Pub/Sub
とかRedis transactions
とかReplication
とか、いままでの自分のNoSQLの思い込みを払拭するような気になるワードがいっぱいあって、土曜日はこれで潰れた。
他に調べた機能については、またの機会にまとめたいと思う。
あと、正直memcachedとの違いがよくわからないから、そのあたりも勉強しなかきゃな
その他参考にした資料
*1:Bit arraysとHyperLogLogsというのもあるんだけど、あんまり使う機会が少なそうだな〜と思ったので割愛