Zenn
🐈

サイズ見積りの手引き~Redis(RDB)~

2025/02/19に公開

おでんのはんぺんが大きくなってたら嬉しいですか?

嬉しくない人はDMで教えて下さい。考えられるネガティブな事はやけどのリスクくらいでしょうか。
データのサイズが大きくなってたら。。
筆者の経験と、優秀なドキュメント、それを教えてくれた同僚に感謝しながら未来の自分に向けてのメモを残します。また、他の誰かのためになる小さな望みを持って。。。

RDB tool

今回の経験で出会った素晴らしいtool。
https://github.com/sripathikrishnan/redis-rdb-tools

redisのシリアライズ構成を十分に解析

RDBの構成を理解するための優秀なドキュメント
https://github.com/sripathikrishnan/redis-rdb-tools/blob/master/docs/RDB_File_Format.textile

工学としてのRedis

インメモリデータベースのパフォーマンス上のメリットは、ディスクからの読み取りをせずに済む事ではなく、むしろディスクに書き込めるようにエンコードするというオーバーヘッドを回避できる事です。
Redisはデータの全てをメモリに管理しているため実装は比較的シンプルです。

*.rdb

*.rdbファイルは、インメモリ・ストアのバイナリ表現です。このバイナリファイルはRedisのデータ構造を完全に復元するのに十分です。

筆者の経験

筆者が遭遇した疑問と気づき。

状況

筆者は大規模なAIサービスの保守運用を担当している。
グループ会社へのサービス移行が実施されることとなった。
また、その一環としてRedisのデータ移行を担当した。
AI学習に使用されるモデルが固定値として登録されており、
(システムデザインの観点でキャッシュとしてのデータはもちろん移行する必要はない。)
現行のRedisから固定値だけを抽出する必要があった。

自作移行ツール

javaのjedis(RedisClient)を使用した移行ツールを開発した。
RedisClusterClientを作成し、
パターンマッチでscan。欲しいkeyだけを取得➡︎get。という簡易的なもの。

問題① jedisClusterClientはscan出来ない

ここで問題が起こった。jedisはcluster typeのscanを対応していなかった。
それならばと、RedisCluster nodeをforEachで殴ってscanを実施しようとしたが、
ダメであった。理由はRedisCluster内のデータはnode間を忙しなく移動しており、
一生scanが終わらないのだった。

対応

全体のdumpをとって欲しいものだけ抽出する。
大規模なグループだとDBA(DBアシスタント)が存在してくれている。
DBAにRedisのRDBを配置してもらうように依頼した。(初めからこうすれば良かったと深く反省した。むしろ、一般的にはRedisサーバーのRDBを見れば良いが、大規模であるためその権限がなく遠回りをした。)

問題② 抽出元のRDBより大きくなってしまった。

筆者がデータの抽出に使用したのはgolangのtool。
source RDB 15GB ➡︎ target RDB 18GB
https://github.com/hdt3213/rdb

気づき

RDB toolのシリアライズロジックルールはtoolごとに余地がある。
筆者は問題②が起きたときに、DBAに相談した。
そしたら僕らはこれ使ってますよと、pythonのツールを教えてくれた。(優しくて泣きそうになった。)
https://github.com/sripathikrishnan/redis-rdb-tools
これじゃなくてもRedisのシリアライズロジックにを十分にフォローしたものであれば、
それでも良いと思う。
今後ストレージの操作に向き合うときは、encode方式を十分に理解して手を動かそう。

Discussion

ログインするとコメントできます