Memorystore for Redisのメンテナンス

はじめに

先日、Memorystore for Redisのメンテナンスが実施されました。一時的にアプリケーションから Redisへの接続ができていなかったのですが、事前にメンテナンスの通知が来ていなかったり、そもそも Redis (Memorystore for Redisも含めて) についてあまり詳しくなかったので調べてみました。

Memorystore for Redis

Memorystore for Redisは GCPのフルマネージド型の Redisサービスです。

Memorystore for Redis の概要


Memorystore for Redisの Redisインスタンスには、「基本階層」と「標準階層」の2種類があります。基本階層はレプリケーションなしで、障害やメンテナンス時にデータの保持が担保されません。したがって、本番環境では標準階層を利用しています。標準階層の詳細については以降触れていきます。

Redis の階層の機能

メンテナンスについて

メンテナンス ポリシー によると、

  • 四半期に一度の頻度で行われる
  • 実施可能時期を示す時間枠は指定できない

とのこと。通知については書かれていませんでしたので、後日サポートに問い合わせてみます。

Cloud SQLと違って時間枠が決められないので、せめて事前に通知は欲しいなと思います。

高可用性

Memorystore for Redisの標準階層インスタンスは、レプリケーションと自動フェイルオーバー機能によって高可用性を実現しています。

レプリケーション

  • Redisは自動的にプライマリノードとレプリカノードで構成される
  • プライマリとレプリカは異なるゾーンに配置され、ゾーン障害に対応している
  • 単一のノードで障害が発生しても、もう片方にデータがバックアップされるためデータの損失が起きない

フェイルオーバー

  • プライマリノードで障害が発生したときに、自動でフェイルオーバーがトリガーされる
  • フェイルオーバー中は、新しいプライマリへの接続はレプリカにリダイレクトされ、アプリケーションへの応答を継続する
  • 既存の接続は遮断されるが、再接続時にはアプリケーションが接続情報 (IPなど)を変更することなく自動的に新しいプライマリにリダイレクトされる
  • レプリカをプライマリに昇格させる間は、Redisは一時的に利用できなくなる


一時的にアプリケーションから Redisに接続できなかった理由はこれっぽいですね。

  • レプリカをプライマリに昇格させる間は、Redisは一時的に利用できなくなる

フェイルオーバーの情報を確認する

Cloud Monitoringの Metrics Explorerで稼働時間を確認します。

f:id:yd0:20200723221541p:plain


グラフの見方

  • 下落している箇所は再起動を示している
  • データが欠損している箇所は使用不可であったことを示している

フェイルオーバーの流れ

  • まずレプリカが再起動する
  • レプリカとプライマリの両方が接続不可になる (おそらくレプリカがプライマリに昇格する間)
  • レプリカがプライマリに昇格し、同時にプライマリが再起動する
  • プライマリがレプリカに降格


グラフのデータが欠損している時間帯と、アプリケーションから Redisに接続できていない時間帯とがおおよそ一致していることがわかりました。

infoコマンド

redisの状態や設定を確認するのに infoコマンドを使用しました。

redis-cli info -h <IP> info


このように値が返ってきます (一部抜粋)。詳細は INFO – Redis で確認できます。

# Server
redis_mode:standalone

# Replication
role:master
connected_slaves:1

# Cluster
cluster_enabled:0

考察

Memorystore for Redisについて調べましたが、ポイントとしては 四半期に一度、事前通知なしでダウンタイムが発生するメンテナンスが行われる ことです。

フルマネージド型のサービスを利用しているので、サービス側の都合でセキュリティパッチやアップデートを適用するメンテナンスが行われるのは仕方ないことだと思います。ただ一時的でもアプリケーションに影響が出るので、何かしらの対応はしておきたいです。

例えば、

  • Redisへの接続のタイムアウト値の設定/見直し
  • 接続できなかった場合に自動で再接続

など。まだ Redisについて理解できていないことが多いので、上記が可能かどうかもわかりません。今後の課題です。

あと Cloud Monitoringでの Redisの稼働チェック、アラート設定などです。今回はアプリケーション側で検知できましたが、メンテナンスが行われたことに気づかない可能性もあったので対応しておきたいです。

Redisを運用している他社さんの記事などを参考に、ベストプラクティスを探していければと思います。