Memorystore for Memcached から Memorystore for Valkey に移行する

Memorystore for Memcached ワークロードを Memorystore for Valkey に移行することをおすすめします。Memorystore for Memcached は Key-Value データストアですが、Memorystore for Valkey はより機能豊富なデータ構造サーバーです。

Memorystore for Valkey は、Memorystore for Memcached と同様の機能を提供します。また、Memorystore for Valkey には次の利点があります。

  • これは、Redis 互換のオープンソース プロジェクトである Valkey 向けの、フルマネージドの高パフォーマンス インメモリ データストアを提供します。
  • これは、クラスタモードが有効なインスタンスとクラスタモードが無効なインスタンスの両方をサポートするフルマネージドの Google CloudValkey サービスです。
  • Google Cloud で実行されるアプリケーションは、スケーラビリティ、可用性、安全性に優れた Valkey サービスを利用することで、複雑な Valkey デプロイを管理する負担なく、優れたパフォーマンスを実現できます。

Memorystore for Valkey の機能

Memorystore for Valkey に移行すると、Memorystore for Memcached では使用できない機能にアクセスできます。これらの機能により、アプリケーション開発、信頼性、パフォーマンスが向上します。

次の表に、Memorystore for Valkey で使用可能な機能と、これらの機能を使用するメリットを示します。

機能 説明 利点
複数のデータベース Memorystore for Memcached は単一のフラットなキースペースです。ただし、デフォルトでは、Memorystore for Valkey のクラスタモードが無効のモードでは、インスタンスあたり最大 16 個のデータベースがサポートされます。インスタンスに最大 100 個のデータベースを設定できるように、環境を構成できます。 インスタンスに複数のデータベースを設定すると、インスタンスの単一障害点を回避できます。また、他のデータベースの可用性や整合性に影響を与えることなく、単一のデータベースをバックアップまたは復元できます。さらに、データベースをより効率的にスケーリングまたは移行できます。
リッチなデータ構造 Memorystore for Valkey は、文字列に加えて、リスト、セット、ソート済みセット、ハッシュ、ビットマップをサポートしています。Memorystore for Valkey は、ブルーム フィルタベクトル検索JSON もサポートしています。 Memorystore for Valkey を使用すると、アプリケーションのシリアル化なしで、リーダーボード、タスクキュー、オブジェクト キャッシュなどの複雑なユースケースに対応できます。ベクトル検索を使用して、1 ミリ秒未満のレイテンシでセマンティック クエリを実行することもできます。
トランザクション MULTI コマンドと EXEC コマンドを使用すると、コマンドのグループを不可分な単位としてアトミックに実行できます。 Memorystore for Memcached の比較とスワップ(CAS)機能を使用してキーレベルで楽観的ロックを行うことはできますが、Memorystore for Valkey では一連のコマンドをアトミックに実行できます。
Pub/Sub メッセージング Memorystore for Valkey で Pub/Sub を使用すると、クライアント アプリケーションはチャネルをサブスクライブしてリアルタイム メッセージを受信できます。 Memorystore for Valkey を使用すると、キャッシュをリアルタイム更新とサービス間通信用の軽量メッセージ ブローカーに変換できます。
Lua スクリプト Lua を使用すると、EVAL コマンドを使用して、サーバーで複雑なアプリケーション ロジックをアトミックに実行できます。 サーバーサイド スクリプトを使用すると、ネットワークのラウンド トリップが減少し、Memorystore for Valkey が中断することなく複雑なオペレーションを実行できます。これにより、アプリケーションのパフォーマンスが向上します。
高可用性、レプリケーション、シャードのサポート Memorystore for Valkey のアーキテクチャは、高可用性(HA)をサポートし、提供します。クライアント アプリケーションは、個々のエンドポイント(またはシャード)に接続することで、Memorystore for Valkey ノードに直接アクセスできます。 HA とレプリケーションにより、システムの信頼性が向上し、重要な更新時の停止時間を最小限に抑えることができます。シャードを使用すると、クライアント アプリケーションに関連するトラフィックの負荷を効果的に分散できます。
永続性

Memorystore for Valkey は、次のタイプの永続性をサポートしています。

  • 追加専用ファイル(AOF): データの耐久性に使用されます。すべての書き込みコマンドを AOF ファイルと呼ばれるログファイルに記録することで、データを耐久的に保存します。システム障害または再起動が発生すると、サーバーは AOF ファイル コマンドを順番に再生してデータを復元します。
  • Redis データベース(RDB): データ保護に使用されます。耐久性の高いストレージにデータのスナップショットを保存することで、データを保護します。ノード障害が発生した場合は、データを復元できます。
