0

我正在针对 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 不应该使用上述配置,因为 master 的主机名不会改变。

但是,使用上述配置,我会遇到问题。我会有效地从三节点集群转到两节点集群,直到有人干预(或编写了一些英雄代码。)

为了明确我的观点..在失败之前..

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)更好的主意?

任何和所有的建议表示赞赏。

4

1 回答 1

0

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

于 2015-07-16T16:35:08.723 回答