0%

Session Memcached集群迁移至Redis集群

项目背景

随着业务的快速发展,我们原有的 session 存储方案 Memcached 逐渐显露出一些瓶颈,主要体现在以下几个方面。:

  • 扩展性受限Memcached 集群不支持分片,要分片需要在客户端实现分片逻辑,扩容和缩容操作繁琐,运维成本较高,难以满足业务快速增长的需求
  • 监控能力薄弱Memcached 提供的监控指标有限,难以全面掌握集群运行状态,故障排查和告警不够便捷。
  • 缺少持久化Memcached 作为纯内存缓存,数据无法持久化,存在数据丢失风险,虽然 session 数据对持久化要求不高,但在某些极端情况下,数据丢失仍可能影响用户体验。

为了解决 Memcached 的上述问题,并提升 session 存储的扩展性、可维护性和监控能力,我们决定将 session 存储方案迁移至 Redis 集群Redis 集群在集群化、监控告警、数据持久化等方面都具备显著优势,能够更好地满足我们业务发展的需求。

迁移方案与实施阶段

本次 session 迁移项目,我们采取了分阶段、平滑迁移的策略,最大程度降低迁移风险,保障业务的连续性和稳定性。整个迁移过程分为三个阶段:

graph TD
    subgraph "第一阶段"
        A1[应用服务] --> |写| B1[Memcached]
        A1 --> |写| C1[Redis]
        B1 --> |读| A1
    end
    
    subgraph "第二阶段"
        A2[应用服务] --> |写| B2[Memcached]
        A2 --> |写| C2[Redis]
        C2 --> |读| A2
    end
    
    subgraph "第三阶段"
        A3[应用服务] --> |写| C3[Redis]
        C3 --> |读| A3
        B3[Memcached] -.-> |停止写入| A3
    end
  • 第一阶段:双写 Memcached 和 Redis,读 Memcached

    • 目标:验证 Redis 集群的稳定性和性能,为后续切换读取流量做好数据准备。
    • 策略:应用系统同时向 MemcachedRedis 集群写入 session 数据,但只从 Memcached 读取 session 数据
    • 数据一致性保障双写成功才算成功,确保 MemcachedRedis 数据一致性。任何写入失败都会记录详细日志并触发告警,方便后续数据补偿。
    • 持续时间:为了保证 Redis 集群中 session 数据的完整性,双写阶段持续 30 天,覆盖 session 的最长过期时间,确保 Redis 集群拥有全量 session 数据。
  • 第二阶段:双写 Memcached 和 Redis,读 Redis

    • 目标:将读取流量平滑切换到 Redis 集群,验证 Redis 集群在高并发读取场景下的性能表现。
    • 策略:应用系统仍然同时向 MemcachedRedis 集群写入 session 数据,但读取操作切换至 Redis 集群
    • 平滑切换:采用灰度发布策略,逐步将读取流量从 Memcached 切换到 Redis 集群,降低切换风险。
    • 回滚准备保留 Memcached 的写入,为后续可能的回滚操作预留数据基础。
  • 第三阶段:停止 Memcached 写入,读 Redis

    • 目标:完全切换到 Redis 集群,停用 Memcached
    • 策略停止向 Memcached 写入 session 数据,所有读写操作均转向 Redis 集群。
    • 风险评估:在进入第三阶段前,进行全面的风险评估,确认系统运行稳定,各项监控指标正常。由于第二阶段已经验证了 Redis 集群的读取能力,且 Memcached 写入持续运行,因此第三阶段的风险较低。

关键技术挑战与解决方案

session 迁移过程中,我们主要面临以下技术挑战:

  • 数据一致性:在双写阶段,如何保证 MemcachedRedis 的数据一致性至关重要。我们通过双写强一致性策略和完善的异常监控告警机制来解决这个问题。
  • 平滑切换:如何平滑地将读取流量从 Memcached 切换到 Redis 集群,避免对用户体验造成影响。我们采用灰度发布策略,逐步切换流量,并密切监控系统运行状态。
  • 性能保障Redis 集群在高并发场景下的性能是否能够满足需求,需要进行充分的验证。我们在第二阶段通过全量流量读取 Redis 集群,验证了 Redis 集群的性能表现。
  • 监控与回滚:如何全面监控迁移过程,及时发现和处理异常,并制定完善的回滚方案,保障迁移过程的安全可控。利用我们完善的监控体系,针对每个阶段制定了详细的回滚计划