AOF と RDB の永続性を使用すると、重要なデータを Memorystore for Valkey に永続的に保存できます。データはいつでも復元できます。Memorystore for Valkey は基盤となる永続メカニズムを処理するため、永続性の使用にほとんど時間を費やす必要がありません。

ワークロードの移行

Memorystore for Memcached ワークロードを Memorystore for Valkey に移行するには、次の操作を行う必要があります。

  1. クライアント ライブラリを変更する: アプリケーションのクライアント ライブラリを Memcached ライブラリから Valkey ライブラリに変更します。
  2. コマンドを変更する: クライアント アプリケーションの Memcached API のすべてのコマンドを、対応する Valkey API のコマンドに置き換えます。
  3. 移行をデプロイして検証する: 移行を設定し、それを使用してワークロードを Memorystore for Valkey に移行できることを確認します。

クライアント ライブラリを変更する

このセクションでは、アプリケーションのクライアント ライブラリを Memcached ライブラリから Valkey ライブラリに変更します。

次の表に、Python、Java、Go、Node.js 用の Memcached クライアント ライブラリの例と、Valkey の対応するライブラリを示します。

言語 Memcached クライアント ライブラリ Valkey クライアント ライブラリ
Python python-memcachedpymemcache valkey-py
Java spymemcached Valkey GLIDEvalkey-java
Go gomemcache Valkey GLIDEvalkey-go
Node.js memjs Valkey GLIDEioredis

コマンドを変更する

このセクションでは、クライアント アプリケーションの Memcached API のすべてのコマンドを、対応する Valkey API のコマンドに置き換えます。

コマンドを変更するには、次の操作を行う必要があります。

  1. 接続設定を変更する: クライアント アプリケーションの接続を Memcached サーバーから Valkey サーバーに変更します。
  2. コマンドを変更する: すべての Memcached API コマンドを、Valkey API の対応するコマンドに置き換えます。

接続設定を変更する

このセクションでは、クライアント アプリケーションの接続を Memcached サーバーから Valkey サーバーに変更します。

  1. クライアント アプリケーションを Memcached サーバーに接続するために使用するコードを見つけます。これは次のコードのようになります。

    import memcache;
    mc = memcache.Client(['MEMCACHED_IP_ADDRESS:11211'])
    

    MEMCACHED_IP_ADDRESS は、Memorystore for Memcached インスタンスの IP アドレスに置き換えます。

  2. クライアント アプリケーションが Valkey サーバーに接続できるように、このコードを変更します。これは次のコードのようになります。

    import valkey;
    v = valkey.Valkey(host=VALKEY_IP_ADDRESS, port=6379, db=0)
    

    VALKEY_IP_ADDRESS は、移行をデプロイして検証するときに作成する Memorystore for Valkey インスタンスの IP アドレスに置き換えます。

コマンドを変更する

このセクションでは、クライアント アプリケーションのすべての Memcached API コマンドを、対応する Valkey API コマンドに置き換えます。

DECR

DECR コマンドを使用すると、キーに保存されている値を指定した量だけ減らすことができます。

  1. Memcached で DECR コマンドに使用するコードを見つけます。次のコードのようになります。

    mc.DECR('KEY_NAME', AMOUNT)
    

    次のように置き換えます。

    • KEY_NAME: 鍵の名前
    • AMOUNT: キーに保存されている数値を減らす値。整数を指定してください。
  2. Valkey で使用できるように、このコードを変更します。変更は次のコードのようになります。

    v.DECR('KEY_NAME', AMOUNT)
    
削除

DELETE コマンドを使用すると、キーを削除できます。たとえば、ユーザーを削除できます。

  1. Memcached で DELETE コマンドに使用するコードを見つけます。これは次のコードのようになります。

    mc.DELETE('USERNAME')
    

    USERNAME は、削除するユーザーの名前に置き換えます。

  2. Valkey で使用できるように、このコードを変更します。変更は次のコードのようになります。

    v.DELETE('USERNAME')
    
GET

GET コマンドを使用すると、キーに関連付けられた値を取得できます。たとえば、ユーザーに関する情報を取得できます。

  1. Memcached で GET コマンドに使用するコードを見つけます。次のコードのようになります。

    data = mc.GET('USERNAME')
    

    USERNAME は、情報を取得するユーザーの名前に置き換えます。

  2. Valkey で使用できるように、このコードを変更します。変更は次のコードのようになります。

    data = v.GET('USERNAME')
    
