codis迁移槽位遇到value过大的数据导致redis进程堵塞问题
admin
2023-05-29 01:01:27
0

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

问题背景:

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

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

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

而问题发生时此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日志,问题如下:

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

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

从日志可以看出迁移过程中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进程

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

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

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

从日志中可以看出槽位状态为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过的的keylist导致

 

解决方案:

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

 

 

遗留问题:

问题描述:

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

解决方法:

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

举例说明:

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

 

 


相关内容

热门资讯

与郑丽文同台仅几分钟,李四川解... 国民党籍新北市长参选人李四川21日赴新北参加“力挺李四川团结大会”与国民党主席郑丽文仅同台寥寥数分钟...
AI研发迈向团队作战,国内首个... 人工智能正在各领域研发环节实现颠覆性变革。今后,AI将不再是程序员的“副驾驶”,还可能是企业研发团队...
东莞智数集团与华为签署“鸿蒙之... 5月20日,东莞市人工智能与数字经济集团有限公司(以下简称“智数集团”)与华为技术有限公司(以下简称...
刚刚,谢赛宁团队放出第二代表征... 来源:市场资讯 (来源:机器之心Pro) 编辑|Panda AI 图像生成通常遵循「能力越强、代价...
山寨学术会议被打假后,仍有高校... 澎湃新闻记者 钟煜豪近日,所谓的“第十二届人文学科和社会科学研究国际学术会议(ICHSSR 2026...
以后用AI就像交话费?三大运营... 当前,随着人工智能技术快速迭代,智能体、大模型应用蓬勃发展,我国词元调用量呈爆发式增长。近期,中国移...
中国团队提出AccLock方案... 5 月 21 日消息,来自中国苏州大学、北京大学的科研团队于 5 月 12 日在 arxiv 上发表...
重新定义信号与频谱分析仪:罗德... 全球测试测量专家罗德与施瓦茨(以下简称“R&S”)宣布,将于6月23日举办 “新一代多通道信号与频谱...
美媒:伊朗军方重建速度远超预期 据美国有线电视新闻网(CNN)报道,两名熟悉美国情报评估的消息人士透露,伊朗已在今年4月初开始的六周...
泰国取消60天免签,是想防着谁... 【文/观察者网专栏作者 岳汉】最近,泰国缩短免签这个事,在国内还引起了挺大关注。很多中国朋友都不解:...