千家信息网

codis迁移槽位遇到value过大的数据导致redis进程堵塞问题

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,codis迁移槽位遇到value过大的数据导致redis进程堵塞问题问题背景:2016-11-08 下午,咨询codis开始迁移槽位。迁移过程中dba发现group1中redis无法连接,proxy进
千家信息网最后更新 2026年10月31日codis迁移槽位遇到value过大的数据导致redis进程堵塞问题

codis迁移槽位遇到value过大的数据导致redis进程堵塞问题

问题背景:

2016-11-08 下午,咨询codis开始迁移槽位。迁移过程中dba发现group1中redis无法连接,proxy进程异常退出且无法重启。

当redis可以正常连接时dashboard展示为:

而问题发生时此redis是不可连接的,Keys无法显示正确显示,只显示Nan。

proxy进程异常退出会收到微信报警:

[('NoneType' object has no attribute '__getitem__')10.20.4.1:19153(KDDI)](codis_proxy) [r_connection],threshold: 1,current:0,last:1 minutes.,info:failed [2016-11-08 15:32:35]

处理方案:

1.将备用proxy 服务器加入域名,待生效后移除异常proxy的域名。

2.排查dashboard日志,问题如下:

从日志可以看出迁移过程中slot_359迁移完成,solt_360迁移过程中报错,报错显示redis读取超时,持续一段时间后迁移任务报错([info] migration start: {SlotId:360 NewGroupId:4 Delay:1 CreateAt:1478588644 Percent:0 Status:error Id:0000003317})

3.手动取消迁移任务

登录zookeeper:/usr/local/xywy/zookeeper-3.4.6/bin/zkCli.sh -server 10.20.4.1:2181

rmr /zk/codis/db_techzixun/migrate_tasks/0000003317

4.重启proxy进程

如果无法重启,那么说明取消迁移任务时可能影响了槽位的状态。排查日志可以看到报错为:

从日志中可以看出槽位状态为pre_migrate。调整为online即可。

调整方法:

登录zookeeper后

查看对应槽位的值:get /zk/codis/db_techzixun/slots/slot_392

修改status为online:set /zk/codis/db_techzixun/slots/slot_392 {"product_name":"techzixun","id":392,"group_id":1,"state":{"status":"online","migrate_status":{"from":-1,"to":-1},"last_op_ts":"0"}}

所有槽位状态都为online时即可重启proxy

5.重启proxy后将其加入域名,此时故障已恢复

后续排查:

以上步骤为处理故障的操作,但迁移为什么出错,想要究其原因还需进一步排查。

查看group1中报错redis的日志,问题如下:

[113248] 08 Nov 15:16:20.764 # slotsmgrt: writing to target 10.20.2.4:6916, error 'accept: Resource temporarily unavailable', nkeys = 1, onekey = 'jbzt_nk_20219_arclist', cmd.len = 1418791367, pos = 65536, towrite = 65536

使用redis命令扫描大key:

redis-cli -p xxxx -h xxxx --bigkeys

发现'jbzt_nk_20219_arclist'这个list容量达到3G左右

由此可见问题的原因是迁移value过的的key或list导致

解决方案:

该问题为codis程序问题,在codis中暂时无法使用技术手段解决。只能对这种value过大的key或list进行压缩或者选择其他使用方式。

遗留问题:

问题描述:

codis迁移槽位过程中出错时会导致槽位状态一直为迁移中,槽位状态为迁移中proxy不能上线,所以手动将槽位状态修改为上线。但此时未迁移成功的key路由信息还记录为迁移前group,而迁移前槽位的group信息已更新为迁移后的group,这就导致了查找未成功迁移的key时会无法连接的错误。

解决方法:

将无法连接的key所在槽位迁移至原所属group即可。查找key时可以通过proxy.log观察确认路由到哪个ip端口下从而确定原所属group,利用python下binascii.crc32算法 binascii.crc32('key_name')24 计算key所在槽位。

举例说明:

codis中有2个group。分别为group1,group2。group1中100槽位中有1,2,3,4,5,6。6个key,group2中没有key,此时将group1中100槽位迁移至group2中,迁移过程中1、2、3key已成功迁移4key由于value过大导致迁移出错,此时100槽位所属group2,槽位状态为迁移中,手动删除迁移任务将100槽位状态修改为上线后,连接proxy查找4、5、6key则出现无法连接错误。原因就是4、5、6key的的路由信息还是group1中的100槽位,但此时100槽位已经不在group1下了,那么将100槽位迁移回group1下即可解决。


问题 状态 日志 过程 进程 任务 成功 信息 原因 域名 所属 手动 路由 中报 所在 故障 方案 方法 错误 处理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南云网互联网络科技有限公司 互联网科技工作委员会毛军 科技股互联网 港股互联网科技股 互联网科技的发展 平安科技 互联网 安徽鑫晟辉互联网科技 华中科技大学互联网 深圳天众互联网科技公司 阿里巴巴算科技企业还是互联网 来此购互联网科技有限公司 世界互联网科技公司市值排名 洛阳昕诺飞互联网科技有限公司 互联网在线教育科技创业 高科技互联网发展前景如何 互联网科技大赛获奖感言 北京市互联网新科技 梅州GM互联网络科技有限公司 杭州披云加互联网科技有限公司 厦门江牛科技互联网 互联网科技工作委员会主任 高科技与互联网 天扬科技互联网广告 中国最先进互联网科技公司 西藏七维空间互联网科技有限公司 佛山市拉法互联网科技有限公司 徐州市互联网科技有限公司 无锡工业互联网科技有限公司 下一代互联网重大应用科技园 瑞安市蟠桃会互联网科技有限公司
0