2016-12-02 79 views
0

要订阅Sentinel故障转移,通道的名称是什么,以及如何检测我需要刷新订阅功能中的主控?如何在Sentinel和redis-py中使用Redis时故障切换到新主节点?

我有一个使用Redis Sentinel进行高可用性和故障转移的多节点Redis设置。

我需要将Pub/Sub设置为Redis来检测Redis Master何时失败并且系统选择了新的Master。

_sentinel = redis.sentinel.Sentinel([(app.config["REDIS_HOSTNAME"],app.config["REDIS_SENTINEL_PORT"])]) 
_master = _sentinel.master_for(app.config["REDIS_SERVICE_NAME"]) 

def _sentinel_message_handler(message): 
    #TODO how do I detect that there is a new Redis Master? 

_pubsub = _master.pubsub() 
_pubsub.subscribe(**{app.config["TODO"]:_sentinel_message_handler}) 
+1

频道列表可以在这里找到:https://redis.io/topics/sentinel#pubsub-messages – davissp14

+0

我在这里看到的一个问题是, REDIS_HOSTNAME应该通过一连串的Sentinel主机名连续尝试,直到连接完成。这样可以防止启动时因一个哨兵节点关闭而崩溃。 – 0111001101110000

回答

1

要实现这一点,您将需要订阅哨兵,而不是主节点。您正在寻找的频道是"+switch-master"。 Sentinel文档指出该通道为“不带+”的"switch-master",但从3.2.4开始,包含了+。

Redis Sentinel Pub/Sub Message Docs

你应该能够引用Redis的-PY文档的其余部分。 Redis-py Docs


UPDATE

你也可以考虑使用client-reconfig-script设置。

当主人改变了,因为故障切换脚本可以在 为了执行应用程序特定的任务,以通知 配置已更改,主是在不同的地址的客户端调用的。

http://download.redis.io/redis-stable/sentinel.conf

希望帮助

+0

哨兵对象没有pubsub方法。只有主人。我同意这看起来很奇怪,因为我希望故障切换能够正常工作,即使拔下了主控也是如此。我是否需要为每个奴隶以及主人找到所有奴隶和pubsub? – 0111001101110000

+0

那么主要的问题是故障转移事件不会发布到Redis节点,只有Sentinels。您在Redis pub/sub中唯一会看到的是“__sentinel __:hello”事件。 – davissp14

+1

我猜你想要听故障转移,以便快速重新配置客户端?如果哨兵pub/sub不可行,则有一个想法是使用:https://github.com/andymccurdy/redis-py/blob/master/redis/client.py#L414作为您的真相来源。虽然不理想。 – davissp14