redis 集群连接成功执行命令报错: MOVED XXXX 192.168.50.177:8003 问题解决

举报
山河已无恙 发表于 2021/12/03 22:20:31 2021/12/03
【摘要】 redis 集群连接成功执行命令报错: MOVED XXXX IP:端口 问题解决
D:\haojingkeji\flask-vue-crud\redisclear>python redisclear.py
redis连接成功 Redis<ConnectionPool<Connection<host=192.168.50.162,port=8003,db=0>>>

MOVED 15160 192.168.50.177:8003

问题原因:

Redis集群的问题:我需要重新设置redis集群某个键的值,没有机器的登录权限,写不了shell。然后用python写了一个脚本处理,报这个错。


节点会对命令请求进行分析和key的slot计算,并且会查找这个命令所要处理的键所在的槽。如果要查找的哈希槽正好就由接收到命令的节点负责处理, 那么节点就直接执行这个命令。

如果所查找的槽不是由该节点处理的话, 节点将查看自身内部所保存的哈希槽到节点 ID 的映射记录, 并向客户端回复一个 MOVED 错误。上面的错误信息包含键 x 所属的哈希槽15160, 以及负责处理这个槽的节点的 IP 和端口号 192.168.50.177:8003


解决办法:

直接用返回的MOVED 错误里的IP和端口连接就可以了,当然也可以捕获异常的方式处理。

 

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# pip install redis
# Python 3.9.0
'''
@File    :   redisclear.py
@Time    :   2021/12/1 10:32:56
@Author  :   Li Ruilong
@Version :   1.0
@Contact :   1224965096@qq.com
@Desc    :   redis 集群指定键值clear
'''

# here put the import lib
import redis

ip = '192.168.50.177'
password = '*********'
port = 8003


conn=redis.Redis(host=ip,password=password,port=port,decode_responses=True)

print("redis连接成功",conn,"\n")

def ex(conn):
     print("当前的redis值为:",conn.get('GROUP_CIRCUIT-3'),"\n")
     conn.set('GROUP_CIRCUIT-3',600)
     print("修改后redis值为:",conn.get('GROUP_CIRCUIT-3'),"\n")


if __name__ == '__main__':

    try:
        rs = conn.get('GROUP_CIRCUIT-3')
    except Exception as  e:
        print(e)
        c= str(e).split()
        print("集群节点问题,从新连接到输出节点操作","\n")
        ip = str(c[2]).split(':')[0]
        port = str(c[2]).split(':')[1]
        print(ip,port,"\n")
        conn=redis.Redis(host=ip,password=password,port=int(port),decode_responses=True)
        rs = conn.get('GROUP_CIRCUIT-3') 
        ex(conn)
    else:
        ex(conn)

 


虽然我们用Node ID来标识集群中的节点, 但是为了让客户端的转向操作尽可能地简单, 节点在 MOVED 错误中直接返回目标节点的 IP 和端口号, 而不是目标节点的 ID 。客户端应该记录槽15495由节点 192.168.50.177:8003负责处理“这一信息, 这样当再次有命令需要对槽15495执行时, 客户端就可以加快寻找正确节点的速度。这样,当集群处于稳定状态时,所有客户端最终都会保存有一个哈希槽至节点的映射记录,使得集群非常高效: 客户端可以直接向正确的节点发送命令请求, 无须转向、代理或者其他任何可能发生单点故障(single point failure)的实体(entiy)。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。