如何从 Sentinel URL 创建 Redis Python 客户端?

5

我有一个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那样的方法。
我们必须提供主机名和端口号。在我的情况下,主节点将是这三者中的任何一个。
2个回答

12

请查看redis-py代码库readme.md,链接为https://github.com/andymccurdy/redis-py/blob/master/README.rst#sentinel-support

就像这样:

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_for查询适当的主机进行连接。只有这样,如果主节点宕机,您的客户端才会被重定向到新的主节点。
在上面的代码中,master-name应该在sentinel.conf中指定
格式如下: sentinel monitor <master-group-name> <ip> <port> <quorum> 例如: sentinel monitor mymaster 127.0.0.1 6379 2

如果sentinel配置中的主节点名称根据主节点更改而更改,该怎么办?云中的一些redis服务在sentinel配置中包含主节点的IP(例如sentinel monitor master-127-0-0-1 127.0.0.1 6379 2),是否有适当的处理方式? - buxizhizhoum
按照以下步骤,当我调用 master.keys() 时,它会抛出:未知命令 'SENTINEL' - DennisLi
1
我应该每次想要读写 Redis 时都调用 master_for()(和 slave_for())吗?还是在程序开始时调用这些函数并重复使用返回的对象可以呢? - Oleg Yablokov

10

如果您的设置需要身份验证密码,请按以下步骤连接Python Redis客户端

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")

如果您没有设置密码,当然可以删除sentinel_kwargs={'password': YOUR_REDIS_PASSWORD}以及redis_client实例中的password属性。

如果设置失败,则可能会遇到MasterNotFoundError(如果sentinal发现失败)或AuthenticationError(如果未传递正确的密码或在正确的位置传递密码参数)。


如果您在Kubernetes上部署Redis集群,则可以通过部署YAML中的sentinel.masterSet变量找到/设置主节点名称。 - SARA E
我遇到了 redis.exceptions.ResponseError: AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct? 的问题。从 Sentinel() 中移除 sentinel_kwargs 可以解决这个问题(不知道为什么)。 - hafiz031
嗨@hafiz031,是的,这个配置只有在您设置了密码时才需要。如果您没有密码,请确实在不带kwargs的情况下调用sentinel! - SARA E
嗨,最近我遇到了一个问题,这个实现无法自动更改主服务器。我得到了以下错误信息:redis.exceptions.ReadOnlyError: You can't write against a read only replica. 但是当我在程序中将更改后的主服务器硬编码到 Sentinel() 的第一个位置时,它又可以正常工作了。 - hafiz031
我们需要在集群外访问Redis集群,因此对于IP地址,我们可以使用Pod的固定IP地址吗?或者我们可以使用Ingress(k8s)或Route(OpenShift)来代替吗? - CYC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接