如何从sentinel url创建redis python客户端?

如何从sentinel url创建redis python客户端?,python,redis,sentinel,redis-py,Python,Redis,Sentinel,Redis Py,我有一个url作为 BROKER_URL = 'sentinel://192.168.10.1:26379/0;sentinel://192.168.10.2:26379/0;sentinel://192.168.10.3:26379/0' 在这种情况下,redis在192.168.10.1、192.168.10.2和192.168.10.3上运行。一个节点是主节点,其他节点是从节点。若主节点发生故障,则主节点将发生其他节点 我检查了redis客户端,但它没有方法,我们可以像我给出的那样提供u

我有一个url作为

BROKER_URL = 'sentinel://192.168.10.1:26379/0;sentinel://192.168.10.2:26379/0;sentinel://192.168.10.3:26379/0'
在这种情况下,redis在
192.168.10.1
192.168.10.2
192.168.10.3
上运行。一个节点是主节点,其他节点是从节点。若主节点发生故障,则主节点将发生其他节点

我检查了redis客户端,但它没有方法,我们可以像我给出的那样提供url


我们必须提供主机名和端口。在我的情况下,master将是这3个版本中的任何一个。

检查redis py codebase readme.md

像这样:

from redis.sentinel import Sentinel
sentinel = Sentinel([('192.168.10.1', 26379), ('192.168.10.2',26379), ('192.168.10.3',26379)], socket_timeout=0.1)

master = sentinel.master_for('master-name', socket_timeout=0.1)
主对象和从对象是普通的StrictRedis实例,它们的连接池绑定到Sentinel实例。当Sentinel支持的客户端尝试建立连接时,它首先查询Sentinel服务器以确定要连接到的适当主机。如果未找到服务器,则会引发MasterNotFoundError或SlaveNotFoundError

实际情况是,如果为redis集群构建Sentinel,则不需要直接连接redis服务器。如上所述,首先连接到Sentinel,然后使用
master\u for
查询要连接到的适当主机。只有这样,如果主机关闭,您的客户机才能被引导到新主机

在上面的代码中,您应该在sentinel.conf中指定
master name

sentinel监视器

像这样:


sentinel monitor mymaster 127.0.0.1 6379 2

要完成前面的回答,如果您需要使用密码进行身份验证设置,请执行以下操作:

from redis.sentinel import Sentinel
sentinel = Sentinel([('192.168.10.1', 26379),
                     ('192.168.10.2',26379),
                     ('192.168.10.3',26379)],
                   sentinel_kwargs={'password': YOUR_REDIS_PASSWORD})
# you will need to handle yourself the connection to pass again the password
# and avoid AuthenticationError at redis queries
host, port = sentinel.discover_master(YOUR_REDIS_DB_MASTER)
redis_client = redis.StrictRedis(
            host=host,
            port=port,
            password= YOUR_REDIS_PASSWORD
        )
您可以使用一个简单的查询直接测试它,如

redis_client.exists("mykey")

如果安装失败,您可能会遇到MasterNotFoundError(如果sentinal discovery失败)或AuthenticationError(如果您没有在正确的位置传递正确的密码或密码参数)

如果sentinel conf中的主机名根据主节点发生更改,情况如何?云中的某些redis服务包含sentinel conf中主节点的ip(如sentinel monitor master-127-0-0-1 127.0.0.1 6379 2),是否有适当的方法来处理此问题?您好,当我调用
master.keys()时,请遵循以下步骤
它引发:
未知命令“SENTINEL”
如果在Kubernetes上部署redis群集,则通过部署yaml中的SENTINEL.masterSet变量找到/设置主名称