🤼

Redis、Replicationが組めるバージョンの組み合わせ

2020/11/12に公開
2

Redis の Replication が組めるバージョン、組めないバージョンの組み合わせ
そしてそれが何起因で決まるのか?を記す。

意識するポイントは RDB のバージョン

Redis のバージョンではなく、内部的に持っている永続化ファイル (RDB) のバージョンによって、レプリケーション可否が決まります。
これは最初に Full Sync する際、利用される snapshot が RDB 形式なためです。
https://github.com/redis/redis/blob/6.0.9/src/rdb.h#L41
RDB バージョンは新たな型が生まれたり、 RDB に新たなメタ情報が埋め込まれた時にバージョンが上がります。
直近では Redis v5 で stream 型対応など。

RDB 解釈の後方互換性について

Redis3.2 以降は RDB の解釈について、後方互換性が維持されています。
そのため、 3.2 以降であれば古い RDB を読み込むことが可能です。

簡単な例

可否 Master Redis version Master RDB verison > Replica Redis version Replica RDB version 備考
OK v5.0 v9 > v6.0 v9 同じ RDBver
OK v6.0 v9 > v5.0 v9 同じ RDBver
NG v5.0 v9 > v4.0 v8
OK v4.0 v8 > v5.0 v9 後方互換性あり
OK v2.8 v6 > v3.0 v6 同じ RDBver
OK v2.8 v6 > v3.2 v7 後方互換性あり
NG v2.4 v5 > v2.8 v6 後方互換性なし

Redis と RDB version 早見表

Redis ver RDB ver
v6 v9
v5 v9
v4 v8
v3.2 v7
v3 v6
v2.8 v6
v2.4 v5

どういうときに問題になるか?

主に Redis Cluster で、 Failover を利用して Redis upgrade したい場合
新バージョンを Replica にして、 Failover するところまでは問題なく出来ます。

しかし Failover した後、 RDB ver が異なると古いバージョンを Replica に出来ません。
つまり往復の Failover によって切り戻しが出来ない、ということになります。
片道切符です。

切り戻しには停止メンテナンスが必要そうです。
※ resharding を使えばオンラインでも出来る気がしますが未検証です。

Discussion

yonexyonex

大変参考になる記事ありがとうございます!
『Redis と RDB version 早見表』では Redis v3.2 が RDB v7 となっているのですが、『簡単な例』の表では Redis v3.2 が RDB v6 となっていて、食い違っているようです。ご確認いただけますと幸いです

marumaru

早見表の方が正しかったので、例の方を修正しました!指摘ありがとうございます