INCR

INCR コマンドを使用すると、キーに保存されている値を指定した量だけ増やすことができます。

  1. Memcached で INCR コマンドに使用するコードを見つけます。次のコードのようになります。

    mc.INCR('KEY_NAME', AMOUNT)
    

    次のように置き換えます。

    • KEY_NAME: 鍵の名前
    • AMOUNT: キーに保存されている数値を増やす値。整数を指定してください。
  2. Valkey で使用できるように、このコードを変更します。変更は次のコードのようになります。

    v.INCR('KEY_NAME', AMOUNT)
    
MGET

MGET コマンドを使用すると、1 つのコマンドで複数のキーの値を取得できます。MGET を使用すると、環境のパフォーマンスが向上します。

  1. Memcached で MGET コマンドに使用するコードを見つけます。次のコードのようになります。

    data_map = mc.get_multi(['KEY_NAME_1', 'KEY_NAME_2'])
    

    KEY_NAME_1KEY_NAME_2 は、情報を取得する鍵の名前に置き換えます。

  2. Valkey で使用できるように、このコードを変更します。変更は次のコードのようになります。

    data_list = v.MGET(['KEY_NAME_1', 'KEY_NAME_2'])
    
SET

SET コマンドを使用すると、キーの値を指定できます。たとえば、システムにアクセスするユーザーの有効期限(秒単位)を設定できます。

  1. Memcached で SET コマンドに使用するコードを見つけます。次のコードのようになります。

    mc.SET('USERNAME', 'data', time=EXPIRATION_TIME)
    

    次のように置き換えます。

    • USERNAME: システムにアクセスするユーザーの名前
    • EXPIRATION_TIME: ユーザーがシステムにアクセスできなくなるまでの秒数
  2. Valkey で使用できるように、このコードを変更します。変更は次のコードのようになります。

    v.SET('USERNAME', 'data', ex=EXPIRATION_TIME)
    

移行をデプロイして検証する

このセクションでは、移行を設定し、移行を使用してワークロードを Memorystore for Valkey に移行できることを確認します。

移行をデプロイして検証する手順は次のとおりです。

  1. Memorystore for Valkey インスタンスを作成する: 作成するインスタンスのサイズが、Memorystore for Memcached インスタンスのサイズとほぼ同じであることを確認します。また、Cloud Monitoring を使用して、Memorystore for Valkey インスタンスの使用状況をモニタリングします。
  2. 両方のインスタンスに書き込む: ゼロダウンタイム移行の場合は、両方のインスタンスに書き込むようにアプリケーションを変更します。これにより、Valkey キャッシュが入力され、主要なモニタリング指標をベンチマークできます。
  3. Memorystore for Memcached インスタンスへのトラフィックを停止する: 読み取りオペレーションが Memorystore for Valkey インスタンスの IP アドレスとポート番号(6379)を指すように、アプリケーションの構成を変更します。
  4. アプリケーションをモニタリングする: アプリケーションのエラー率とレイテンシをモニタリングします。
  5. Memorystore for Memcached インスタンスを削除する: Memorystore for Memcached インスタンスへの書き込みを停止し、インスタンスを削除します。

よくある質問

このセクションでは、Memorystore for Memcached ワークロードを Memorystore for Valkey に移行する際のよくある質問(FAQ)を紹介します。

Memorystore for Valkey に移行する理由は何ですか?

Valkey は、Redis コードベースの高性能なオープンソース プロジェクト フォークです。Memorystore for Valkey は、Redis プロトコルと互換性のあるマネージド サービスを提供します。これにより、既存のすべての Redis クライアント ライブラリとコマンドがシームレスに動作します。Memorystore for Valkey への移行は、標準の Redis 互換サーバーへの移行と機能的に同等です。

ネットワーク ファイアウォール ルールを再構成する必要がありますか?

Memorystore for Memcached インスタンスは通常ポート 11211 を使用しますが、Memorystore for Valkey インスタンスはポート 6379 を使用します。Virtual Private Cloud(VPC)ファイアウォール ルールで、アプリケーションから正しいポートの Memorystore for Valkey インスタンスへの下り(外向き)トラフィックが許可されていることを確認する必要があります。

Valkey は複雑なオブジェクトのシリアル化をどのように処理しますか?

