自建redis(单机)升级到腾讯云redis(分片式集群)的血的教训
一、项目升级血案
公司项目进行系统升级,为方便以后的扩展,以及减少运维人员的压力(公司只有一个运维),
从自建的redis升级到腾讯云的redis。升级后celery服务启动不起来,项目启动报错。
二、redis升级前后的版本
- 项目架构flask + celery + mongodb + redis
- celery使用redis是做backend和存储result
- 自建redis版本是redis3.2.6,用的是docker起的单机版redis
- redis内存使用比较多大概8G左右,但并发不算太高
- 腾讯云redis版本介绍
- 腾讯云的redis有单机版、副本集、分片式集群3个类型,
- 考虑数据安全,选择集群版,运维选择了分片式集群版,因为他觉得价格差不多,分片式更高大上。
- 腾讯云分片式redis集群
- 腾讯云的分片式集群,对集群进行封装,很多时候,可以想使用单机版redis一样使用集群版
- flask里可以直接用python的redis模块,直接连接集群版,
- 分片式集群主要为了提升redis内存的上限,内存300G以下都可以直接开通,以上需要申请。
- 分片式的方法就是把key不配在16324个槽点上,若干个槽点背平均分片在节点上,有N个节点,每个节点就是16324/N个槽点
- 因为keys分配在不同的节点Node上,所以不支持全局的事务,无法使用keys,subpub等功能
- 不支持功能详情:单机版迁移内存版(集群架构)说明
- 腾讯云redis分片式集群与自建redis集群的区别
- python连接不一样
- 自建集群,需要使用redis-py-cluster库进行连接,可以获取各个节点的信息,单独操作一个节点
参考文章ython 操作redis集群
- 腾讯云的进行封装,像使用单机版一样连接,简单方便,无法直接获得单个节点信息,也无法直接操作单个节点,
- 使用不一样
- 自建集群,无法分库
- 腾讯云,可以select(db),使用不同库,进行数据隔离
三、celery起动不了的原因
- 启动celery的服务报错
- 报错内容为,translation无法执行,就是无法使用redis里的事务
- 报错原因
- celery官方文档里说,只支持redis哨兵模式的集群,不支持分片式的集群
四、解决办法
- 因为分片式集群购买了半年多,无法退款,只能自己再建一个单机版redis,专门给celery用
- 尽量减少使用keys,以及其他涉及跨节点找key的函数
- 实在无法避免的,也用自建单机版的redis
- 等腾讯云服务到期后,从分片式集群换回副本集版本,一主一副本就是主从版,一主多副就是副本集
五、经验教训
- 不同版本之间升级时,一定要先进行测试,用同样的环境完全跑一遍。之前测试时,仍然用的自建redis做的测试,
- 集群不是越高级越好,要根据自己项目的使用情况,根据不同版本的特点,选择最合适的。
- 购买云服务时,开发还是要参与的,运维自己买了,结果项目跑不起来,云服务就浪费了。
- 对比过阿里云的redis集群服务,文档比腾讯云的丰富一点,但使用和腾讯云差不多,都是同样的限制。