【问题标题】:How to initialize Redis client to write to master and read from slaves如何初始化 Redis 客户端以写入主服务器并从从服务器读取
【发布时间】:2017-05-01 13:14:49
【问题描述】:

假设我有一个复制的主从 Redis 设置,我如何从客户端库实际访问它?大概我需要每个主机都有一个客户端实例,并且我需要决定要使用哪个来编写和读取,例如:

master = redis.Redis(master_host, port)
clients = [redis.Redis(host, port) for host in slave_hosts]

master.set('key', 'value')
client = random.choice(clients)
client.get('other-key')

我在想图书馆里应该有一些魔法,我可以提供一个主机列表来使这种路由自动进行,但找不到它。

我还研究了 redis-cluster 和 redis-sentinel,它们都从谈论当奴隶成为主人时的自动故障转移开始,我不确定这是我需要的。我需要的是一个一致的主人,我可以承受失去一段时间(我可以在队列中保持更新)。

【问题讨论】:

    标签: python redis replication


    【解决方案1】:

    您是否故意拆分读取和写入,并且这样做是因为您已经知道您将压倒 Redis 实例?如果没有,不要担心在服务器之间拆分 r/w。使用客户端的 Sentinel 作为查找来查看哪个节点是主节点并连接到它以执行所有读取和写入操作。

    您最终必须拆分读取您的代码的人将需要编写这样的代码,以便您为每个读取从站建立连接并且只向其发送读取。您需要检测故障转移以重新分配您的 r/w 拆分。

    现在,如果您有一个单独的只读进程,您可以让它查询哨兵以代替 master会失去您的访问权限。

    You Aint Gonna Need It (YAGNI) 是一个很好的原则,可以避免过早的优化。单个 Redis 实例可以非常快,并且不会因您在传统 SQL 数据存储中发现的高度复杂的查询而遭受相同的性能下降。因此,我建议您使用标准设置运行缺少的数据,您只需在哨兵中查询当前主服务器并使用它返回的数据。

    【讨论】:

    • 不,我不是在尝试优化(在我的情况下负载很可笑),我实际上希望读取以查找任何可用节点。问题是,我是否必须在我的代码中实现遍历主机列表,或者在某些库中是否有一个方便的调用,例如 .read_from_any()
    • 到目前为止,你必须自己做。
    • ... 或者可能让 Sentinel 为我进行自动故障转移。看起来设置它比在我的代码中保留这个愚蠢的for循环要简单:-)
    【解决方案2】:

    Sentinel 可以做到这一点:

    您还可以从 Sentinel 实例创建 Redis 客户端连接。您可以连接到主机(用于写入操作)或从机(用于只读操作)。

    >>> master = sentinel.master_for('mymaster', socket_timeout=0.1)
    >>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
    >>> master.set('foo', 'bar')
    >>> slave.get('foo')
    'bar'
    

    阅读更多Redis python client

    我也在使用 Redis。就我而言,我有一个包装类,例如:

    class RedisConnection:
        def __init__(self, master_host, slave_host):
            self.__master = redis.Redis...
            self.__slave == redis.Redis...
    
        def write_xxx(self, value):
            self.__master.set(...)
    
    
        def read_xxx(self):
            self.__slave.get(...)
    

    【讨论】:

    • 一个_ 通常就足够了;)
    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2022-07-02
    • 2016-03-18
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多