我正在针对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)更好的主意?
赞赏任何建议。
答案 0 :(得分:0)
这整个想法都存在缺陷。通过读取端点引用副本可以解决问题,因为aws将在恢复过程中更新这些名称的dns。