コンテンツに移動
データベース

Memorystore for Redis Cluster へのダウンタイムなしでの移行

2023年10月26日
Google Cloud Japan Team

※この投稿は米国時間 2023 年 10 月 14 日に、Google Cloud blog に投稿されたものの抄訳です。

Google Next での Memorystore for Redis Cluster の発表に伴い、多くの Redis 管理者やデベロッパーから既存の Redis クラスタ環境からの移行方法について質問を受けています。これらのアプリケーションはビジネス クリティカルであり、ダウンタイムなしの移行が必要であることを理解しています。

Memorystore を採用することで、スケーリング、パッチ適用、バックアップ、オブザーバビリティの構成といった反復的なタスクを排除できます。これにより、Redis デベロッパーや管理者は、機能やアプリケーションのリリースなど、ユーザーに直接価値を提供するアクティビティに集中できるようになります。また、費用も削減できます。

Memorystore for Redis Cluster は、OSS と完全に互換性があり、セットアップが簡単なマネージド サービス パッケージです。Memorystore for Redis Cluster は、キャッシュ保存、リーダーボード、ストリーム処理などの最も要求の厳しいユースケースに対応しています。Memorystore for Redis Cluster は、高可用性を確保するためのノードの自動ゾーン割り当て、自動化されたレプリカ管理とプロモーション、自動キー再配布によるダウンタイムなしのスケールインおよびスケールアウトを提供します。Compute Engine、Google Kubernetes Engine 上のセルフマネージド Redis、または Redis Enterprise や Elasticache などのサードパーティ プラットフォームといった、さまざまなスタンドアロン ノードまたはクラスタ化された Redis ソースからの移行が可能です。Memorystore for Redis Cluster について詳しくは、ドキュメントをご覧ください。

このブログ投稿では、RIOT、「Redis Input/Output Tool」を使用して、既存の Redis クラスタからフルマネージドの Memorystore for Redis Cluster にオンラインで移行する方法について説明します。問題なく移行を成功させるためのガイドラインをいくつか紹介します。

RIOT とは

RIOT は Redis の主任フィールド エンジニアである Julien Ruaux 氏によって開発されたオープンソースのツールです。RIOT は、ファイル、リレーショナル データベース、Redis インスタンスなど、さまざまなソースとターゲット間でのデータ移行に使用されます。ここでは、1 つの Redis クラスタから別のクラスタへの手間のかからない移行に焦点を当てて説明します。RIOT は現在、Redis 7.0 をソースとした場合に動作しないことに注意してください。Redis 7.0 を移行したい場合は、タイプベースのレプリケーションをご覧ください。

移行の円滑化

円滑な移行を確実にするため、次の取り組みを追加的に実施することを推奨しています。

  • 計画 - 依存関係、時間の見積もり、タスクの所有者を含む詳細な移行プロジェクトの計画を作成します。
  • 自動化 - すべてのアクションをスクリプト化する必要があります。
  • テスト - 移行をテストし、学んだ教訓を移行計画と自動化に組み込みます。テストを数回繰り返します。

この方法により、ダウンタイムと人的エラーを排除できます。移行の計画について詳しくは、こちらのブログ投稿をご覧ください。

移行ワークフローの概要

最初に、移行計画の概要を確認しましょう。以下の図は、RIOT を使用してダウンタイムなしで移行する場合の論理的な概要ですが、カットオーバー時にレプリケーションが追いついた際に多少のバックフィルが発生する可能性があります。

  1. 既存のクラスタのサイズに合わせてサイズ調整した Memorystore for Redis Cluster インスタンスをデプロイします。
  2. データの移動を管理するために、Java 仮想マシン(JVM)と RIOT がインストールされた Compute Engine VM をデプロイします。RIOT を起動すると、現在の本番環境の Redis クラスタ インスタンスの完全なスナップショットが取得され、そのスナップショットが新しい Memorystore for Redis Cluster インスタンスに書き込まれます。クラスタのサイズやネットワークの接続状況によって、この作業に時間がかかることがあります。
https://storage.googleapis.com/gweb-cloudblog-publish/images/1.RIOTStep1.max-2000x2000.jpg

3. RIOT により、アプリケーションが稼働中に、既存の Redis クラスタで発生した新たな変更が新しい Memorystore for Redis Cluster インスタンスに伝播されます。レプリケーションの遅延は、変更の頻度やネットワークの接続状況に応じて、ミリ秒から数秒の範囲になります。適切なリソースを持つソースとターゲットにおける GCP ネットワーク上の一般的な移行では、レプリケーションのレイテンシはミリ秒単位で測定されています。

https://storage.googleapis.com/gweb-cloudblog-publish/images/2.RIOTStep2.max-2000x2000.jpg

