1

我有一个针对 MariaDB Galera 集群运行的 Laravel (Lumen 5.2) 项目。运行应用程序时,它似乎工作得很好。但是当我运行 PHPUnit 测试时,它们随机失败。

问题是我填充了数据库,然后尝试获取数据(id)以使用外键填充其他表。但是当尝试立即获取数据时,数据为空。

Laravel 数据库连接与 READ 用户和 WRITE 用户一起使用。(Laravel 在插入或读取时会自动使用正确的那个)。我认为这就是问题所在。当我只使用 WRITE 用户时,测试工作得很好。

4

1 回答 1

3
SET SESSION wsrep_sync_wait = 1;

SELECT将保证写入已经赶上之前。

虽然 Galera 是“同步的”,但并不完全是。保证将写入发送到所有其他节点,并且它们将在那里工作。但是,在“关键”读取的情况下,aSELECT可能会太快到达接收节点而无法看到写入。上面的设置解决了这个问题。

现在,让我们真正了解您应该如何实现,例如,一个带有 Galera 的网站。

  • 在实际情况下,例如在事务中,对同一个节点执行所有命令。对此没有任何处罚。 但是,在COMMIT.
  • 当不实用时——比如从一个新的 HTTP 连接开始一个新的网页——使用它SET

SELECT虽然等待复制可能会有轻微的延迟,但延迟通常非常接近于零。我建议您的测试实际上是压力测试,会欺骗性地说等待时间很高。也就是说,基准测试通常旨在找到“最差”,而不是“典型”。

写入和失败之间有多少延迟SELECT?也许只有 1ms。“用户”发布“博客”的速度有多快,然后到达下一页并发现它“丢失”?可能超过 100 毫秒。

您的压力测试发现了对 的需求SET而不是Galera 已“损坏”。

更多加莱拉注意事项

于 2016-04-22T21:54:54.817 回答