性能监控与回滚方案

为了保障 session 迁移项目的平稳落地,我们建立了完善的性能监控和回滚方案:

1. 性能监控

在整个迁移过程中,我们重点监控以下关键指标:

  • Redis 集群性能指标
    • CPU 使用率、内存使用率:监控 Redis 集群资源使用情况,判断集群是否过载。
    • 请求延迟:监控 Redis 请求响应时间,评估 Redis 集群性能是否满足需求。
    • 错误率:监控 Redis 请求错误率,及时发现 Redis 集群异常。
    • 大key和热key:关注 Redis 的流量和CPU变化是否出现大key和热key
  • Session 读写成功率
    • Redis session 读取成功率:监控从 Redis 集群读取 session 的成功率,确保读取操作正常。
    • Redis session 写入成功率:监控向 Redis 集群写入 session 的成功率,确保写入操作正常。
    • Memcached session 写入成功率:在双写阶段,监控向 Memcached 写入 session 的成功率,确保双写操作正常。
  • 应用系统业务指标
    • 接口响应时间:监控应用系统接口响应时间,评估迁移对应用系统性能的影响。
    • 错误率:监控应用系统错误率,评估迁移是否引入新的错误。
    • 登录用户指标:监控登录用户数量变化,判断迁移是否影响用户登录。
    • 各阶段转化率 (加购,生单,支付):监控用户在各个关键业务流程的转化率,评估迁移是否对业务指标造成负面影响。

2. 回滚方案

  • 回滚触发:当监控指标出现异常,例如:应用系统接口响应时间显著增加、业务指标出现明显波动等情况时,立即触发回滚。
  • 回滚步骤
    1. 流量切换:立即将 session 读取流量**回退到 Memcached**。由于第二阶段持续保持 Memcached 写入,Memcached 中仍然保有全量 session 数据,可以快速切换回读。
    2. 问题排查:回滚后,立即排查 Redis 集群异常原因,修复问题。
    3. 重新迁移:待问题解决后,重新评估并选择合适的时机再次进行迁移。

由于我们在第二阶段已经进行了充分的 Redis 集群读取验证,并且在第三阶段前进行了全面的风险评估,因此实际上并未触发回滚第二阶段保留 Memcached 写入的主要目的就是为了应对可能的回滚场景,为系统提供一层额外的安全保障。

项目总结与收益

sessionMemcached 平滑迁移至 Redis 集群项目,历时数月,整个迁移过程较为顺利,最终平稳落地,达到预期目标。通过本次迁移,我们成功解决了 Memcached扩展性、监控能力等方面的瓶颈,为业务发展提供了更可靠、更高效的 session 存储方案。

项目收益总结

  • 提升扩展性Redis 集群具备良好的水平扩展能力,可以轻松应对未来 session 数据量的增长。相比原来需要在客户端实现分片的 Memcached 方案,Redis 集群的扩容和缩容操作更加简单直观,极大降低了运维成本。
  • 增强监控能力Redis 集群提供更丰富的监控指标,并能与 Prometheus 等监控系统方便集成,提升运维效率。
  • 性能稳定:迁移后系统性能与原 Memcached 方案基本持平,但在运维性和可扩展性方面获得了显著提升,为未来业务增长预留了充足的扩展空间。
  • 为未来优化奠定基础:迁移至 Redis 集群,为后续 session 存储的性能优化、功能增强(例如,利用 Redis 更丰富的数据结构实现更复杂的 session 管理功能)奠定了基础。

本次 session 迁移项目, 分阶段平滑迁移策略、完善的监控回滚方案、以及对数据一致性的高度重视,是项目成功的关键因素。 这些经验也为我们后续进行类似的大型系统迁移项目提供了宝贵的参考.