百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Django连接Redis集群问题排查思路和总结

wptr33 2024-12-25 16:02 9 浏览

问题背景

  • Django 项目第一次发布到生产环境,启动后发现连不上 Redis 集群。
  • 测试环境的 redis 集群没有密码,导致测试环境生产的配置格式会有差异
  • 生产环境使用的 redis 配置,之前没人验证过,不知道是单机还是集群
  • 生产环境 redis 的密码中特殊符合 @,同事说可能会 Django Cache 配置的 URI 切割符号冲突,他之前在 celery broker_url 配置时就遇到这个坑。

排查思路

  • 测试环境和生产环境的配置不一样,因此要格外小心,生产环境配置不能照抄测试环境的
  • 优先使用官方 redis-cli 确定 redis 是集群还是客户端,再去修改代码相关的配置
  • 本地无法连接生产环境,因为需要通过跳板机登录上去生产环境,直接利用 Django shell 调试,而不每次修改代码后重新提交,然后构建。
  • 出问题时,优先怀疑自己的代码问题,而不是找框架本身的问题,尤其是 Django 这种大框架。

排查过程

确认客户端类型

  • 做一个最简单的 set 命令测试,直接报错。
rhea-flaskapi-live-sg(sg2|10.xxx:40681)@/workspace$ redis-cli -h redis.xxx.shopee.io -p 10010 -a xxxx@123
redis.xxx.shopee.io:10010> set a 123
(error) MOVED 15495 10.xxx.104:10011
  • 经过搜索引擎查询,确认这个 redis 是集群,集群的连接命令是 redis-cli -c -h 连接地址 -p 端口 -a 密码 上面的命令少了 -c 参数

启动 Django Shell 连接 redis

from django_redis import get_redis_connection
conn = get_redis_connection()

直接就一个连接失败

确认账号密码和端口没问题后,问题同事配置有没验证过,他说直接从网上 cv 的,完全没经过验证。坑啊!!!

修改配置后重新测试

把生产的配置和测试配置比较好,修改了几个地方

  • LOCATIONstr 改成 List[str] ,加上默认 db ,也就是 [ f'redis://{DEFAULT_REDIS_URL}:{DEFAULT_REDIS_PORT}/0']
  • REDIS_CLIENT_CLASS': 'rediscluster.RedisCluster 这个集群连接需要的客户端
  • 连接池配置改成 'CONNECTION_POOL_CLASS': 'rediscluster.connection.ClusterConnectionPool'

信心满满,重启启动 django shell 测试,结果还是连接不上!这时候心情开始有点糟糕~

冷静, django shell 不行,那用 python shell 直连试试?

Python Shell 直连 redis

一点毛病都没有,直接连上了!

一脸懵逼,这到底是啥问题啊!

不死心,反复修改配置,测试 Django Shell 连接 Redis

结果依然是连接不上。

下班回家过程中的思考

不知不觉已经到了晚上九点,好累,不想卷了。下班回家吧

回家路上整个脑子都被这个问题困扰着。难道密码中含有 @ 符号的 redis 集群,Django 真的连接不上?反复的问自己。

问了其他同事,生产环境是否有其他的 redis 集群可以用来调试。很遗憾,并没有。

要不,我自己创建一个 redis 集群,把密码设置成含有 @ 符号?

可是,自己本地创建 redis 集群好麻烦啊。要本地安装虚拟机,想到一堆配置就直接劝退。

回到家后的纠结

洗完澡,和老婆聊了 1h 左右的视频。已经到 11 点多,准备睡觉?

那是不可能的,带着问题是很难入睡!哎,这个是老毛病了。

突然想到了一个点,最小试错原则。自己搭建本地集群很麻烦,公司又没有多余的集群。

那直接买一个云版的 redis 集群?说干就干,直接从床上起来,打开电脑。

最小试错原则,买云 Redis 集群,而不是自己搭建

这时问题又来了,阿里云还是腾讯云?

鉴于双 11 买了腾讯云 2c 4g 8m 的服务器,只要 199 就能 3 年。

再对比之前买阿里云那个 1c 2g 1m 服务器,3 年也要 100 多。

瞬间对腾讯云好感倍增,决定先买腾讯云。

买腾讯云 redis 集群

