自建redis(单机)升级到腾讯云redis(分片式集群)的血的教训

自建redis(单机)升级到腾讯云redis(分片式集群)的血的教训

一、项目升级血案

公司项目进行系统升级,为方便以后的扩展,以及减少运维人员的压力(公司只有一个运维),
从自建的redis升级到腾讯云的redis。升级后celery服务启动不起来,项目启动报错。

二、redis升级前后的版本

  1. 项目架构flask + celery + mongodb + redis
    • celery使用redis是做backend和存储result
    • 自建redis版本是redis3.2.6,用的是docker起的单机版redis
    • redis内存使用比较多大概8G左右,但并发不算太高
  2. 腾讯云redis版本介绍
    • 腾讯云的redis有单机版、副本集、分片式集群3个类型,
    • 考虑数据安全,选择集群版,运维选择了分片式集群版,因为他觉得价格差不多,分片式更高大上。
  3. 腾讯云分片式redis集群
    • 腾讯云的分片式集群,对集群进行封装,很多时候,可以想使用单机版redis一样使用集群版
    • flask里可以直接用python的redis模块,直接连接集群版,
    • 分片式集群主要为了提升redis内存的上限,内存300G以下都可以直接开通,以上需要申请。
    • 分片式的方法就是把key不配在16324个槽点上,若干个槽点背平均分片在节点上,有N个节点,每个节点就是16324/N个槽点
    • 因为keys分配在不同的节点Node上,所以不支持全局的事务,无法使用keys,subpub等功能
    • 不支持功能详情:单机版迁移内存版(集群架构)说明
  4. 腾讯云redis分片式集群与自建redis集群的区别
    • python连接不一样
      • 自建集群,需要使用redis-py-cluster库进行连接,可以获取各个节点的信息,单独操作一个节点
        参考文章ython 操作redis集群
      • 腾讯云的进行封装,像使用单机版一样连接,简单方便,无法直接获得单个节点信息,也无法直接操作单个节点,
    • 使用不一样
      • 自建集群,无法分库
      • 腾讯云,可以select(db),使用不同库,进行数据隔离

三、celery起动不了的原因

  1. 启动celery的服务报错
    • 报错内容为,translation无法执行,就是无法使用redis里的事务
  2. 报错原因
    • celery官方文档里说,只支持redis哨兵模式的集群,不支持分片式的集群

四、解决办法

  1. 因为分片式集群购买了半年多,无法退款,只能自己再建一个单机版redis,专门给celery用
  2. 尽量减少使用keys,以及其他涉及跨节点找key的函数
  3. 实在无法避免的,也用自建单机版的redis
  4. 等腾讯云服务到期后,从分片式集群换回副本集版本,一主一副本就是主从版,一主多副就是副本集

五、经验教训

  1. 不同版本之间升级时,一定要先进行测试,用同样的环境完全跑一遍。之前测试时,仍然用的自建redis做的测试,
  2. 集群不是越高级越好,要根据自己项目的使用情况,根据不同版本的特点,选择最合适的。
  3. 购买云服务时,开发还是要参与的,运维自己买了,结果项目跑不起来,云服务就浪费了。
  4. 对比过阿里云的redis集群服务,文档比腾讯云的丰富一点,但使用和腾讯云差不多,都是同样的限制。

六、网上案例

  1. 一场Celery不支持Redis集群引发的血案子
  2. django使用reids集群做cache,安装django-cluster-redis
原文地址:https://www.cnblogs.com/qumogu/p/13132949.html