Memcached は、Python オブジェクトや Java オブジェクトなどの複雑なオブジェクトの構造を認識していないため、すべてのオブジェクトを不透明な blob として扱います。

その結果、データがネットワークに到達する前に、シリアル化がクライアント アプリケーション側で完全に実行されます。サーバーにはバイト配列のみが表示されます。たとえば、ユーザーのメールアドレスなどの単一のプロパティを読み取るには、シリアル化されたオブジェクト全体を取得し、アプリケーションで逆シリアル化してから、プロパティに関連付けられたフィールドを読み取る必要があります。

Valkey は blob を保存し、複雑なオブジェクトの構造を理解できます。Valkey を使用して、オブジェクトのフィールドを Valkey ハッシュテーブルに展開することもできます。このテーブルを使用すると、ネストされた値を直接取得できます。

次の例では、Valkey ハッシュテーブルを使用してユーザーのメールアドレスを取得します。

# valkey-py
client.hset("user:101", mapping={
    "name": "username",
    "email": "username@example.com",
    "login_count": 10
})
client.hget("user:101", "email") # -> b"username@example.com"

Memcached と Valkey の通信プロトコルの違いは何ですか?

Memcached は、ASCII プロトコルとバイナリ プロトコル(省略可)を使用します。Valkey は Redis シリアル化プロトコル(RESP)を使用します。

これらは異なるプロトコルですが、最新の Valkey クライアント アプリケーション ライブラリは RESP プロトコルを自動的に処理します。これにより、プロトコルの違いがアプリケーション コードに対して透過的になります。

Memorystore for Valkey に移行した後、flags フィールドをどのようにマッピングしますか?

Memorystore for Memcached は flags フィールドをサポートしています。このフィールドには、クライアント アプリケーション ライブラリが保存された値に関するメタデータの保存に使用する 32 ビットの符号なし整数が含まれます。

Memorystore for Valkey はこのフィールドをサポートしていません。flags フィールドを Memorystore for Valkey にマッピングするには、次の操作を行います。

  1. フラグを文字列オブジェクトのキー名にシリアル化します。
  2. フラグを文字列オブジェクトの値にシリアル化します。
  3. フラグ用の指定されたフィールドを含むハッシュ オブジェクトを使用します。

Memorystore for Valkey はパフォーマンスが向上しますか?

ほとんどのシナリオで、Memorystore for Valkey の方がパフォーマンスが優れています。これは、Valkey の高度なデータ構造、永続的な接続、パイプライン処理のサポート、マルチキー オペレーションの効率向上によるものです。ただし、クライアント ライブラリコマンドを正しく変更する必要があります。

Memorystore for Memcached インスタンスで複数のノードを使用している場合、Memorystore for Valkey ではどうすればよいですか?

移行をデプロイして検証する場合は、Memorystore for Valkey にクラスタモードが有効なインスタンスを作成します。これらのインスタンスは、シャーディングと高可用性を内部で処理し、アプリケーションには単一のエンドポイントとして表示されます。これにより、アプリケーションのクライアントサイド ロジックが簡素化されます。

Memorystore for Memcached インスタンスで複数のノードを使用している場合、Memorystore for Valkey インスタンスにはどのノードタイプをおすすめしますか?

Memorystore for Memcached インスタンスごとに、ノードサイズを特定するには、ノードあたりのメモリ プロパティに関連付けられている値を確認します。対応する Memorystore for Valkey インスタンスのノードタイプを特定するには、次の表を使用します。

Memorystore for Memcached ノードサイズ Memorystore for Valkey ノードタイプ ノードの合計容量 vCPU 数
1 GB 未満 shared-core-nano 1.4 GB 0.5(共有)
1 GB ~ 5 GB standard-small 6.5 GB 2
6 GB ~ 12 GB highmem-medium 13.0 GB 2
13 GB ~ 50 GB highmem-xlarge 58.0 GB 8

shared-core-nano ノードタイプは小規模なワークロード用です。このノードタイプはパフォーマンスが変動し、SLA がないため、本番環境ワークロードには適していません。

Memorystore for Valkey インスタンスに選択する仮想 CPU(vCPU)が多いほど、パフォーマンスが向上します。インスタンスでリソースを大量に消費するワークロードを実行する場合は、vCPU が多いノードタイプ(highmem-xlarge など)を選択します。インスタンスで負荷の少ないタスクを実行する場合は、vCPU が少ないノードタイプ(highmem-medium など)を選択します。