一顿操作,发现腾讯云是真的难用:

  • 购买页面选好配置好,提交后,因为我没有余额,提示我充值。等我充值完,结果之前选择的配置没了,只好重新选择。
  • redis 集群没有重启功能???
  • 设置安全组时,只能在安全组的页面绑定实例;在实例页面无法绑定安全组。

最最最重要,给把实例绑定了安全组后,外网还是无法访问???(不管了,反正我就是很生气)

买阿里云 redis 集群

对腾讯云太失望了,不得不把最后一根稻草压在阿里云身上。

所幸,阿里云没有让我失望!

咔咔咔,一顿操作:

  • 创建实例,这点阿里云是比腾讯云慢很多,大概要 7min 左右(纯感觉)
  • 配置外网访问,很方便。这操作逻辑简直是秒杀腾讯云。
  • 配置白名单,redis-cli 连接测试,成功通过!
  • 修改配置,启动 Django shell 测试。

密码中含有 @ 符号,但连接一点毛病都没有!!!

至此,问题终于解决了!!!

我已经迫不及待明天去公司验证,但回过头一看,已经是深夜一点半。

自言自语的说了一句:"睡吧,卷王"

第二天去公司验证

rhea-flaskapi-live-sg(sg2|xxxx:26863)@/workspace$ python3.8 manage.py shell --settings=rhea.settings.prod
rhea.settings.prod
Python 3.8.7 (default, Oct  1 2021, 14:58:33)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django_redis import get_redis_connection
>>> conn = get_redis_connection()
>>>>conn.get("rhea:access_token:abc")
'huacai.li@shopee.com'

经过对比,发现配置只需要生产的配置仅需要在测试的配置上加多一个 :

修复最磨人的 bug,往往仅需要一点小小的改动~

为什么测试环境没报错了呢???

因为测试环境的 redis 集群不需要密码

总结

  • 一切没经过自己验证的代码,一定要谨慎使用
  • 最小试错原则。想验证一件事情时,尽量使用最小的成本去验证
  • 生产和测试环境尽量保持配置相同

相关推荐

【推荐】一款开源免费、美观实用的后台管理系统模版

如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...

Android架构组件-App架构指南,你还不收藏嘛

本指南适用于那些已经拥有开发Android应用基础知识的开发人员,现在想了解能够开发出更加健壮、优质的应用程序架构。首先需要说明的是:AndroidArchitectureComponents翻...

高德地图经纬度坐标批量拾取(高德地图批量查询经纬度)

使用方法在桌面上新建一个index.txt文件,把下面的代码复制进去保存,再把文件名改成index.html保存,双击运行打开即可...

flutter系列之:UI layout简介(flutter ui设计)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。...

Android开发基础入门(一):UI与基础控件

Android基础入门前言:...

iOS的布局体系-流式布局MyFlowLayout

iOS布局体系的概览在我的CSDN博客中的几篇文章分别介绍MyLayout布局体系中的视图从一个方向依次排列的线性布局(MyLinearLayout)、视图层叠且停靠于父布局视图某个位置的框架布局(M...

TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序

TDesing发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。...

WinForm实现窗体自适应缩放(winform窗口缩放)

众所周知,...

winform项目——仿QQ即时通讯程序03:搭建登录界面

上两篇文章已经对CIM仿QQ即时通讯项目进行了需求分析和数据库设计。winform项目——仿QQ即时通讯程序01:原理及项目分析...

App自动化测试|原生app元素定位方法

元素定位方法介绍及应用Appium方法定位原生app元素...

61.C# TableLayoutPanel控件(c# tabcontrol)

摘要TableLayoutPanel在网格中排列内容,提供类似于HTML元素的功能。TableLayoutPanel控件允许你将控件放在网格布局中,而无需精确指定每个控件的位置。其单元格...

想要深入学习Android性能优化?看完这篇直接让你一步到位

...

12个python数据处理常用内置函数(python 的内置函数)

在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。1.计算字符串的长度-len()函数str1='我爱py...

如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步

假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将...

Python入门知识点总结,Python三大数据类型、数据结构、控制流

Python基础的重要性不言而喻,是每一个入门Python学习者所必备的知识点,作为Python入门,这部分知识点显得很庞杂,内容分支很多,大部分同学在刚刚学习时一头雾水。...