从 Memorystore for Memcached 迁移到 Memorystore for Valkey

我们建议您将 Memorystore for Memcached 工作负载迁移到 Memorystore for Valkey。Memorystore for Memcached 是一种键值对数据存储区,而 Memorystore for Valkey 是一种功能更丰富的数据结构服务器。

Memorystore for Valkey 提供的功能与 Memorystore for Memcached 类似。此外,Memorystore for Valkey 还具有以下优势:

  • 它为 Valkey(一个与 Redis 兼容的开源项目)提供全代管式式高性能内存中数据存储区。
  • 它是 Google Cloud的全代管式 Valkey 服务,支持已启用集群模式的实例和已停用集群模式的实例。
  • 在 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 还支持 Bloom 过滤器向量搜索JSON 您可以将 Memorystore for Valkey 用于排行榜、任务队列和对象缓存等复杂用例,而无需进行应用序列化。您还可以使用向量搜索以亚毫秒级延迟执行语义查询。
交易 您可以使用 MULTIEXEC 命令以原子方式运行一组命令,将其作为一个不可分割的整体。 虽然您可以使用 Memorystore for Memcached 的比较和交换 (CAS) 功能在键级别实现乐观锁定,但 Memorystore for Valkey 可让您以原子方式运行一组命令。
Pub/Sub 消息传递 通过将 Pub/Sub 与 Memorystore for Valkey 搭配使用,您的客户端应用可以订阅渠道并接收实时消息。 借助 Memorystore for Valkey,您可以将缓存转换为轻量级消息代理,以实现实时更新和跨服务通信。
Lua 脚本 您可以使用 Lua 通过 EVAL 命令在服务器上以原子方式运行复杂的应用逻辑。 使用服务器端脚本可减少网络往返次数,并确保 Memorystore for Valkey 可以不间断地执行复杂操作。这有助于提升应用的性能。
高可用性、复制和分片支持 Memorystore for Valkey 的架构支持并提供高可用性 (HA)。 您的客户端应用可以通过连接到各个端点(或分片)来直接访问 Memorystore for Valkey 节点。 高可用性和复制功能可提高系统的可靠性,并最大限度减少关键更新期间的中断。使用分片有助于您有效地分发与客户端应用相关联的高流量负载。
持久性

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 命令可让您通过单个命令检索多个键的值。使用 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 标准-小 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)。