Predis + Elasticache自动故障转移配置

时间:2015-07-15 19:16:16

标签: php redis predis

我正在针对AWS上的Elasticache集群运行Predis,该集群具有写入主控和两次读取 副本。 Predis配置为主/从复制大致如下..

self::$client = new Predis\Client(
[
    'tcp://' . REDIS_MASTER  . '?alias=master',
    'tcp://' . REDIS_SLAVE01 . '?alias=slave-01',
    'tcp://' . REDIS_SLAVE02 . '?alias=slave-02'
],
['replication' => true]
);

我正在配置自动故障转移恢复。 Elasticache通过提升读取从站并更新主节点主机名的dns记录来支持主节点故障恢复。在发生故障的情况下,Predis应该更加明智地使用上述配置,因为主服务器的主机名不会改变。

但是,使用上面的配置,我会遇到问题。我会有效地从三节点集群转到双节点集群,直到人为干预(或者创作了一些英雄代码。)

让我的观点清楚...... 失败之前..

REDIS_MASTER -> node1
REDIS_SLAVE01 -> node2
REDIS_SLAVE01 -> node3

失败后......(node1失败,node2升级)

REDIS_MASTER -> node2
REDIS_SLAVE01 -> node2
REDIS_SLAVE01 -> node3

这在有限的时间内没问题,但理想情况下我希望这可以自行解决。

恢复完成后,elasticache会将node1恢复为只读副本。我希望它一旦可用就开始作为只读副本工作。

我想我可以通过配置Predis来解决这个问题。

self::$client = new Predis\Client(
[
    'tcp://' . REDIS_MASTER  . '?alias=master',
    'tcp://' . REDIS_SLAVE01 . '?alias=slave-01',
    'tcp://' . REDIS_SLAVE02 . '?alias=slave-02',
    'tcp://' . REDIS_SLAVE03 . '?alias=slave-03'
],
['replication' => true]
);

...其中REDIS_SLAVE03指向与REDIS_MASTER相同的基础实例,但是通过在失败事件中不会更改的主机名。实际上,所有节点始终表现为读取从属,并且“指针”指向“#”。掌握写作是在没有Predis知识的情况下转移的。

所以有几个问题......

1)当奴隶变得没有反应时,Predis的行为是什么?它是否会忽略该配置并将读取路由到其他响应的从属服务器?

2)主redis实例会获得双倍的读取操作吗? (可能答案是肯定的)

3)这种方法是否存在我缺失的缺陷?

4)更好的主意?

赞赏任何建议。

1 个答案:

答案 0 :(得分:0)

这整个想法都存在缺陷。通过读取端点引用副本可以解决问题,因为aws将在恢复过程中更新这些名称的dns。