このページ
4.x から 5.0 へのアップグレード
要点:4.1.1 を停止し、同じデータディレクトリ上で 5.0 バイナリを 起動するだけ。 設定変更は不要。5.0 のリリースゲートはタグ発行前に この手順そのもの(双方向切替 + バックアップコピーからのコールド復元) を毎回リプレイしている。
そのまま引き継がれるもの
- データファイル。 5.0 は 4.1.1 のデータディレクトリをそのまま 開く:AOF(v1/v2 レコード形式)、スナップショット、
shards.meta、 セグメントディレクトリ。v1 時代の AOF は最初の rewrite までは v1 の まま追記され、rewrite でチェックサム付き v2 へ昇格——4.1 と同じ挙動。 - ダウングレード窓。 5.0 が書いたディレクトリを 4.1.1 バイナリが 再度開ける(アップグレードゲートがこの往復を検証)。切替前は どちらの方向でもクリーンシャットダウンを。
- 設定ファイルとフラグ。 4.x のキーはすべて受理。ゼロコンフィグ 起動(
--port+--dir)の挙動は同一。 - ワイヤプロトコルとクライアント契約。 本リリースで RESP 表面の 削除・型変更はない。
挙動が変わる点
AOF 書き込みが reactor スレッドを離れる(io_uring、デフォルト有効)
Linux で io_uring が使える場合、appendfsync everysec(または no) の AOF 追記はシャード自身のリングにキューされ、reactor スレッドでの 同期書き込みは行われない。本リリースのテールレイテンシ改善の中核。 耐久性のセマンティクスは不変(everysec のクラッシュ窓は依然 ≤1 秒、 crash ゲートが両モードで検証)。
KEVY_AOF_OFFLOAD=0で 4.x の同期パスに戻せる。appendfsync alwaysは定義上同期パスのまま。- epoll reactor(io_uring 非対応カーネル)は 4.x パスのまま。
継続的な書き込み圧下の rewrite は停止ではなく延期
4.x は成長ルールが発火すれば rewrite を実行し、ディスクが要求する だけの停止を支払っていた——高インジェスト下では数秒級のサーバ停止。 5.0 は rewrite が収束可能か(追記レートと rewrite 自身の進度)を測り、 収束不能と証明されたら延期する:ログは伸び続け、サーバは応答し 続け、次の成長因子後(または明示的 BGREWRITEAOF——こちらは常に 無条件)に再試行。持続的飽和下では AOF が一時的に大きくなる—— それが交換条件であり、誠実な方だ:ディスクは取り返せる、停止は 取り返せない。
AOF の隣に現れる新しいハウスキーピングファイル
rewrite 中・直後に <aof>.rewrite(構築中イメージ)や <aof>.trashN(旧ログの GB 級解放をスレッド外へ移すための ハードリンク)が一時的に見えることがある。どちらも自動清掃され、 クラッシュ残骸は次の rewrite が回収する。これらはバックアップ しないこと;バックアップ = データディレクトリから *.rewrite / *.trash* を除いたもの——あるいは単純に全部コピーして 5.0 の起動に 任せてよい(disk ゲートの復元ドリルがまさにそれ)。
推奨手順
- バックアップ:クリーンシャットダウン(または
BGSAVE+ コピー) の後、データディレクトリをコピー。 - 4.1.1 停止。同じディレクトリ・設定で 5.0 バイナリを起動。
- 検証:
INFO persistence(aof 有効、rewrite 進行)、DBSIZE、 アプリ自身のスモーク。 - ロールバックが必要なら:5.0 をクリーン停止し、同じディレクトリで 4.1.1 を起動。