4. カットオーバーの準備ができたら、既存の Redis クラスタへのトラフィックを停止します。アプリケーションを新しい Memorystore for Redis Cluster インスタンスを指すように再構成します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/3.RIOTStep3.max-2000x2000.jpg

ここまでは、プロセスの概要について説明しました。では、さらに細かく見ていきましょう。

ガイド: 移行の実施

次の段階的な手順は、ダウンタイムがほぼゼロで移行を実施するためのガイドとして使用できます。

ステップ 1: RIOT を実行するための VM を作成する
RIOT VM はコンソールから、または同様の gcloud コマンドを使用して作成できます。必要に応じて、プロジェクト、ゾーン、ネットワーク、サービス アカウントを編集します。

注: Redis ポート上のソースおよびターゲットの Memorystore インスタンスにはネットワーキングが必要になります。Memorystore は、デフォルトの Redis ポート 6379 を使用します。

読み込んでいます...

ステップ 2: RIOT と JVM を GCP VM にインストールする
次のコマンドを実行して、VM に Java 仮想マシン(JVM)をインストールします。これは debian で動作しますが、他のディストリビューションでは調整が必要になる場合があります。

読み込んでいます...

次のコマンドを実行して、RIOT をダウンロードします。最新のバージョンを確認します。

読み込んでいます...

RIOT の抽出:

読み込んでいます...

Redis CLI のインストール:

読み込んでいます...

環境をセットアップします。Memorystore ターゲットと Redis ソースのホスト変数とポート変数を編集する必要があります。Memorystore の情報はコンソールから取得できます。

読み込んでいます...

以下に示すように、どちらのコマンドも PONG を返す必要があります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/image6_mlbnii0.max-1000x1000.png

ソース Redis インスタンスでキースペース通知を有効にします。

RIOT はキースペース通知を使用して、レプリケーションのためにデータベースへの更新をキャプチャします。

読み込んでいます...

ステップ 3: RIOT を使用して移行を開始する
RIOT を開始します。

読み込んでいます...

RIOT は、初期同期(スキャン)のステータスと、リアルタイムでストリーミングされている変更(リスニング)を提供します。

https://storage.googleapis.com/gweb-cloudblog-publish/images/5_500.max-900x900.jpg

ステップ 4: 検証
データ移行の成功を検証するには、各データベースをダンプして比較するほか、合計キー数を確認するなど、さまざまな方法があります。このチュートリアルでは、ソースとターゲットのキーカウントを比較することで検証を行い、レプリケーションが追いついていることを確認します。注: 変更の頻度が高いインスタンスでは、これを極めて正確に行うことは難しい可能性があります。

まず、Memorystore for Redis Cluster のポートをすべて取得します。

読み込んでいます...

Memorystore for Redis Cluster の各スロットをループして、スロットごとのキーカウントを取得します。

読み込んでいます...

ステップ 5: 本番環境トラフィックをカットオーバーし、古いインスタンスを廃止する
本番環境のカットオーバーには 2 つのオプションがあります。

  • アプリケーションがソースとターゲット間の強整合性を必要としない場合は、Redis クライアントを新しい Memorystore for Redis Cluster インスタンスを指すように変更し、稼働を開始するだけです。これにより、ダウンタイムがゼロになり、データベースの結果整合性が維持されます。
  • 強整合性が必要なユースケースでは、Redis データベースへの書き込みトラフィックを停止します。RIOT が新しい Memorystore for Redis Cluster インスタンスに対し残りの変更のレプリケーションを完了するまで待ちます。Redis クライアントの構成を新しい Memorystore for Redis Cluster インスタンスを指すように更新し、稼働を開始します。これにより、書き込み頻度とレプリケーションの遅延に応じて数秒から数分のダウンタイムが発生しますが、強整合性が確保されます。

これで、Memorystore for Redis Cluster の稼働が開始されたため、コンソールの [モニタリング] タブで、本番環境ワークロードの使用状況の指標を確認できます。

最終的な考慮事項

Memorystore for Redis Cluster がリリースされたことにより、お客様は、マイクロ秒のレイテンシを実現しながら、アプリケーションを最高規模に拡張することが可能になります。Memorystore for Redis Cluster では Redis を管理する負担がないため、お客様はユーザーに価値を提供する新しい機能やアプリケーションをリリースすることに集中できます。

この移行ガイドを使用することで、ダウンタイムなしでの簡単な移行と、レプリケーション遅延がある場合のバックフィルを行うためのフレームワークを取得できます。GCP はお客様の Memorystore の導入をサポートいたします。Memorystore for Redis Cluster の最新のリリースについては、リリースノートをフォローしていただくことをおすすめしています。

- データ マネジメント担当カスタマー エンジニア Jason Massie

- 西海岸データ マネジメント担当カスタマー エンジニア Chris Mague

投稿先