【问题标题】:Predis + Elasticache automated failover configPredis + Elasticache 自动故障转移配置
【发布时间】:2015-10-05 00:14:18
【问题描述】:

我正在针对 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) 更好的主意?

我们不胜感激。

【问题讨论】:

  • 您确定在自动故障转移后您将保留 2 个节点吗?因为我知道将创建一个新的只读副本来代替被提升为主副本的副本。如果您使用 URL(而不是 IP),一切都将由 AWS 在 DNS 级别处理。你可以检查这个:aws.amazon.com/blogs/aws/elasticache-redis-multi-az
  • 谢谢你,我会调查的。
  • Liviu,你是对的。如果您通过其“读取端点”引用只读副本,这一切都按照您的描述进行。

标签: php redis predis


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 2011-06-24
    • 2018-03-15
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多