【问题标题】:How to create redis python client from sentinel url?如何从哨兵网址创建redis python客户端?
【发布时间】:2018-02-03 18:26:41
【问题描述】:

我的网址是

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.1192.168.10.2192.168.10.3 上运行。一个节点是主节点,其他节点是从节点。如果 master 宕机了,其他节点代替 master。

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

我们必须提供主机名和端口。就我而言,master 将是这 3 个中的任何人。

【问题讨论】:

    标签: python redis sentinel redis-py


    【解决方案1】:

    检查 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集群构建哨兵,你不需要直接连接redis服务器。如上所述,首先连接到 Sentinel,然后使用master_for 查询要连接的适当主机。只有这样,如果 master 宕机了,你的客户端才能被引导到新的 master。

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

    sentinel monitor <master-group-name> <ip> <port> <quorum>

    像这样:

    sentinel monitor mymaster 127.0.0.1 6379 2

    【讨论】:

    • 如果sentinel conf中的master名随着master节点的变化而变化怎么办?云中的一些redis服务在sentinel conf中包含master节点的ip(如sentinel monitor master-127-0-0-1 127.0.0.1 6379 2),有没有合适的方法来处理这个?
    • 您好,按照步骤操作,当我打电话给master.keys() 时,它提出了:unknown command 'SENTINEL'
    • 我是否应该在每次想读取或写入 Redis 时调用 master_for()(和 slave_for()),还是可以在程序开始时调用这些函数并重用返回的对象?
    【解决方案2】:

    要连接python redis client,如果您有需要验证的密码设置,您可以按照以下步骤操作:

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

    当然如果你没有设置密码,你可以在你的redis_client实例中去掉sentinel_kwargs={'password': YOUR_REDIS_PASSWORD}password属性。

    如果设置失败,您可能会遇到 MasterNotFoundError(如果发送发现失败)或 AuthenticationError,如果您没有在正确的位置传递正确的密码或密码参数

    【讨论】:

    • 如果您在 Kubernetes 上部署 redis 集群,则通过部署 yaml 中的 sentinel.masterSet 变量找到/设置主名称
    • 我得到了redis.exceptions.ResponseError: AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?Sentinel() 中删除sentinel_kwargs 解决了这个问题(idk。为什么)。
    • hi @hafiz031 是的,此配置仅在您设置密码的情况下。如果您确实没有密码,请在没有 kwargs 的情况下调用哨兵!
    • 嗨,最近我遇到了这个实现的问题。它不能自动改变主人。我得到了:redis.exceptions.ReadOnlyError: You can't write against a read only replica. 但是当我在程序中Sentinel() 内的第一个位置硬编码更改后的主控时,它又工作了。
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多